¿Cómo se puede trazar interacciones continuas por continuas en ggplot2?

11

Digamos que tengo datos:

x1 <- rnorm(100,2,10)
x2 <- rnorm(100,2,10)
y <- x1+x2+x1*x2+rnorm(100,1,2)
dat <- data.frame(y=y,x1=x1,x2=x2)
res <- lm(y~x1*x2,data=dat)
summary(res)

Quiero trazar la interacción continua por continua de modo que x1 esté en el eje X y x2 esté representado por 3 líneas, una que representa x2 con una puntuación Z de 0, una con una puntuación Z de +1 y otra con una Puntaje Z de -1, con cada línea un color separado y etiquetado. ¿Cómo puedo hacer esto usando ggplot2?

Por ejemplo, podría verse más o menos así (aunque, por supuesto, con diferentes líneas de colores en lugar de diferentes tipos de líneas): Imagen de ejemplo

russellpierce
fuente
¿Podría mostrar una imagen de ejemplo de otro paquete / software o dar una descripción más detallada de lo que desea trazar?
daroczig

Respuestas:

9

Aquí está mi versión con su conjunto de datos simulados:

x1 <- rnorm(100,2,10)
x2 <- rnorm(100,2,10)
y <- x1+x2+x1*x2+rnorm(100,1,2)
dat <- data.frame(y=y,x1=x1,x2=x2)
res <- lm(y~x1*x2,data=dat)
z1 <- z2 <- seq(-1,1)
newdf <- expand.grid(x1=z1,x2=z2)

library(ggplot2)
p <- ggplot(data=transform(newdf, yp=predict(res, newdf)), 
            aes(y=yp, x=x1, color=factor(x2))) + stat_smooth(method=lm)
p + scale_colour_discrete(name="x2") + 
  labs(x="x1", y="mean of resp") + 
  scale_x_continuous(breaks=seq(-1,1)) + theme_bw()

Le dejo administrar los detalles sobre las etiquetas del eje x / y y el posicionamiento de la leyenda.

ingrese la descripción de la imagen aquí

chl
fuente
Se ve bien, excepto (por supuesto) que primero tendríamos que escalar (x1) y escalar (x2).
russellpierce
1
@drknexus Sí, por supuesto (en mis pruebas iniciales, utilicé N (0; 1) variantes estandarizadas, en lugar de las suyas).
chl
5

Calculando las estimaciones para y con un puntaje Z de 0 ( columna y0 ), -1 ( columna y1m ) y 1 ( columna y1p ):

dat$y0 <- res$coefficients[[1]] + res$coefficients[[2]]*dat$x1 + res$coefficients[[3]]*0 + res$coefficients[[4]]*dat$x1*0
	dat$y1m <- res$coefficients[[1]] + res$coefficients[[2]]*dat$x1 + res$coefficients[[3]]*-1 + res$coefficients[[4]]*dat$x1*-1
dat$y1p <- res$coefficients[[1]] + res$coefficients[[2]]*dat$x1 + res$coefficients[[3]]*1 + res$coefficients[[4]]*dat$x1*1

Trazar las líneas con base plot():

plot(dat$x1, dat$y0, type="l", xlab="x1", ylab="Estimates")
lines(dat$x1, dat$y1m, col="red")
lines(dat$x1, dat$y1p, col="blue")

ingrese la descripción de la imagen aquí

Para usar ggplot, puede llamar a geom_line :

ggplot(dat, aes(x1, y0)) + geom_line() +
    geom_line(aes(x1, y1m), color="red") +
    geom_line(aes(x1, y1p), color="blue") +
    theme_bw() + opts(title="") + xlab("x1") + ylab("Estimates")

ingrese la descripción de la imagen aquí

daroczig
fuente
2
puedes obtener predicciones usando predic. dat [, "y0"] <- predic (res, newdata = data.frame (x1 = dat [, "x1"], x2 = 0)) Guarda un poco de escritura.
mpiktas
@mpiktas: gracias, no lo sabía predict, pero parece útil.
daroczig
1
Siempre recomendaría usar predicción en lugar de calcular las pendientes usted mismo: es mucho más simple, especialmente cuando tiene interacciones o componentes no lineales.
hadley