Làm thế nào các giá trị 'NA' được xử lý trong glm trong R


19

Tôi có một bảng dữ liệu T1, chứa gần một nghìn biến (V1) và khoảng 200 triệu điểm dữ liệu. Dữ liệu rất thưa thớt và hầu hết các mục là NA. Mỗi datapoint có một cặp id và ngày duy nhất để phân biệt với nhau.

Tôi có một bảng khác T2, chứa một tập hợp các biến (V2) riêng biệt. Bảng này cũng có cặp id và ngày xác định duy nhất các mục trong T2.

Chúng tôi nghi ngờ rằng dữ liệu trong T1 có thể được sử dụng để dự đoán giá trị của các biến trong T2.

Để chứng minh điều này, tôi nghĩ sẽ áp dụng mô hình 'glm' trong R và kiểm tra xem chúng ta có thực sự tìm thấy một số biến trong T2 phụ thuộc vào các biến trong T1 không.

Đối với mỗi biến trong T2, tôi bắt đầu rút tất cả dữ liệu trong T1 có cùng cặp id và ngày dẫn đến các điểm dữ liệu ~ 50K nhỏ hơn nhiều đối với một số biến kiểm tra.

Các vấn đề mà tôi đang phải đối mặt với việc áp dụng glm như sau.

  1. Trong một số trường hợp, nó hiển thị cho tôi một lỗi 'không tìm thấy sự phù hợp' và cảnh báo 'glm.fit: thuật toán không hội tụ'. Tôi không chắc tại sao nó được hiển thị?

  2. Làm thế nào các NA được điều trị trong glm? Nó có xóa tất cả các bản ghi liên quan đến 'NA' trước và sau đó thực hiện khớp không?

  3. Đây có phải là một chiến lược tốt để loại bỏ tất cả các NA trước và sau đó gọi 'glm'. Tôi sợ rằng điều này có thể làm giảm đáng kể các điểm dữ liệu vì hầu hết chúng là NA.

  4. Phương pháp nào được sử dụng để tính các hệ số. Tôi không thể tìm thấy bất kỳ trang web hoặc giấy hoặc cuốn sách nào thảo luận về cách tính đầu ra.

Tôi đã thử nghiệm glm có và không có 'NA' và tìm thấy câu trả lời khác nhau về những điểm mà NA được xem xét trong khi khớp dữ liệu:

Ví dụ 1:

> tmpData
  x1 x2 x3        Y
1  1  1  1        3
2  1  0  4        5
3  1  2  3        6
4  0  3  1        4

Call:  glm(formula = as.formula(paste(dep, " ~ ", paste(xn, collapse = "+"))), 
    na.action = na.exclude)

Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  
                        5.551e-16                          1.000e+00                          1.000e+00  
as.numeric(unlist(tmpData["x3"]))  
                        1.000e+00  

Degrees of Freedom: 3 Total (i.e. Null);  0 Residual
Null Deviance:      5 
Residual Deviance: 9.861e-31    AIC: -260.6 

Ví dụ 2:

'x1'    'x2'    'x3'    'Y'
100000  1   NA  2
1   1   1   3
1   NA  -1124   2
1   0   4   5
1   2   3   6
0   3   1   4



Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  as.numeric(unlist(tmpData["x3"]))  
                       -2.3749044                         -0.0000625                          0.6249899                          1.8749937  

Degrees of Freedom: 5 Total (i.e. Null);  2 Residual
Null Deviance:      13.33 
Residual Deviance: 1.875    AIC: 20.05 

Câu trả lời:


27

Xử lý NA: Bạn có thể kiểm soát cách glm xử lý dữ liệu bị thiếu. glm () có một đối số na.actionchỉ ra hàm nào trong số các hàm chung sau nên được sử dụng bởi glm để xử lý NA trong dữ liệu:

  • na.omitna.exclude: các quan sát được loại bỏ nếu chúng chứa bất kỳ giá trị thiếu nào; nếu na.exclude được sử dụng, một số chức năng sẽ đưa phần dư và dự đoán về độ dài chính xác bằng cách chèn NA cho các trường hợp bị bỏ qua.
  • na.pass: giữ tất cả dữ liệu, bao gồm cả NA
  • na.fail: chỉ trả về đối tượng nếu nó không chứa các giá trị bị thiếu

Nếu bạn không đặt na.action, glm () sẽ kiểm tra các tùy chọn toàn cầu của R để xem liệu mặc định có được đặt ở đó không. Bạn có thể truy cập các tùy chọn của mình bằng getOption("na.action")hoặc options("na.action")và bạn có thể đặt tùy chọn đó, ví dụ options(na.action = "na.omit") , từ đầu ra R bạn cung cấp trong ví dụ 1, có vẻ như bạn đang đặt na.action = na.omit. Vì vậy, có, trong trường hợp đó ít nhất, bạn đang loại bỏ tất cả các trường hợp / hàng bằng NA trước khi lắp. Hơn nữa, tôi khá chắc chắn na.action = na.passsẽ khiến glm () thất bại khi dữ liệu có NA (thử nó).

Lỗi: glm () đang sử dụng quy trình lặp (bình phương tối thiểu có trọng số lặp; IWLS) để ước tính khả năng tối đa. Đôi khi bạn gặp lỗi vì nó sẽ chỉ trải qua một số lần lặp được xác định trước và nếu nó không phù hợp thì nó sẽ bỏ cuộc. Số này được điều khiển bởi maxit đối số, theo mặc định là maxit = 25. Bạn có thể thử đặt nó cao hơn, mặc dù vậy, điều này sẽ mất nhiều thời gian hơn. (Nếu bạn đặt, trace=TRUEnó sẽ hiển thị cho bạn kết quả của mỗi lần lặp.)

Các nguồn thông tin khác: Helpfile cho glm có thể truy cập được bằng ?glmhoặc help(glm)và giải thích phần lớn điều này. Hai tài nguyên hữu ích khác là:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.