Bir grafik ggplot2'de sürekli etkileşimlerle nasıl sürekli olabilir?


11

Diyelim ki verilerim var:

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)

Sürekli etkileşimle, x1'in X ekseninde olacağı ve x2'nin 0, Z2 skorunda x2, biri +1 Z skorunda ve diğeri de Z puanı -1, her satır ayrı bir renkte ve etiketlenir. Bunu ggplot2 kullanarak nasıl yapabilirim?

Örneğin, şöyle görünebilir (elbette farklı çizgi türlerinden ziyade farklı renkli çizgilerle): Örnek Resim


Başka bir paket / yazılımdan örnek bir resim gösterebilir veya çizmek istediğiniz şeyi daha ayrıntılı bir şekilde açıklayabilir misiniz?
daroczig

Yanıtlar:


9

Simüle edilmiş veri kümenizdeki sürümüm:

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

X / y ekseni etiketleri ve gösterge konumlandırması hakkındaki ayrıntıları yönetmenize izin verdim.

resim açıklamasını buraya girin


İyi görünüyor, (elbette) önce (x1) ve (x2) ölçeklememiz gerekecekti.
11:13, russellpierce

1
@drknexus Evet, elbette (ilk testlerimde, sizin yerine standartlaştırılmış N (0; 1) varyasyonları kullandım).
chl

5

Y için tahminlerin Z skoru 0 ( y0 sütun), -1 ( y1m sütun) ve 1 ( y1p sütun) ile hesaplanır :

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

Çizgileri tabanla çizme 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")

resim açıklamasını buraya girin

Ggplot kullanmak için, çağırabilir 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")

resim açıklamasını buraya girin


2
tahmin kullanarak tahminler alabilirsiniz. dat [, "y0"] <- tahmin (res, newdata = data.frame (x1 = dat [, "x1"], x2 = 0)) Yazarken biraz tasarruf sağlar.
mpiktas

@mpiktas: teşekkür ederim, bilmiyordum predictama faydalı görünüyor.
daroczig

1
Her zaman yamaçları kendiniz hesaplamak yerine tahmin kullanmanızı tavsiye ederim - özellikle etkileşimler veya doğrusal olmayan bileşenler olduğunda çok daha basittir.
hadley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.