Wie kann man durch kontinuierliche Wechselwirkungen in ggplot2 kontinuierlich zeichnen?

11

Angenommen, ich habe Daten:

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)

Ich möchte die kontinuierliche durch kontinuierliche Interaktion so darstellen, dass x1 auf der X-Achse liegt und x2 durch 3 Linien dargestellt wird, von denen eine x2 bei einem Z-Score von 0, eine bei einem Z-Score von +1 und eine andere bei a darstellt Z-Score von -1, wobei jede Linie eine eigene Farbe hat und beschriftet ist. Wie kann ich das mit ggplot2 machen?

Zum Beispiel könnte es ungefähr so ​​aussehen (obwohl natürlich mit verschiedenfarbigen Linien anstatt mit verschiedenen Linientypen): Beispielbild

russellpierce
quelle
Könnten Sie ein Beispielbild aus einem anderen Paket / einer anderen Software zeigen oder eine detailliertere Beschreibung geben, was Sie zeichnen möchten?
Daroczig

Antworten:

9

Hier ist meine Version mit Ihrem simulierten Datensatz:

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

Ich lasse Sie die Details zu Beschriftungen der x / y-Achse und zur Positionierung der Legende verwalten.

Geben Sie hier die Bildbeschreibung ein

chl
quelle
Sieht gut aus, außer (natürlich) müssten wir zuerst (x1) und (x2) skalieren.
Russellpierce
1
@drknexus Ja, natürlich (in meinen ersten Tests habe ich standardisierte N (0; 1) -Variaten anstelle Ihrer verwendet).
Chl
5

Berechnung der Schätzungen für y mit einem Z-Score von 0 ( y0- Spalte), -1 ( y1m- Spalte) und 1 ( y1p- Spalte):

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

Zeichnen der Linien mit Basis 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")

Geben Sie hier die Bildbeschreibung ein

Um ggplot zu verwenden, können Sie geom_line aufrufen :

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

Geben Sie hier die Bildbeschreibung ein

daroczig
quelle
2
Sie können Vorhersagen mit Vorhersagen erhalten. dat [, "y0"] <- Vorhersagen (res, newdata = data.frame (x1 = dat [, "x1"], x2 = 0)) Spart ein wenig Eingabe.
mpiktas
@mpiktas: danke, ich wusste nichts davon predict, scheint aber nützlich.
Daroczig
1
Ich würde immer empfehlen, Vorhersagen zu verwenden, anstatt die Steigungen selbst zu berechnen - dies ist viel einfacher, insbesondere wenn Sie Interaktionen oder nichtlineare Komponenten haben.
Hadley