kesalahan dalam mendapatkan prediksi dari objek lme

8

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?

Antonio Pedro Ramos
sumber
Saya menduga ini karena di mana Anda melihat dua faktor, satu himpunan bagian yang lain, R melihat dua faktor yang tidak terkait. Hanya dugaan: cobalah memulai sesi R baru, mengetik options(stringsAsFactors = FALSE), dan kemudian jalankan kode Anda. Itu akan mencegah sumber asli Anda test.predmemiliki faktor sendiri.
Matt Parker
Terima kasih, Matt, tetapi masih belum berfungsi. Saya sebenarnya puzzle. Itu pasti semacam kesalahan.
Antonio Pedro Ramos
Hanya bekerja di sekitar, misalnya faktor 3 level A, B, C Anda dapat membuat prediksi untuk level A dengan data 100 A, 1 B dan 1 C.
Verbal

Jawaban:

8

Terima kasih telah menyediakan data sehingga saya dapat melakukan beberapa diagnostik. Sebenarnya, ini adalah bug epik dari predict.lme. Anda factorsmemiliki 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

library(nlme)
source("http://lab.thegrandlocus.com/static/code/predict.lme_patched.txt")

Ini mendaftarkan fungsi baru predict.lmeyang akan dipanggil alih-alih yang dari paket nlmedan 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.

gui11aume
sumber
Sebenarnya itu benar. Saya memiliki country.xkeduanya. Juri masih keluar.
Antonio Pedro Ramos
Yap ... itu benar. Maaf soal itu. Tampaknya beberapa tipe data Anda tidak sama dengan input awal dan data baru Anda. Ini akan sangat sulit dilakukan tanpa data. Jika tidak dirahasiakan, dan tidak terlalu besar, dapatkah Anda menyimpan sesi R dan menaruhnya di suatu tempat (atau mengirimkannya kepada saya melalui surat)?
gui11aume
Terima kasih banyak. Apakah Anda memiliki email untuk saya kirimi Anda kode sampel dan data?
Antonio Pedro Ramos
Hanya pertanyaan singkat: versi ini berfungsi dengan baik untuk levels=1tetapi tidak untuk level=0?
Antonio Pedro Ramos