8 votos

Error al obtener las predicciones de un objeto de lme

Estoy tratando de obtener predicciones para las observaciones de una lme objeto. Este es supone ser bastante sencillo. Sin embargo, ya que soy de obtener diferentes tipos de errores para los diferentes ensayos, me parece que me falta algo. Mi modelo es el siguiente:

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

Funciona muy bien, se ajusta bien los datos y los resultados tienen sentido. Ahora para obtener predicciones he intentado lo siguiente:

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

Si yo excluir, digamos, Francia, y sólo se incluyen los países en los que cluster="OneTransition, de Renta Media" luego me da un error 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

En este ejemplo, el problema se debe a cluster="Una Transición, Medio Ingresos" todo el tiempo.

No entiendo por qué esto es un problema. Si quiero llegar a predecir (a) para trabajar Tengo que incluir todas las variables del modelo, ¿verdad? Obviamente, la entrada los datos en el modelo de la llamada no incluyen el factor que se establezca para los mismos valores para en todos los casos. Sin embargo, si quiero obtener predicciones para el subconjunto de los datos, o para nuevas observaciones, yo podría estar interesado en sólo en los casos en donde algunos factor que siempre está dispuesto a ser el mismo. ¿Tiene sentido? ¿Cómo puedo obtener predicciones en ese caso?

8voto

JMW.APRN Puntos 21

Gracias por los datos para que yo pudiera realizar algunos diagnósticos. En realidad, esta es una épica error de predict.lme. Su factors tienen más en los niveles inicial de datos (por ejemplo, usted tiene más de 4 países) que en los nuevos datos. Una línea de código concreto hace que se utilicen los niveles a ser desechados de manera que usted termina con matrices de diferentes dimensiones, de donde el non-conformable arguments

He quitado esa línea y poner el código aquí.

En R se puede hacer

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

De esta forma se registra una nueva función predict.lme que se invocan en lugar de la del paquete nlme y usted puede ejecutar su código. Al menos a mí me funcionó.

Advertencia: El nuevo código y el método no son ni un sustituto ni un real de corrección de error del paquete. La revisión de la función no se ha probado más allá de su capacidad para ejecutar el bit de código de la OP.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X