Saya mencoba mendapatkan prediksi untuk pengamatan dari objek lme. Ini seharusnya cukup mudah. Namun, karena saya mendapatkan berbagai jenis kesalahan untuk uji coba yang berbeda, menurut saya saya kehilangan sesuatu. Model saya adalah sebagai berikut:
model <- lme(log(child_mortality) ~ as.factor(cluster)*time +
my.new.time.one.transition.low.and.middle + ttd +
maternal_educ+ log(IHME_id_gdppc) + hiv_prev-1,
merged0,na.action=na.omit,method="ML",weights=varPower(form=~time),
random= ~ time| country.x,
correlation=corAR1(form = ~ time),
control=lmeControl(msMaxIter = 200, msVerbose = TRUE))
Ini berjalan dengan baik, cocok dengan data dengan baik dan hasilnya masuk akal. Sekarang untuk mendapatkan prediksi, saya telah mencoba yang berikut ini:
test.pred <- data.frame(time=c(10,10,10,10),country.x=c("Poland","Brazil",
"Argentina","France"),
my.new.time.one.transition.low.and.middle=c(1,1,1,0),
ttd=c(0,0,0,0),maternal_educ=c(10,10,10,10),
IHME_id_gdppc=c(log(5000),log(8000),log(8000),log(15000)),
hiv_prev=c(.005,.005,.005,.005),
cluster=c("One Transition, Middle Income","One Transition,
Middle Income","One Transition, Middle Income","Democracy,
High Income"))
>
> predict(model,test.pred,level=0)
Error in X %*% fixef(object) : non-conformable arguments
Jika saya mengecualikan, katakanlah, Prancis, dan hanya menyertakan negara-negara di mana cluster = "OneTransition, Middle Income" maka saya mendapatkan kesalahan yang berbeda
# create a toy data set
test.pred0 <-
expand.grid(time=20:29,country.x=c("Poland","Brazil","Argentina"))
z0 <-as.data.frame(cbind(my.new.time.one.transition.low.and.middle =
c(0,0,0,0,0,0,1,2,3,4), ttd=c(0,0,0,0,0,0,1,0,0,0),
maternal_educ=seq(from=10.0, to=12.0, length.out=10),
IHME_id_gdppc=log(seq(from=5000, to=8000, length.out=10)),
hiv_prev=rep(.005,10),
cluster=rep("One Transition, Middle Income",10)))
z <- rbind(z0,z0,z0)
test.pred <- cbind(test.pred0,z)
# check
head(test.pred)
> time country.x my.new.time.one.transition.low.and.middle ttd
> maternal_educ IHME_id_gdppc hiv_prev
> 1 20 Poland 0 0
> 10 8.51719319141624 0.005
> 2 21 Poland 0 0
> 10.2222222222222 8.58173171255381 0.005
> 3 22 Poland 0 0
> 10.4444444444444 8.64235633437024 0.005
> 4 23 Poland 0 0
> 10.6666666666667 8.69951474821019 0.005
> 5 24 Poland 0 0
> 10.8888888888889 8.75358196948047 0.005
> 6 25 Poland 0 0
> 11.1111111111111 8.80487526386802 0.005
> cluster
> 1 One Transition, Middle Income
> 2 One Transition, Middle Income
> 3 One Transition, Middle Income
> 4 One Transition, Middle Income
> 5 One Transition, Middle Income
> 6 One Transition, Middle Income
# run the predictions
predict(model,test.pred,level=0)
> Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
> contrasts can be applied only to factors with 2 or more levels
Dalam contoh ini, masalahnya adalah karena cluster = "Satu Transisi, Pendapatan Menengah" sepanjang waktu.
Saya tidak mengerti mengapa ini menjadi masalah. Jika saya ingin mendapatkan prediksi () untuk bekerja, saya harus memasukkan semua variabel dari model, kan? Jelas, data input dalam panggilan model tidak akan menyertakan faktor yang diatur ke nilai yang sama untuk semua kasus. Namun, jika saya ingin mendapatkan prediksi hanya untuk subset data, atau untuk pengamatan baru, saya mungkin tertarik hanya dalam kasus-kasus di mana beberapa faktor selalu ditetapkan sama. Apakah masuk akal? Bagaimana saya bisa mendapatkan prediksi dalam kasus itu?
sumber
options(stringsAsFactors = FALSE)
, dan kemudian jalankan kode Anda. Itu akan mencegah sumber asli Andatest.pred
memiliki faktor sendiri.Jawaban:
Terima kasih telah menyediakan data sehingga saya dapat melakukan beberapa diagnostik. Sebenarnya, ini adalah bug epik dari
predict.lme
. Andafactors
memiliki lebih banyak level dalam data awal Anda (misalnya Anda memiliki lebih dari 4 negara) daripada di data baru Anda. Baris kode khusus menyebabkan level yang tidak terpakai dibuang sehingga Anda berakhir dengan matriks dimensi yang berbeda, di mananon-conformable arguments
Saya menghapus baris itu dan meletakkan kode di sini .
Di R bisa Anda lakukan
Ini mendaftarkan fungsi baru
predict.lme
yang akan dipanggil alih-alih yang dari paketnlme
dan Anda dapat menjalankan kode Anda. Setidaknya itu berhasil untuk saya.Peringatan: Kode yang diposting dan metode bukanlah pengganti atau perbaikan bug nyata dari paket. Fungsi tambalan belum diuji di luar kemampuannya untuk menjalankan sedikit kode OP.
sumber
country.x
keduanya. Juri masih keluar.levels=1
tetapi tidak untuklevel=0
?