58 votos

Intervalo de predicción para lmer() modelo de efectos mixtos en R

Quiero obtener una predicción del intervalo de alrededor de una predicción de un lmer() del modelo. He encontrado alguna discusión acerca de esto:

http://rstudio-pubs-static.s3.amazonaws.com/24365_2803ab8299934e888a60e7b16113f619.html

http://glmm.wikidot.com/faq

pero parecen no tomar a la incertidumbre de los efectos aleatorios en cuenta.

He aquí un ejemplo específico. Yo soy de las carreras de pez de oro. Tengo los datos de los últimos 100 carreras. Quiero predecir el número 101, teniendo en cuenta la incertidumbre de mi RE estimaciones, y la FE de las estimaciones. Estoy incluyendo una al azar para interceptar peces (hay 10 tipos diferentes de peces), y el efecto fijo de peso (menos pesados que los peces son más rápidos).

library("lme4")

fish <- as.factor(rep(letters[1:10], each=100))
race <- as.factor(rep(900:999, 10))
oz <- round(1 + rnorm(1000)/10, 3)
sec <- 9 + rep(1:10, rep(100,10))/10 + oz + rnorm(1000)/10

fishDat <- data.frame(fishID = fish, 
      raceID = race, fishWt = oz, time = sec)
head(fishDat)
plot(fishDat$fishID, fishDat$time)

lme1 <- lmer(time ~ fishWt + (1 | fishID), data=fishDat)
summary(lme1)

Ahora, para predecir el número 101 de la carrera. Los peces han sido pesadas y está listo para ir:

newDat <- data.frame(fishID = letters[1:10], 
    raceID = rep(1000, 10),
    fishWt = 1 + round(rnorm(10)/10, 3))
newDat$pred <- predict(lme1, newDat)
newDat

   fishID raceID fishWt     pred
1       a   1000  1.073 10.15348
2       b   1000  1.001 10.20107
3       c   1000  0.945 10.25978
4       d   1000  1.110 10.51753
5       e   1000  0.910 10.41511
6       f   1000  0.848 10.44547
7       g   1000  0.991 10.68678
8       h   1000  0.737 10.56929
9       i   1000  0.993 10.89564
10      j   1000  0.649 10.65480

Los peces D realmente ha soltó (1.11 oz) y es realmente predijo a perder a los Peces E y de Pescado F, ambos de los cuales ha sido mejor que en el pasado. Sin embargo, ahora quiero ser capaz de decir, "Peces E (pesaje 0.91 oz) va a vencer a los Peces D (pesaje 1.11 oz) con una probabilidad de p". Hay una manera de hacer una declaración utilizando lme4? Quiero que mi probabilidad p para tener en cuenta mi incertidumbre, tanto en el de efectos fijos y el de efectos aleatorios.

Gracias!

PS mirando a la predict.merMod documentación, sugiere que "no Hay ninguna opción para calcular los errores estándar de las predicciones debido a que es difícil definir un método eficiente que incorpora la incertidumbre en los parámetros de varianza; recomendamos bootMer para esta tarea," pero mira por dónde, no puedo ver cómo utilizar bootMer a ello. Parece bootMer sería utilizado para obtener bootstrap intervalos de confianza para las estimaciones de los parámetros, pero puedo estar equivocado.

ACTUALIZADO P:

OK, creo que me estaba haciendo la pregunta equivocada. Quiero ser capaz de decir, "Pescado, de peso w oz, tendrá un tiempo de carrera que es (lcl, ucl), el 90% del tiempo."

En el ejemplo que he puesto, Pescado, pesaje 1.0 oz, tendrá un tiempo de carrera de 9 + 0.1 + 1 = 10.1 sec en promedio, con una desviación estándar de 0.1. Por lo tanto, su observó el tiempo de carrera será de entre

x <- rnorm(mean = 10.1, sd = 0.1, n=10000)
quantile(x, c(0.05,0.50,0.95))
       5%       50%       95% 
 9.938541 10.100032 10.261243 

