Recuperación de infarto. Para estudiar las diferencias entre dos procedimientos diferentes de recuperación de pacientes de un infarto, se consideraron dos grupos experimentales en sendos hospitales, de 8 pacientes cada uno. La variable respuesta es el índice de Bartel, que varía entre 0 y 100, y que constituye una medida de la habilidad funcional con la que se valoran diferentes capacidades, de forma que valores más altos se corresponden con una mejor situación del paciente. De cada uno de los 16 pacientes se dispone de su respuesta cada semana a lo largo de 5 semanas consecutivas. Datos reducidos de Dobson… (Datos en recuperainfarto.txt) > > > > dat <- read.table("D:\\... \\recuperainfarto.txt") options( digits=4 ) colnames(dat) <- c("hospi","s1","s2","s3","s4","s5") dat hospi s1 s2 s3 s4 s5 1 B 40 55 60 70 80 2 B 65 65 70 70 80 3 B 30 30 40 45 65 4 B 25 35 35 35 40 5 B 45 45 80 80 80 6 B 15 15 10 10 10 7 B 35 35 35 45 45 8 B 40 40 40 55 55 9 C 20 20 30 30 30 10 C 35 35 35 40 40 11 C 35 35 35 40 40 12 C 45 65 65 65 80 13 C 45 65 70 90 90 14 C 25 30 30 35 40 15 C 25 25 30 30 30 16 C 15 35 35 35 40 > > > > hospi <- dat[,1] ### dos grupos de tratamiento puntos <- dat[,2:6] ### puntuaciones de los 16 individuos pB <- puntos[hospi=="B",] pC <- puntos[hospi=="C",] Se puede observar un incremento semanal de las puntuaciones (Figura 1), siendo las medias del hospital B superiores a lo largo de todas las semanas. ¿Significa esto que existe una mejoría de los individuos? ¿Hay diferencia entre los tratamientos de B y C? > mB <- apply( pB, 2, mean ) > mC <- apply( pC, 2, mean ) > rbind( mB, mC ) s1 s2 s3 s4 s5 mB 36.88 40.00 46.25 51.25 56.88 mC 30.62 38.75 41.25 45.62 48.75 > > + > > > > x11() plot(1:5, mB, pch="", ylim=c(15,90),xlab="semana", ylab="puntuación", main="Puntuación y medias por hospital y semana", cex.main=0.9) for(i in 1:5){points( 1:5, pB[i,], type="p", lty=3, pch="b", col="blue")} for(i in 1:5){points( 1:5, pC[i,], type="p", lty=3, pch="c", col="red")} points( 1:5, mB, type="b", pch="B", lwd=2, col="blue") points( 1:5, mC, type="b", pch="C", lwd=2, col="red" ) > > > > > > ### preparacion de los datos en matriz 80*4 punt <- as.vector( t(puntos) ) ## puntuaciones indi <- gl(16, 5, 16*5) ## 16 individuos hosp <- gl(2, 8*5, 16*5) ## hospitales (1:B; 2:C) sema <- as.numeric( gl(5, 1, 16*5) ) ## semanas 1:5 #cbind(indi, hosp, punt, sema)[1:12,] 1 80 Puntuación y medias por hospital y semana 60 c b c b b c b c b b c c b b B b B C 40 puntuación b c B C b B C c b C b c c b b b c c c 3 4 5 c b b b B c C b c b 20 b c c 1 2 Figura 1 semana Podemos recoger el incremento semanal de las puntuaciones y el efecto “hospital”, mediante un modelo lineal. En el modelo m1 consideramos que el incremento semanal de las puntuaciones es el mismo en cada hospital > m1 <- lm( punt ~ hosp + sema ) > summary( m1 ) Call: lm(formula = punt ~ hosp + sema) Residuals: Min 1Q Median -45.69 -11.00 -5.98 3Q 13.45 Max 44.28 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 32.09 5.27 6.09 4.2e-08 *** hosp2 -5.25 4.14 -1.27 0.2081 sema 4.72 1.46 3.23 0.0018 ** Residual standard error: 18.5 on 77 degrees of freedom Multiple R-squared: 0.135, Adjusted R-squared: 0.113 F-statistic: 6.01 on 2 and 77 DF, p-value: 0.00374 2 El modelo lineal m2 es más sencillo que m1, excluyendo el efecto “hospital”. > m2 <- lm( punt ~ sema ) > summary( m2 ) Call: lm(formula = punt ~ sema) Residuals: Min 1Q Median -43.06 -13.06 -3.91 3Q 12.98 Max 41.66 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 29.47 4.87 6.05 4.7e-08 *** sema 4.72 1.47 3.21 0.0019 ** Residual standard error: 18.6 on 78 degrees of freedom Multiple R-squared: 0.117, Adjusted R-squared: 0.106 F-statistic: 10.3 on 1 and 78 DF, p-value: 0.0019 Si consideramos un modelo lineal m3 que recoja que el incremento de la puntuación semanal sea diferente en los hospitales, comprobamos que la interacción hospital*semana no es significativa. Asimismo, podemos comprobar (anova, stepAIC) que el mejor de los tres modelos es el modelo m2 > fit.lm2 <- fitted( m2 ) ### ajustados por m2 Observemos otras características de los datos disponibles. Se observa una fuerte correlación entre las puntuaciones semanales, sobremanera entre las de semanas contiguas: > cor(puntos) s1 s1 1.0000 s2 0.8471 s3 0.8285 s4 0.8268 s5 0.8150 s2 0.8471 1.0000 0.8827 0.8924 0.9064 s3 0.8285 0.8827 1.0000 0.9590 0.9490 s4 0.8268 0.8924 0.9590 1.0000 0.9649 s5 0.8150 0.9064 0.9490 0.9649 1.0000 Podemos visualizar este hecho en el siguiente gráfico (Figura 2) de dispersión múltiple: > library( lattice ) > > > + ### gráfico de dispersión de la puntuación en las 8 semanas x11() splom(~ puntos, cex.lab=1.5, varnames=c("s1","s2","s3","s4","s5"), pscales=0, xlab="puntuación semanal", ylab="puntuación semanal", col="black") Observemos que las puntuaciones son del mismo individuo a lo largo de cinco semanas, por tanto es bastante probable que lo anterior se explique por la falta de independencia entre las observaciones sobre el mismo individuo. Podemos ver que existe autocorrelación en los datos de cada individuo: > autocor1 <- NULL > for(i in 1:16){ + autocor1[i] <- cor(as.numeric(puntos[i,1:4]), as.numeric(puntos[i,2:5])) + } > autocor1 [1] 0.9471 0.6882 0.9058 0.3333 0.5774 0.5774 0.5774 0.5774 0.5774 0.5774 [11] 0.5774 0.3333 0.8400 0.8528 0.5774 0.3333 3 s5 puntuación semanal s4 s3 s2 s1 Figura 2 puntuación semanal El siguiente gráfico (Figura 3) permite observar una tendencia lineal de las puntuaciones individuales frente a las semanas. Cada panel corresponde a un individuo (cluster), representando los cinco puntos las cinco puntuaciones semanales del individuo. La línea de puntos recoge la tendencia lineal de la puntuación. Asimismo, se ha representado, en trazo continuo, la recta de regresión del modelo lineal m2. Se observa que la recta del modelo m2 ajusta mal las observaciones disponibles, no recogiendo la variabilidad entre los individuos. > > + + + + + + + + x11() xyplot(punt ~ sema|indi, groups=hosp, layout=c(4,4), col="red", xlab="semana", ylab="puntuación", main="obs. individuales y modelo lineal m2", par.strip.text=list(cex=0.7), panel=function(x,y,subscripts){ panel.xyplot(x, y, pch=1, cex=1, col="red") panel.lmline(x, y, lty=3) #panel.xyplot(sema[subscripts], fitted.m3[subscripts], pch=3) panel.lmline(sema[subscripts], fit.lm2[subscripts]) }, subscripts=T) 4 obs. individuales y modelo lineal m2 1 13 2 3 4 5 1 14 15 2 3 4 5 16 80 60 40 20 9 10 11 12 5 6 7 8 80 60 puntuación 40 20 80 60 40 20 1 2 3 4 80 60 40 20 1 2 Figura 3 3 4 5 1 2 3 4 5 semana Para tratar de resolver el mal ajuste del modelo lineal m2, se puede ajustar un modelo lineal mixto, introduciendo un intercept aleatorio que permita explicar la variabilidad observada entre los individuos, y tal vez añadir una pendiente aleatoria, que explique la variabilidad observada en las diferentes pendientes individuales observadas. 5 > library( lme4 ) Modelo lineal mixto con efectos fijos hospital y semana y con intercept aleatorio > m1.lmer <- lmer( punt ~ hosp + sema + (1|indi), REML=F ) > summary(m1.lmer) Linear mixed model fit by maximum likelihood Formula: punt ~ hosp + sema + (1 | indi) AIC BIC logLik deviance REMLdev 602 614 -296 592 581 Random effects: Groups Name Variance Std.Dev. indi (Intercept) 280.5 16.75 Residual 48.7 6.98 Number of obs: 80, groups: indi, 16 Fixed effects: Estimate Std. Error t value (Intercept) 32.094 6.246 5.14 hosp2 -5.250 8.517 -0.62 sema 4.719 0.552 8.55 Correlation of Fixed Effects: (Intr) hosp2 hosp2 -0.682 sema -0.265 0.000 Modelo lineal mixto con efecto fijo semana e intercept aleatorio > m2.lmer <- lmer( punt ~ sema + (1|indi), REML=F ) > summary(m2.lmer) Linear mixed model fit by maximum likelihood Formula: punt ~ sema + (1 | indi) AIC BIC logLik deviance REMLdev 601 610 -296 593 587 Random effects: Groups Name Variance Std.Dev. indi (Intercept) 287.4 16.95 Residual 48.7 6.98 Number of obs: 80, groups: indi, 16 Fixed effects: Estimate Std. Error t value (Intercept) 29.469 4.616 6.38 sema 4.719 0.552 8.55 Correlation of Fixed Effects: (Intr) sema -0.359 Comparación de m2.lmer con m1.lmer, o test de que en m1.lmer, el efecto fijo hospital es nulo: > anova( m2.lmer, m1.lmer Data: Models: m2.lmer: punt ~ sema m1.lmer: punt ~ hosp Df AIC BIC m2.lmer 4 601 610 m1.lmer 5 602 614 ) + (1 | indi) + sema + (1 | indi) logLik Chisq Chi Df Pr(>Chisq) -296 -296 0.38 1 0.54 6 El valor chicuadrado (0.38) calculado en anova, corresponde al valor del TRV, diferencia de deviances de ambos modelos: > dev.m2.m1 <- 2*(logLik(m1.lmer) - logLik(m2.lmer)) > dev.m2.m1[1] ML 0.3754 Es cuestionable en estos modelos la distribución asintótica chi-cuadrado con 1 gdl para la diferencia de deviances. Una forma de soslayar este inconveniente es el uso de bootstrap paramétrico, facilitado por la función simulate de R: > > > > ### TRV bootstrap paramétrico de efecto fijo hospital devb.m2.m1 <- NULL R <- 1000 for( i in 1:R ){ + puntb <- unlist( simulate(m2.lmer) ) + m2b <- lmer( puntb ~ sema + (1|indi), REML=F ) + m1b <- lmer( puntb ~ hosp + sema + (1|indi), REML=F ) + devb.m2.m1[i] <- 2*(logLik(m1b) - logLik(m2b)) + } x11() hist( devb.m2.m1, probability=T, breaks=25 ) abline( v=dev.m2.m1[1], lty=3 ) Histogram of devb.m2.m1 curve( dchisq(x,1), add=T ) 0.0 0.2 0.4 Density 0.6 0.8 1.0 > > > > 0 Figura 4 5 10 15 devb.m2.m1 > mean( devb.m2.m1 > dev.m2.m1[1] ) [1] 0.573 El elevado valor del p-valor bootstrap del TRV, 0.573, nos permite concluir que m2.lmer es mejor modelo que m1.lmer, de forma que el efecto hospital es irrelevante. En este caso el pvalor bootstrap es muy similar al asintótico de la aproximación chi-cuadrado. 7 ¿Es significativo el efecto aleatorio introducido en el modelo m2.lmer? La respuesta vendrá de la comparación de m2.lmer con el modelo lineal m2, que solo incluye el efecto fijo semana. > dev.mixto <- as.numeric(2*(logLik(m2.lmer)-logLik(m2))) > dev.mixto [1] 99.84 La diferencia de deviances, 99.84, es muy elevada, de forma que la ganacia en el ajuste al incluir el intercept aleatorio es muy significativa. > > > > R <- 1000 ### TRV bootstrap de efecto mixto nulo: (inútil ya que dev.mixto es enorme!!) devb.mixto <- NULL for( i in 1:R ){ + yb <- unlist( simulate( m2 ) ) + m2b <- lm( yb ~ sema ) + m2b.lmer <- lmer( yb ~ sema + (1|indi), REML=F ) + devb.mixto <- 2*(logLik(m2b.lmer) - logLik(m2b)) + } > > > > #x11() #hist( devb.mixto, probability=T, breaks=25 ) #abline( v=dev.mixto, lty=3 ) #curve( dchisq(x,1), add=T ) p-valor bootstrp: > mean( devb.mixto > dev.mixto ) [1] 0 Extracción de la predicción (EBLUP) del efecto aleatorio de m2.lmer: > ranef.m2 <- ranef( m2.lmer ) > ranef.m2 $indi (Intercept) 1 16.806 2 25.512 3 -1.572 4 -9.310 5 21.643 6 -30.590 7 -4.474 8 2.297 9 -17.048 10 -6.408 11 -6.408 12 19.708 13 27.446 14 -11.245 15 -15.114 16 -11.245 Extracción de los efectos fijos estimados de m2.lmer: > fixef.m2 <- fixef( m2.lmer ) > fixef.m2 (Intercept) sema 29.469 4.719 El efecto fijo intercept añadido a los efectos aleatorios predichos da lugar a los intercepts aleatorios del modelo m2.lmer: > inte.m2 <- ranef.m2$indi[,1]+fixef.m2[1] > # rep(inte.m2, each=5)+fixef.m2[2]*rep(c(1:5),16) ### igual que fitted(m2) 8 Las respuestas medias condicionadas por los efectos aleatorios son el resultado de sumar a los efectos fijos estimados, los efectos aleatorios predichos: > fitted.m2 <- fitted( m2.lmer ) > > + + + + + + + + x11() xyplot(punt ~ sema|indi, groups=hosp, layout=c(4,4), col="red", xlab="semana", ylab="puntuación", main="m2.lmer: intercept aleatorio", par.strip.text=list(cex=0.7), panel=function(x,y,subscripts){ panel.xyplot(x, y, pch=1, cex=1, col="red") panel.lmline(x, y, lty=3) #panel.xyplot(sema[subscripts], fitted.m2[subscripts], pch=3) panel.lmline(sema[subscripts], fitted.m2[subscripts]) }, subscripts=T) m2.lmer: intercept aleatorio 1 13 2 3 4 5 1 14 15 2 3 4 5 16 80 60 40 20 9 10 11 12 5 6 7 8 80 60 puntuación 40 20 80 60 40 20 1 2 3 4 80 60 40 20 1 2 Figura 5 3 4 5 1 2 3 4 5 semana La Figura 5 es similar a la Figura 3, pero ahora podemos observar el resultado de incluir el intercept aleatorio. Las líneas de trazo continuo están determinadas por los valores ajustados bajo m2.lmer; presentan una pendiente idéntica a la del modelo m2, y son el resultado de añadir a la recta de m2 el correspondiente intercept aleatorio predicho para cada individuo. 9 El ajuste a los datos observados de m2.lmer es mejor que el del modelo m2, porque recoge una gran parte de la variabilidad entre individuos, que m2 no podía recoger. La varianza residual estimada (EMV) en el modelo m2 es 336.1=deviance(m2)/80 (Residual standard error: 18.6 on 78 degrees of freedom). En el modelo m2.lmer esta varianza global se descompone en dos componentes: la varianza del efecto aleatorio, 287.4, y la varianza residual, 48.7. Como se ve, en este ejemplo, la variabilidad entre los individuos es mucho mayor que la variabilidad residual y esto es lo que el modelo mixto recoge. Una consecuencia importante es la mayor precisión en la estimación de la pendiente (efecto semana): el error estándar del coeficiente de semana en m2 es 1.47, y desciende a 0.552 en m2.lmer. Bajo m2.lmer, podemos estimar en 287.4 la covarianza de dos observaciones cualesquiera del mismo individuo, (Yij, Yil), y su correlación (correlación intraclase) en: 0.86=287.4/(287.4+48.7). Los dos gráficos siguientes (Figura 6), permiten valorar la normalidad e igualdad de varianza supuestos para los residuos del modleo m2.lmer > > > > > x11() plot( fitted.m2, resid( m2.lmer ) ); abline(h=0,lty=3) x11() qqnorm( resid(m2.lmer), main="m2.lmer: qq-norm de residuos",cex.main=0.9 ) qqline( resid(m2.lmer) ) 15 10 5 0 -15 -10 -5 Sample Quantiles 0 -5 -10 -15 resid(m2.lmer) 5 10 15 m2.lmer: qq-norm de residuos 20 Figura 6 40 fitted.m2 60 80 -2 -1 0 1 2 Theoretical Quantiles 10 Modelo lineal mixto que añade una pendiente aleatoria. En este modelo los efectos aleatorios intercept y pendiente están correlados. > m3.lmer <- lmer( punt ~ sema + (1+sema|indi), REML=F ) > summary(m3.lmer) Linear mixed model fit by maximum likelihood Formula: punt ~ sema + (1 + sema | indi) AIC BIC logLik deviance REMLdev 568 582 -278 556 550 Random effects: Groups Name Variance Std.Dev. Corr indi (Intercept) 98.8 9.94 sema 10.5 3.23 0.516 Residual 22.6 4.75 Number of obs: 80, groups: indi, 16 Fixed effects: Estimate Std. Error t value (Intercept) 29.469 2.780 10.60 sema 4.719 0.892 5.29 Correlation of Fixed Effects: (Intr) sema 0.248 > anova( m2.lmer, m3.lmer Data: Models: m2.lmer: punt ~ sema m3.lmer: punt ~ sema Df AIC BIC m2.lmer 4 601 610 m3.lmer 6 568 582 ) + (1 | indi) + (1 + sema | indi) logLik Chisq Chi Df Pr(>Chisq) -296 -278 36.6 2 1.1e-08 *** > dev23 <- as.numeric(2*(logLik(m3.lmer)-logLik(m2.lmer))) > dev23 [1] 36.65 Dado el enorme valor de la diferencia de deviances, para una chi2 con 2 gdl, se excluye la realización de un test bootstrap paramétrico, y se asume que el modelo m3.lmer es mejor que el modelo m2.lmer. 11 Modelo lineal mixto con intercept y pendiente aleatorios incorrelados: > m4.lmer <- lmer( punt ~ sema + (1|indi)+(-1+sema|indi), REML=F ) > summary(m4.lmer) Linear mixed model fit by maximum likelihood Formula: punt ~ sema + (1 | indi) + (-1 + sema | indi) AIC BIC logLik deviance REMLdev 569 580 -279 559 553 Random effects: Groups Name Variance Std.Dev. indi (Intercept) 114.4 10.70 indi sema 12.1 3.47 Residual 21.8 4.67 Number of obs: 80, groups: indi, 16 Fixed effects: Estimate Std. Error t value (Intercept) 29.469 2.941 10.0 sema 4.719 0.943 5.0 Correlation of Fixed Effects: (Intr) sema -0.147 El efecto aleatorio pendiente es significativo, dada la gran diferencia entre las deviances de m2.lmer y m4.lmer: > anova(m2.lmer,m4.lmer) Data: Models: m2.lmer: punt ~ sema + (1 | indi) m4.lmer: punt ~ sema + (1 | indi) + (-1 + sema | indi) Df AIC BIC logLik Chisq Chi Df Pr(>Chisq) m2.lmer 4 601 610 -296 m4.lmer 5 569 580 -279 34.1 1 5.3e-09 *** Para valorar si la correlación entre intercept y pendiente aleatorios puede ser considerada nula, se comparan los modelos m4.lmer y m3.lmer: > anova(m4.lmer, m3.lmer) Data: Models: m4.lmer: punt ~ sema + (1 | indi) + (-1 + sema | indi) m3.lmer: punt ~ sema + (1 + sema | indi) Df AIC BIC logLik Chisq Chi Df Pr(>Chisq) m4.lmer 5 569 580 -279 m3.lmer 6 568 582 -278 2.59 1 0.11 > dev.cor <- 2*(logLik(m3.lmer) - logLik(m4.lmer)) > as.numeric( dev.cor ) [1] 2.591 La comparación puede hacerse mediante bootstrap paramétrico. El p-valor bootstrap, 0.141, es del mismo orden que el asintótico chi2 de anova. > > > > + + + R <- 1000 ### TRV bootstrap de correlacion nula entre efectos aleatorios devb.cor <- NULL for( i in 1:R ){ yb <- unlist( simulate( m4.lmer ) ) m4b <- lmer( yb ~ sema + (1|indi)+(-1+sema|indi), REML=F ) m3b <- lmer( yb ~ sema + (1+sema|indi), REML=F ) 12 + devb.cor[i] <- 2*(logLik(m3b) - logLik(m4b)) + } > > > > x11() hist( devb.cor, probability=T, breaks=25 ) abline( v=dev.cor, lty=3 ) curve( dchisq(x,1), add=T ) > mean( devb.cor > dev.cor ) [1] 0.141 0.4 0.0 0.2 Density 0.6 0.8 Histogram of devb.cor 0 2 4 6 8 10 12 devb.cor Se puede concluir que el modelo más adecuado es m4.lmer, modelo con intercept y pendiente aleatorios incorrelados. Efectos aleatorios predichos (EBLUP) bajo m4.lmer > ranef.m4 <- ranef( m4.lmer ) > ranef.m4 $indi (Intercept) sema 1 4.4175 4.26341 2 24.9083 0.17277 3 -9.4932 2.74343 4 -4.4438 -1.67076 5 6.4959 5.21096 6 -13.3741 -5.91428 7 -0.2180 -1.46632 8 2.4770 -0.06544 9 -11.2051 -1.99787 10 1.3127 -2.66276 11 1.3127 -2.66276 12 12.3214 2.52831 13 9.4194 6.19940 14 -7.2079 -1.38099 15 -6.2937 -3.03075 16 -10.4289 -0.26633 13 Efectos fijos estimados bajo m4.lmer (iguales que los coeficientes de m2) > fixef.m4 <- fixef( m4.lmer ) > fixef.m4 (Intercept) sema 29.469 4.719 Respuesta media condicionada por los efectos aleatorios: > fitted.m4 <- fitted( m4.lmer ) Intercepts y pendientes aleatorios predichos: > inte4 <- ranef.m4$indi[,1]+fixef.m4[1] > pend4 <- ranef.m4$indi[,2]+fixef.m4[2] > # rep(inte4, each=5)+rep(pend4, each=5)*rep(c(1:5),16) ### igual que fitted(m4) Para cada uno de los 16 individuos, puntuaciones observadas y predichas por el modelo m3.lmer, así como intercept y pendiente aleatorios: > fit.m4 <- matrix(fitted.m4, nrow=16, ncol=5, byrow=T) > data.frame(dat, fit.m4, inte4, pend4) hospi s1 s2 s3 s4 s5 X1 X2 X3 X4 X5 inte4 pend4 1 B 40 55 60 70 80 42.87 51.85 60.83 69.81 78.80 33.89 8.982 2 B 65 65 70 70 80 59.27 64.16 69.05 73.94 78.83 54.38 4.892 3 B 30 30 40 45 65 27.44 34.90 42.36 49.82 57.29 19.98 7.462 4 B 25 35 35 35 40 28.07 31.12 34.17 37.22 40.26 25.02 3.048 5 B 45 45 80 80 80 45.89 55.82 65.75 75.68 85.61 35.96 9.930 6 B 15 15 10 10 10 14.90 13.70 12.51 11.31 10.12 16.09 -1.196 7 B 35 35 35 45 45 32.50 35.76 39.01 42.26 45.51 29.25 3.252 8 B 40 40 40 55 55 36.60 41.25 45.91 50.56 55.21 31.95 4.653 9 C 20 20 30 30 30 20.98 23.71 26.43 29.15 31.87 18.26 2.721 10 C 35 35 35 40 40 32.84 34.89 36.95 39.01 41.06 30.78 2.056 11 C 35 35 35 40 40 32.84 34.89 36.95 39.01 41.06 30.78 2.056 12 C 45 65 65 65 80 49.04 56.28 63.53 70.78 78.03 41.79 7.247 13 C 45 65 70 90 90 49.81 60.72 71.64 82.56 93.48 38.89 10.918 14 C 25 30 30 35 40 25.60 28.94 32.27 35.61 38.95 22.26 3.338 15 C 25 25 30 30 30 24.86 26.55 28.24 29.93 31.62 23.18 1.688 16 C 15 35 35 35 40 23.49 27.94 32.40 36.85 41.30 19.04 4.452 Los gráficos de la Figura 7 permiten valorar los residuos del modelo m3.lmer, así como la normalidad de los efectos aleatorios. > x11() > plot( fitted.m4, resid( m4.lmer ) ); abline(h=0,lty=3) > x11() > qqnorm( resid(m4.lmer), main="m4.lmer: qq-norm de residuos",cex.main=0.9 ) > qqline( resid(m4.lmer), lty=3 ) > x11() > qqnorm( ranef.m4$indi[,1], main="m4.lmer: qqnorm de intercepts aleatorios",cex.main=0.9) > qqline( ranef.m4$indi[,1], lty=3 ) > x11() > qqnorm( ranef.m4$indi[,2], main="m4.lmer: qqnorm de pendientes aleatorias",cex.main=0.9) > qqline( ranef.m4$indi[,2], lty=3 ) 14 15 10 5 -10 -5 0 Sample Quantiles 0 -10 -5 resid(m4.lmer) 5 10 15 m4.lmer: qq-norm de residuos 20 40 60 80 -2 -1 0 1 2 Theoretical Quantiles m4.lmer: qqnorm de intercepts aleatorios m4.lmer: qqnorm de pendientes aleatorias 0 Sample Quantiles 10 -4 -2 0 -6 -10 Sample Quantiles 2 4 20 6 fitted.m4 -2 Figura 7 -1 0 Theoretical Quantiles 1 2 -2 -1 0 1 2 Theoretical Quantiles 15 En la Figura 8 se pueden observar los datos individuales, y el resultado del ajuste del modelo m4.lmer, en las líneas de trazo continuo, que recogen los efectos intercept y pendiente aleatorios. > x11() > ### plot conjunto de observados y predichos por m4.lmer > xyplot(punt ~ sema|indi, groups=hosp, layout=c(4,4), col="red", + xlab="semana", ylab="puntuación", main="m4.lmer: intercept y pendiente aleatorios", + par.strip.text=list(cex=0.7), + panel=function(x,y,subscripts){ + panel.xyplot(x, y, pch=1, cex=1, col="red") + panel.lmline(x, y, lty=3) + #panel.xyplot(sema[subscripts], fitted.m4[subscripts], pch=3) + panel.lmline(sema[subscripts], fitted.m4[subscripts]) + }, subscripts=T) m4.lmer: intercept y pendiente aleatorios 1 13 2 3 4 5 1 14 15 2 3 4 5 16 80 60 40 20 9 10 11 12 5 6 7 8 80 60 puntuación 40 20 80 60 40 20 1 2 3 4 80 60 40 20 1 2 Figura 8 3 4 5 1 2 3 4 5 semana ¿Hay una mejoría de los individuos? ¿Hay diferencia entre los tratamientos de B y C? 16