lỗi trong việc nhận dự đoán từ một đối tượng lme


8

Tôi đang cố gắng để có được dự đoán cho các quan sát từ một đối tượng lme. Điều này được cho là khá đơn giản. Tuy nhiên, vì tôi nhận được các loại lỗi khác nhau cho các thử nghiệm khác nhau, nên dường như tôi đang thiếu một cái gì đó. Mô hình của tôi là như sau:

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))

Nó chạy tốt, phù hợp với dữ liệu và kết quả có ý nghĩa. Bây giờ để có được dự đoán tôi đã thử như sau:

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

Nếu tôi loại trừ, giả sử, Pháp và chỉ bao gồm các quốc gia có cụm = "OneTransition, Thu nhập trung bình" thì tôi sẽ gặp một lỗi khác

# 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

Trong ví dụ này, vấn đề là do cluster = "Một lần chuyển đổi, thu nhập trung bình" mọi lúc.

Tôi không hiểu tại sao đây là một vấn đề. Nếu tôi muốn để dự đoán () hoạt động, tôi phải bao gồm tất cả các biến từ mô hình, phải không? Rõ ràng, dữ liệu đầu vào trong cuộc gọi của mô hình sẽ không bao gồm yếu tố được đặt thành cùng giá trị cho tất cả các trường hợp. Tuy nhiên, nếu tôi muốn nhận dự đoán chỉ cho tập hợp con của dữ liệu hoặc cho các quan sát mới, tôi có thể chỉ quan tâm đến trong trường hợp một số yếu tố luôn được đặt là giống nhau. Liệu nó có ý nghĩa? Làm thế nào tôi có thể nhận được dự đoán trong trường hợp đó?


Tôi nghi ngờ điều này là bởi vì nơi bạn nhìn thấy hai yếu tố, một yếu tố phụ của yếu tố kia, R thấy hai yếu tố không liên quan. Chỉ là một linh cảm: hãy thử bắt đầu một phiên R mới, gõ options(stringsAsFactors = FALSE)và sau đó chạy mã của bạn. Điều đó sẽ ngăn chặn bản gốc của bạn test.predcó các yếu tố riêng của nó.
Matt Parker

Cảm ơn Matt, nhưng vẫn không hoạt động. Tôi thực sự là câu đố. Nó phải là một loại sai lầm.
Antonio Pedro Ramos

Chỉ là một công việc xung quanh, ví dụ như hệ số 3 cấp A, B, C, bạn có thể dự đoán cho cấp A với dữ liệu 100 A, 1 B và 1 C.
Verbal

Câu trả lời:


8

Cảm ơn đã cung cấp dữ liệu để tôi có thể thực hiện một số chẩn đoán. Trên thực tế, đây là một lỗi sử thi của predict.lme. Bạn factorscó nhiều cấp độ hơn trong dữ liệu ban đầu của mình (ví dụ: bạn có nhiều hơn 4 quốc gia) so với dữ liệu mới của bạn. Một dòng mã đặc biệt làm cho các mức không sử dụng bị loại bỏ để bạn kết thúc với ma trận có kích thước khác nhau, từ đónon-conformable arguments

Tôi xóa dòng đó và đặt mã ở đây .

Trong R bạn có thể làm

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

Điều này đăng ký một chức năng mới predict.lmesẽ được gọi thay vì một chức năng từ gói nlmevà bạn có thể chạy mã của mình. Ít nhất nó đã làm việc cho tôi.

Cảnh báo: Mã được đăng và phương thức không phải là sự thay thế cũng không phải là sửa lỗi thực sự của gói. Chức năng vá chưa được kiểm tra ngoài khả năng chạy bit mã của OP.


Trên thực tế, nó làm. Tôi có country.xtrong cả hai. Ban giám khảo vẫn ra.
Antonio Pedro Ramos

Đúng ... đúng vậy. Xin lỗi vì điều đó. Có vẻ như một số loại dữ liệu của bạn không giống nhau trong đầu vào ban đầu và dữ liệu mới của bạn. Điều này sẽ rất khó để làm mà không có dữ liệu. Nếu nó không bí mật và không quá lớn, bạn có thể lưu phiên R và đặt nó ở đâu đó (hoặc gửi nó cho tôi qua thư) không?
gui11aume

Cảm ơn rât nhiều. Bạn có email để tôi gửi cho bạn mã mẫu và dữ liệu không?
Antonio Pedro Ramos

Chỉ cần một câu hỏi nhanh: phiên bản này hoạt động tốt levels=1nhưng không phải cho level=0?
Antonio Pedro Ramos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.