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


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


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.