El 90% del tiempo. Quiero una función de predicción de que los intentos de darme la respuesta. Configuración de todos los fishWt = 1.0 en newDat, de volver a ejecutar la sim, y usando (como sugerido por Ben Bolker a continuación)

bb <- bootMer(lme1,nsim=1000,FUN=predFun, use.u = FALSE)

da

> quantile(predMat[,1], c(0.05,0.50,0.95))
      5%      50%      95% 
10.01362 10.55646 11.05462 

Esto parece realmente estar centrada en torno a la media de la población? Como si no fuera a tomar el FishID efecto en la cuenta? Pensé que tal vez se trataba de un tamaño de la muestra problema, pero cuando me encontré con el número de observados carreras de 100 a 10000, yo todavía obtener resultados similares.

Por otro lado, el uso de

bb <- bootMer(lme1,nsim=1000,FUN=predFun, use.u = TRUE)

da

> quantile(predMat[,1], c(0.05,0.50,0.95))
      5%      50%      95% 
10.09970 10.10128 10.10270 

Ese intervalo es demasiado estrecho, y parecería ser un intervalo de confianza para Peces de Una media hora. Quiero un intervalo de confianza para Un Pescado que se observa el tiempo de carrera, no es su promedio de carrera de tiempo. Cómo puedo obtener?

ACTUALIZAR 2, CASI:

Yo pensaba que encontré lo que estaba buscando, en Gelman y Hill (2007) , página 273. Necesidad de utilizar la arm paquete.

library("arm")

Para El Pescado:

x.tilde <- 1    #observed fishWt for new race
sigma.y.hat <- sigma.hat(lme1)$sigma$data      #get uncertainty estimate of our model
coef.hat <- as.matrix(coef(lme1)$fishID)[1,]    #get intercept (random) and fishWt (fixed) parameter estimates
y.tilde <- rnorm(1000, coef.hat %*% c(1, x.tilde), sigma.y.hat) #simulate
quantile (y.tilde, c(.05, .5, .95))

  5%       50%       95% 
 9.930695 10.100209 10.263551 

Para todos los peces:

x.tilde <- rep(1,10)  #assume all fish weight 1 oz
#x.tilde <- 1 + rnorm(10)/10  #alternatively, draw random weights as in original example
sigma.y.hat <- sigma.hat(lme1)$sigma$data
coef.hat <- as.matrix(coef(lme1)$fishID)
y.tilde <- matrix(rnorm(1000, coef.hat %*% matrix(c(rep(1,10), x.tilde), nrow = 2 , byrow = TRUE), sigma.y.hat), ncol = 10, byrow = TRUE)
quantile (y.tilde[,1], c(.05, .5, .95))
       5%       50%       95% 
 9.937138 10.102627 10.234616 

En realidad, esto probablemente no es exactamente lo que quiero. Sólo estoy tomando en cuenta el conjunto de incertidumbre del modelo. En una situación en la que yo tengo, digamos, 5 observa las razas de Peces K y 1000 observado las razas de Peces L, creo que la incertidumbre asociada con mi predicción para los Peces K debe ser mucho mayor que la incertidumbre asociada con mi predicción para los Peces L.

Tendrá un aspecto más dentro de Gelman y Hill, 2007. Siento que puede terminar encima de tener que cambiar a los ERRORES (o Stan).

ACTUALIZACIÓN EL 3 de:

Tal vez estoy conceptualizar las cosas mal. El uso de la predictInterval() función dada por Jared Knowles en una respuesta a continuación da a intervalos que no son lo que yo esperaría...

library("lattice")
library("lme4")
library("ggplot2")

fish <- c(rep(letters[1:10], each = 100), rep("k", 995), rep("l", 5))
oz <- round(1 + rnorm(2000)/10, 3)
sec <- 9 + c(rep(1:10, each = 100)/10,rep(1.1, 995), rep(1.2, 5)) + oz + rnorm(2000)

