¿Cómo dibujar un diagrama de interacción con intervalos de confianza?

11

Mis intentos:

  1. No pude obtener intervalos de confianza en interaction.plot()

  2. y por otro lado plotmeans()del paquete 'gplot' no mostraría dos gráficos. Además, no pude imponer dos plotmeans()gráficos uno encima del otro porque, por defecto, los ejes son diferentes.

  3. Tuve cierto éxito usando el plotCI()paquete 'gplot' y superponiendo dos gráficos, pero aún así la coincidencia del eje no era perfecta.

¿Algún consejo sobre cómo hacer un diagrama de interacción con intervalos de confianza? Ya sea por una función, o consejos sobre cómo superponer plotmeans()o plotCI()gráficos.

muestra de código

br=structure(list(tangle = c(140L, 50L, 40L, 140L, 90L, 70L, 110L, 
150L, 150L, 110L, 110L, 50L, 90L, 140L, 110L, 50L, 60L, 40L, 
40L, 130L, 120L, 140L, 70L, 50L, 140L, 120L, 130L, 50L, 40L, 
80L, 140L, 100L, 60L, 70L, 50L, 60L, 60L, 130L, 40L, 130L, 100L, 
70L, 110L, 80L, 120L, 110L, 40L, 100L, 40L, 60L, 120L, 120L, 
70L, 80L, 130L, 60L, 100L, 100L, 60L, 70L, 90L, 100L, 140L, 70L, 
100L, 90L, 130L, 70L, 130L, 40L, 80L, 130L, 150L, 110L, 120L, 
140L, 90L, 60L, 90L, 80L, 120L, 150L, 90L, 150L, 50L, 50L, 100L, 
150L, 80L, 90L, 110L, 150L, 150L, 120L, 80L, 80L), gtangles = c(141L, 
58L, 44L, 154L, 120L, 90L, 128L, 147L, 147L, 120L, 127L, 66L, 
118L, 141L, 111L, 59L, 72L, 45L, 52L, 144L, 139L, 143L, 73L,  
59L, 148L, 141L, 135L, 63L, 51L, 88L, 147L, 110L, 68L, 78L, 63L, 
64L, 70L, 133L, 49L, 129L, 100L, 78L, 128L, 91L, 121L, 109L, 
48L, 113L, 50L, 68L, 135L, 120L, 85L, 97L, 136L, 59L, 112L, 103L, 
62L, 87L, 92L, 116L, 141L, 70L, 121L, 92L, 137L, 85L, 117L, 51L, 
84L, 128L, 162L, 102L, 127L, 151L, 115L, 57L, 93L, 92L, 117L, 
140L, 95L, 159L, 57L, 65L, 130L, 152L, 90L, 117L, 116L, 147L, 
140L, 116L, 98L, 95L), up = c(-1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
-1L, -1L, 1L, 1L, 1L, 1L, -1L, -1L, -1L, -1L, 1L, 1L, -1L, -1L, 
1L, 1L, -1L, 1L, 1L, -1L, 1L, 1L, 1L, 1L, 1L, -1L, -1L, 1L, 1L, 
1L, 1L, -1L, -1L, 1L, 1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, 
1L, -1L, -1L, -1L, -1L, -1L, 1L, -1L, 1L, 1L, -1L, -1L, -1L, 
-1L, 1L, -1L, 1L, -1L, -1L, -1L, 1L, -1L, 1L, -1L, 1L, 1L, 1L, 
-1L, -1L, -1L, -1L, -1L, -1L, 1L, -1L, 1L, 1L, -1L, -1L, 1L, 
1L, 1L, -1L, 1L, 1L, 1L)), .Names = c("tangle", "gtangles", "up"
), class = "data.frame", row.names = c(NA, -96L))

