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.
.
untuk mendapatkan formula yang disederhanakan dengan terms(y ~ . -x3, data=dt, simplify=TRUE)
tetapi anehnya masih tetap x3
dalam atribut variabel yang naiklm
neg.out=
mungkin terkait. Dari file bantuan S untuk terms
, di mana neg.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
panggilan model.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 menyebabkan x3
menjadi faktor level tunggal. model.matrix()
kemudian dipanggil mf
, bukan data asli, menghasilkan kesalahan yang kami amati.
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.