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?
fonte
options(stringsAsFactors = FALSE)
e executando o seu código. Isso impediria que o originaltest.pred
tivesse seus próprios fatores.Respostas:
Obrigado por fornecer os dados para que eu pudesse realizar alguns diagnósticos. Na verdade, este é um erro épico de
predict.lme
. Vocêfactors
tem 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
Isso registra uma nova função
predict.lme
que será chamada em vez da do pacotenlme
e 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.
fonte
country.x
em ambos. O júri ainda está ausente.levels=1
mas não paralevel=0
?