Bagaimana nilai-nilai 'NA' diperlakukan dalam glm di R

19

Saya memiliki tabel data T1, yang berisi hampir seribu variabel (V1) dan sekitar 200 juta titik data. Data jarang dan sebagian besar entri adalah NA. Setiap titik data memiliki id unik dan pasangan tanggal untuk dibedakan dari yang lain.

Saya punya T2 tabel lain, yang berisi kumpulan variabel yang terpisah (V2). Tabel ini juga memiliki pasangan id dan tanggal yang secara unik mengidentifikasi entri di T2.

Kami menduga bahwa data dalam T1 dapat digunakan untuk memprediksi nilai variabel dalam T2.

Untuk membuktikan ini, saya berpikir untuk menerapkan model 'glm' di R dan memeriksa apakah kita benar-benar dapat menemukan beberapa variabel di T2 yang tergantung pada variabel di T1.

Untuk setiap variabel di T2, saya mulai mengeluarkan semua data di T1 yang memiliki pasangan id dan tanggal yang sama yang menghasilkan poin data yang jauh lebih kecil ~ 50K untuk beberapa variabel uji.

Masalah yang saya hadapi sekarang dengan penerapan glm adalah sebagai berikut.

  1. Dalam beberapa kasus, ini menunjukkan kepada saya kesalahan 'pas tidak ditemukan' dan peringatan 'glm.fit: algoritma tidak konvergen'. Saya tidak yakin mengapa ini ditampilkan?

  2. Bagaimana NAS diperlakukan dalam glm? Apakah ini menghapus semua catatan yang melibatkan 'NA' pertama dan kemudian melakukan pemasangan?

  3. Apakah ini strategi yang baik untuk menghapus semua NAS terlebih dahulu dan kemudian memanggil 'glm'. Saya khawatir hal ini dapat mengurangi datapoint secara signifikan karena kebanyakan dari mereka adalah NAS.

  4. Metode mana yang digunakan untuk menghitung koefisien. Saya tidak dapat menemukan situs web atau kertas atau buku yang membahas bagaimana output dihitung.

Saya menguji GLM dengan dan tanpa 'NAs' dan menemukan jawaban berbeda yang menunjukkan bahwa NAS dipertimbangkan saat memasang data:

Contoh 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 

Contoh 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 
pengguna1140126
sumber

Jawaban:

27

Penanganan NA: Anda dapat mengontrol bagaimana glm menangani data yang hilang. glm () memiliki argumen na.actionyang menunjukkan fungsi generik berikut mana yang harus digunakan oleh glm untuk menangani NA dalam data:

  • na.omitdan na.exclude: pengamatan dihapus jika mengandung nilai yang hilang; jika na.ceclude digunakan, beberapa fungsi akan mengisi residual dan prediksi dengan panjang yang benar dengan memasukkan NAs untuk kasus yang dihilangkan.
  • na.pass: simpan semua data, termasuk NAs
  • na.fail: mengembalikan objek hanya jika tidak mengandung nilai yang hilang

Jika Anda tidak menyetel na.action, glm () akan memeriksa opsi global R untuk melihat apakah default ditetapkan di sana. Anda dapat mengakses opsi dengan getOption("na.action")atau options("na.action")dan Anda dapat mengaturnya dengan, misalnya options(na.action = "na.omit") , dari output R yang Anda berikan dalam contoh 1, tampaknya Anda menyetel na.action = na.omit. Jadi, ya, setidaknya dalam contoh itu, Anda menghapus semua case / rows dengan NAS sebelum pemasangan. Selain itu, saya cukup yakin na.action = na.passakan menyebabkan glm () gagal ketika data memiliki NAs (coba).

Kesalahan: glm () menggunakan prosedur berulang (iterated leasted squares; IWLS) untuk membuat estimasi kemungkinan maksimum. Anda kadang-kadang mendapatkan kesalahan karena hanya akan melalui jumlah iterasi yang telah ditentukan dan, jika tidak cocok maka, itu menyerah. Angka ini dikendalikan oleh argumen maxit, yang secara default adalah maxit = 25. Anda dapat mencoba mengaturnya lebih tinggi, meskipun tentu saja, ini akan memakan waktu lebih lama. (Jika Anda mengaturnya trace=TRUEakan menunjukkan kepada Anda hasil dari setiap iterasi.)

Sumber informasi lain: File bantuan untuk glm dapat diakses dengan ?glmatau help(glm)dan menjelaskan sebagian besar dari ini. Dua sumber daya bermanfaat lainnya adalah:

MattBagg
sumber