erro ao obter previsões de um objeto lme

8

Estou tentando obter previsões para observações de um objeto lme. Isso deveria ser bem direto. No entanto, como recebo diferentes tipos de erros para diferentes tentativas, parece-me que estou perdendo alguma coisa. Meu modelo é o seguinte:

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

Ele funciona bem, ajusta bem os dados e os resultados fazem sentido. Agora, para obter previsões, tentei o seguinte:

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

Se eu excluir, por exemplo, a França, e incluir apenas países nos quais cluster = "OneTransition, Middle Income", recebo um erro diferente

# 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

Neste exemplo, o problema ocorre devido ao cluster = "Uma transição, renda média" o tempo todo.

Não entendo por que isso é um problema. Se eu quiser que o predict () funcione, tenho que incluir todas as variáveis ​​do modelo, certo? Obviamente, os dados de entrada na chamada do modelo não incluirão o fator definido com os mesmos valores para todos os casos. No entanto, se eu quiser obter previsões apenas para um subconjunto de dados ou para novas observações, talvez eu esteja interessado apenas nos casos em que algum fator é sempre definido para ser o mesmo. Isso faz sentido? Como posso obter previsões nesse caso?

Antonio Pedro Ramos
fonte
Eu suspeito que isso ocorre porque onde você vê dois fatores, um subconjunto do outro, R vê dois fatores não relacionados. Apenas um palpite: tente iniciar uma nova sessão do R, digitando options(stringsAsFactors = FALSE)e executando o seu código. Isso impediria que o original test.predtivesse seus próprios fatores.
Matt Parker
Obrigado Matt, mas ainda não está funcionando. Na verdade, sou quebra-cabeça. Deve ser algum tipo de erro.
Antonio Pedro Ramos
Apenas uma solução alternativa, por exemplo, um fator de 3 níveis A, B, C, você pode fazer uma previsão para o nível A com dados de 100 A, 1 B e 1 C.
Verbal

Respostas:

8

Obrigado por fornecer os dados para que eu pudesse realizar alguns diagnósticos. Na verdade, este é um erro épico de predict.lme. Você factorstem mais níveis nos seus dados iniciais (por exemplo, você tem mais de 4 países) do que nos seus novos dados. Uma linha de código faz com que os níveis não utilizados sejam descartados especificamente, então você acaba com matrizes de diferentes dimensões, de ondenon-conformable arguments

Eu removi essa linha e coloquei o código aqui .

Em R você pode fazer

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

Isso registra uma nova função predict.lmeque será chamada em vez da do pacote nlmee você pode executar seu código. Pelo menos funcionou pra mim.

Aviso: O código publicado e o método não são uma substituição nem uma correção de bug real do pacote. A função corrigida não foi testada além da capacidade de executar o pouco de código do OP.

gui11aume
fonte
Na verdade, sim. Eu tenho country.xem ambos. O júri ainda está ausente.
Antonio Pedro Ramos
Sim ... está certo. Me desculpe por isso. Parece que alguns dos seus tipos de dados não são os mesmos na entrada inicial e nos novos dados. Isso será muito difícil sem os dados. Se não for confidencial e não for muito grande, você poderia salvar a sessão R e colocá-la em algum lugar (ou enviá-la por correio)?
precisa saber é o seguinte
Muito obrigado. Você tem um e-mail para eu enviar exemplos de código e dados?
Antonio Pedro Ramos
Apenas uma pergunta rápida: esta versão funciona bem para, levels=1mas não para level=0?
Antonio Pedro Ramos