Comment peut-on tracer des interactions continues par continues dans ggplot2?

11

Disons que j'ai des données:

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)

Je veux tracer l'interaction continue par continue de telle sorte que x1 soit sur l'axe X et x2 soit représenté par 3 lignes, une qui représente x2 à un score Z de 0, une à un score Z de +1 et une autre à un Score Z de -1, avec chaque ligne une couleur distincte et étiquetée. Comment puis-je faire cela en utilisant ggplot2?

Par exemple, cela pourrait ressembler à quelque chose comme ça (bien sûr avec des lignes de couleurs différentes plutôt que des types de lignes différents): Exemple d'image

russellpierce
la source
Pourriez-vous montrer un exemple d'image d'un autre package / logiciel ou donner une description plus détaillée de ce que vous voulez tracer?
daroczig

Réponses:

9

Voici ma version avec votre jeu de données simulé:

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

Je vous laisse gérer les détails sur les étiquettes des axes x / y et le positionnement des légendes.

entrez la description de l'image ici

chl
la source
Cela semble bon, sauf (bien sûr) que nous aurions besoin de mettre à l'échelle (x1) et à l'échelle (x2) en premier.
russellpierce
1
@drknexus Oui, bien sûr (lors de mes premiers tests, j'ai utilisé des variables N (0; 1) standardisées, au lieu des vôtres).
chl
5

Calcul des estimations pour y avec un score Z de 0 ( colonne y0 ), -1 ( colonne y1m ) et 1 ( colonne 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

Tracer les lignes avec la 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")

entrez la description de l'image ici

Pour utiliser ggplot, vous pouvez appeler 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")

entrez la description de l'image ici

Daroczig
la source
2
vous pouvez obtenir des prédictions en utilisant Predict. dat [, "y0"] <- Predict (res, newdata = data.frame (x1 = dat [, "x1"], x2 = 0)) Enregistre un peu de saisie.
mpiktas
@mpiktas: merci, je ne connaissais pas predict, mais semble utile.
daroczig
1
Je recommanderais toujours d'utiliser Predict au lieu de calculer les pentes vous-même - c'est beaucoup plus simple, surtout lorsque vous avez des interactions ou des composants non linéaires.
hadley