Saya mencoba menjalankan lm () hanya pada sebagian dari data saya, dan mengalami masalah.
dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data
lm( y ~ ., dt) # Use all x: Works
lm( y ~ ., dt[x3 == 'men']) # Use all x, limit to men: doesn't work (as expected)
Di atas tidak berfungsi karena dataset sekarang hanya memiliki laki-laki, dan oleh karena itu kami tidak dapat memasukkan x3, variabel gender, ke dalam model. TAPI...
lm( y ~ . -x3, dt[x3 == 'men']) # Exclude x3, limit to men: STILL doesn't work
lm( y ~ x1 + x2, dt[x3 == 'men']) # Exclude x3, with different notation: works great
Ini adalah masalah dengan notasi "tanda minus" dalam rumus? Tolong saran. Catatan: Tentu saja saya bisa melakukannya dengan cara yang berbeda; misalnya, saya bisa mengecualikan variabel sebelum memasukkannya ke lm (). Tapi saya mengajar kelas tentang hal ini, dan saya tidak ingin membingungkan para siswa, setelah mengatakan kepada mereka bahwa mereka dapat mengecualikan variabel menggunakan tanda minus dalam rumus.
model.matrix(y ~ . - x3, data = dt[x3 == "men"])
danmodel.matrix(y ~ x1 + x2, data = dt[x3 == "men"])
bekerja (lm
panggilanmodel.matrix
internal). Satu-satunya perbedaan antara kedua model matriks adalah"contrasts"
atribut (yang masih berisix3
) dan yang diambil kemudian dalamlm
rutinitas, kemungkinan menyebabkan kesalahan yang Anda lihat. Jadi perasaan saya adalah bahwa masalah ini berkaitan dengan bagaimanamodel.matrix
membuat dan menyimpan matriks desain ketika menghapus persyaratan..
untuk mendapatkan formula yang disederhanakan denganterms(y ~ . -x3, data=dt, simplify=TRUE)
tetapi anehnya masih tetapx3
dalam atribut variabel yang naiklm
neg.out=
mungkin terkait. Dari file bantuan S untukterms
, di mananeg.out=
diimplementasikan: flag mengendalikan perlakuan istilah yang masuk dengan tanda "-". Jika BENAR, syarat akan diperiksa untuk pembatalan dan jika tidak diabaikan. Jika SALAH, istilah negatif akan dipertahankan (dengan urutan negatif).lm
panggilanmodel.matrix
pada versi data yang dimodifikasi. Pada awal mula,lm
menyusun dan mengevaluasi berikut ekspresi:mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )
. Ini menyebabkanx3
menjadi faktor level tunggal.model.matrix()
kemudian dipanggilmf
, bukan data asli, menghasilkan kesalahan yang kami amati.Jawaban:
Kesalahan yang Anda dapatkan adalah karena x3 ada dalam model dengan hanya satu nilai =
"men"
(lihat komentar di bawah dari @Artem Sokolov)Salah satu cara untuk mengatasinya adalah dengan subset sebelumnya:
Atau Anda bisa melakukan keduanya dalam langkah yang sama:
sumber
-x3
dalam sebuah rumus tidak menyebabkan Andalm
berpikir bahwa Anda mencoba mengurangi kolom. Maksud "jangan gunakan x3 dalam model" dikomunikasikan dengan benar, tetapi masalahnya adalah bahwalm
panggilanmodel.frame( ..., drop.unused.levels=TRUE )
menyebabkanx3
menjadi faktor tingkat tunggal, yang mengarah ke masalah hilir dimodel.matrix()
.