Bagaimana seseorang dapat memplot kontinu dengan interaksi kontinu di ggplot2?

11

Katakanlah saya punya data:

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)

Saya ingin memplot kontinu dengan interaksi kontinu sehingga x1 berada pada sumbu X dan x2 diwakili oleh 3 baris, satu yang mewakili x2 pada skor-Z 0, satu pada Z-skor +1, dan satu lagi pada Z-score -1, dengan masing-masing garis warna terpisah dan berlabel Bagaimana saya bisa melakukan ini menggunakan ggplot2?

Misalnya, mungkin terlihat seperti ini (meskipun tentu saja dengan garis berwarna berbeda daripada jenis garis berbeda): Contoh Gambar

russellpierce
sumber
Bisakah Anda menampilkan contoh gambar dari paket / perangkat lunak lain atau memberikan deskripsi yang lebih terperinci apa yang ingin Anda plot?
daroczig

Jawaban:

9

Inilah versi saya dengan set data simulasi Anda:

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

Saya membiarkan Anda mengelola detail tentang label sumbu x dan posisi legenda.

masukkan deskripsi gambar di sini

chl
sumber
Terlihat bagus, kecuali (tentu saja) kita perlu skala (x1) dan skala (x2) terlebih dahulu.
russellpierce
1
@drknexus Ya, tentu saja (dalam tes awal saya, saya menggunakan variasi N standar (0; 1), bukan milik Anda).
chl
5

Menghitung estimasi untuk y dengan skor-Z 0 ( kolom y0 ), -1 ( kolom y1m ) dan 1 ( kolom 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

Merencanakan garis dengan 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")

masukkan deskripsi gambar di sini

Untuk menggunakan ggplot, Anda dapat memanggil 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")

masukkan deskripsi gambar di sini

daroczig
sumber
2
Anda bisa mendapatkan prediksi menggunakan prediksi. dat [, "y0"] <- prediksi (res, newdata = data.frame (x1 = dat [, "x1"], x2 = 0)) Menghemat sedikit pengetikan.
mpiktas
@mpiktas: terima kasih, saya tidak tahu predict, tapi sepertinya berguna.
daroczig
1
Saya selalu merekomendasikan menggunakan prediksi daripada menghitung sendiri lereng - ini jauh lebih sederhana terutama ketika Anda memiliki interaksi atau komponen non-linear.
Hadley