plotmeans2 <- function(br, alph) {
dt=br;   tmp   <- split(br$gtangles, br$tangle);   
means <- sapply(tmp, mean);  stdev <- sqrt(sapply(tmp, var));  
n <- sapply(tmp,length);  
ciw   <- qt(alph, n) * stdev / sqrt(n)
plotCI(x=means, uiw=ciw, col="black", barcol="blue", lwd=1,ylim=c(40,150),  xlim=c(1,12)); 
par(new=TRUE) dt= subset(br,up==1);   
tmp   <- split(dt$gtangles, dt$tangle);  
means <- sapply(tmp, mean);  
stdev <- sqrt(sapply(tmp, var));  
n <- sapply(tmp,length); 
ciw  <- qt(0.95, n) * stdev / sqrt(n)
plotCI(x=means, uiw=ciw, type='l',col="black", barcol="red", lwd=1,ylim=c(40,150), xlim=c(1,12),pch='+');
abline(v=6);abline(h=90);abline(30,10); par(new=TRUE);
dt=subset(br,up==-1);   
tmp <- split(dt$gtangles, dt$tangle);  
means <- sapply(tmp, mean);  
stdev <- sqrt(sapply(tmp, var));  
n <- sapply(tmp,length); 
ciw <- qt(0.95, n) * stdev / sqrt(n)
plotCI(x=means, uiw=ciw, type='l', col="black", barcol="blue",   lwd=1,ylim=c(40,150), xlim=c(1,12),pch='-');abline(v=6);abline(h=90);
abline(30,10);
}

plotmeans2(br,.95)
Adam SA
fuente

Respuestas:

21

Si está dispuesto a usar ggplot , puede probar el siguiente código.

Con un predictor continuo

library(ggplot2)
gp <- ggplot(data=br, aes(x=tangle, y=gtangles)) 
gp + geom_point() + stat_smooth(method="lm", fullrange=T) + facet_grid(. ~ up)

para una trama de interacción facetada

ingrese la descripción de la imagen aquí

Para una trama de interacción estándar (como la producida por interaction.plot()), solo tiene que eliminar las facetas.

gp <- ggplot(data=br, aes(x=tangle, y=gtangles, colour=factor(up))) 
gp + geom_point() + stat_smooth(method="lm")

ingrese la descripción de la imagen aquí

Con un predictor discreto

Usando el ToothGrowthconjunto de datos (ver help(ToothGrowth)),

ToothGrowth$dose.cat <- factor(ToothGrowth$dose, labels=paste("d", 1:3, sep=""))
df <- with(ToothGrowth , aggregate(len, list(supp=supp, dose=dose.cat), mean))
df$se <- with(ToothGrowth , aggregate(len, list(supp=supp, dose=dose.cat), 
              function(x) sd(x)/sqrt(10)))[,3]

opar <- theme_update(panel.grid.major = theme_blank(),
                     panel.grid.minor = theme_blank(),
                     panel.background = theme_rect(colour = "black"))
gp <- ggplot(df, aes(x=dose, y=x, colour=supp, group=supp))
gp + geom_line(aes(linetype=supp), size=.6) + 
     geom_point(aes(shape=supp), size=3) + 
     geom_errorbar(aes(ymax=x+se, ymin=x-se), width=.1)
theme_set(opar)

ingrese la descripción de la imagen aquí

chl
fuente
Muchas gracias por la respuesta detallada. Quería preguntar, ¿hay alguna manera de hacer intervalos de confianza verticales en cada nivel de la variable independiente? ¿Hay alguna manera de eliminar el fondo y volver al gráfico de 'estilo antiguo'?
Adam SA
1
@ Adam actualicé mi respuesta con el caso de 2 variables categóricas + una variable de respuesta continua; espero que esto sea lo que quisiste decir. También agregué código para mostrar cómo personalizar el ggplottema. En general, puede decir gp + theme_bw()que simplemente elimine el fondo gris; Aquí, también eliminé la cuadrícula.
chl
12

También hay un paquete de efectos de Fox y Hong en R. Ver J. Stat. Suave. documentos aquí y aquí para ejemplos con intervalos de confianza y generación de código R.

No es tan bonito como una solución de ggplot, pero es bastante más general y un salvavidas para GLM moderadamente complejos.

conjugadoprior
fuente
1
(+1) Debo admitir que prefiero este enfoque :-)
chl
@chl y / o Conjugate, ¿puedes decir más sobre por qué prefieres este enfoque? Sería de gran ayuda la gente como yo decidir qué método de invertir tiempo en.
Michael Bishop
1
@MichaelBishop Esencialmente porque resume muchas cosas difíciles (trazar en la escala de enlace vs. respuesta, mostrar IC del 95% para GLMMM, marginación contra términos de interacción, etc.) que serían difíciles de manejar en pocos comandos R (y personalmente, Me gusta mucho lattice gráficos :)
chl