fishDat <- data.frame(fishID = fish, fishWt = oz, time = sec)
dim(fishDat)
head(fishDat)
plot(fishDat$fishID, fishDat$time)

lme1 <- lmer(time ~ fishWt + (1 | fishID), data=fishDat)
summary(lme1)
dotplot(ranef(lme1, condVar = TRUE))

He añadido dos nuevos peces. Peces de K, para los cuales hemos observado 995 carreras, y los Peces L, para los cuales hemos observado 5 carreras. Hemos observado 100 razas de Peces a-J. I ajuste de la misma lmer() como antes. Mirando a la dotplot() de la lattice paquete de:

FishID Estimates

De forma predeterminada, dotplot() reordena el de efectos aleatorios, por su punto de estimación. La estimación para el Pescado L está en la parte superior de la línea, y tiene un ancho de intervalo de confianza. Los peces K es en la tercera línea, y tiene un muy estrecho intervalo de confianza. Esto tiene sentido para mí. Tenemos un montón de datos sobre Peces K, pero no una gran cantidad de datos sobre Peces de L, por lo que nos sentimos más seguros en nuestro conjeturar acerca de los Peces K la verdadera velocidad de natación. Ahora, yo creo que esto llevaría a un estrecho intervalo de predicción para los Peces K, y un amplio intervalo de predicción para los Peces L cuando se utiliza predictInterval(). Howeva:

newDat <- data.frame(fishID = letters[1:12],
                     fishWt = 1)

preds <- predictInterval(lme1, newdata = newDat, n.sims = 999)
preds
ggplot(aes(x=letters[1:12], y=fit, ymin=lwr, ymax=upr), data=preds) +
  geom_point() + 
  geom_linerange() +
  labs(x="Index", y="Prediction w/ 95% PI") + theme_bw()

Prediction Interval for Fish

Todos los intervalos de predicción parece ser idéntica en anchura. Por qué no es nuestra predicción para los Peces K más estrecho que los otros? Por qué no es nuestra predicción para los Peces de L más amplia que la de los demás?

32voto

Kerrek SB Puntos 728

Esta pregunta y excelente intercambio fue el impulso para la creación de la predictInterval función en el merTools paquete. bootMer es el camino a seguir, pero por algunos problemas no es factible computacionalmente para generar bootstrap rehabilitación de plantas de todo el modelo (en los casos donde el modelo es grande).

En esos casos, predictInterval está diseñado para utilizar la arm::sim funciones para generar las distribuciones de los parámetros en el modelo y, a continuación, utilizar esas distribuciones para generar valores simulados de la respuesta dada a la newdata proporcionado por el usuario. Es simple de usar-todo lo que necesita hacer es:

library(merTools)
preds <- predictInterval(lme1, newdata = newDat, n.sims = 999)

Se puede especificar una serie de otros valores de a predictInterval incluyendo la configuración de intervalo para los intervalos de predicción, la elección de si se presenta la media o la mediana de la distribución, y elegir si incluir o no la varianza residual del modelo.

No es una completa intervalo de predicción de la variabilidad de la theta parámetros de la lmer objeto no están incluidos, pero todos los de la otra variación es capturado a través de este método, dando una bastante decente aproximación.

21voto

Ben Bolker Puntos 8729

Haga esto haciendo bootMer generar un conjunto de predicciones para cada bootstrap paramétrico de replicar:

predFun <- function(fit) {
    predict(fit,newDat)
}
bb <- bootMer(lme1,nsim=200,FUN=predFun,seed=101)

La salida de bootMer está en un no-terriblemente-transparentes "boot" objeto, pero podemos obtener la cruda predicciones de la $t componente.

Cuánto tiempo hace de Peces E beat Fish D?

predMat <- bb$t
dim(predMat) ## 200 rows (PB reps) x 10 (predictions)

Peces E, a veces, están en la columna 5, pescado D veces están en la columna 4, de modo que sólo necesitamos saber la proporción que la columna 5 es menor que la de la columna 4:

mean(predMat[,5]<predMat[,4])  ## 0.57

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