Làm thế nào một âm mưu có thể liên tục bằng các tương tác liên tục trong ggplot2?


11

Hãy nói rằng tôi có dữ liệu:

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)

Tôi muốn vẽ biểu đồ liên tục bằng tương tác liên tục sao cho x1 nằm trên trục X và x2 được biểu thị bằng 3 dòng, một dòng biểu thị x2 ở điểm Z là 0, một ở điểm Z là +1 và khác ở điểm Z Điểm Z là -1, với mỗi dòng một màu riêng biệt và được dán nhãn. Làm thế nào tôi có thể làm điều này bằng cách sử dụng ggplot2?

Ví dụ: nó có thể trông giống như thế này (mặc dù tất nhiên với các dòng màu khác nhau thay vì các loại dòng khác nhau): Hình ảnh ví dụ


Bạn có thể hiển thị một hình ảnh ví dụ từ một gói / phần mềm khác hoặc đưa ra một mô tả chi tiết hơn những gì bạn muốn vẽ?
daroczig

Câu trả lời:


9

Đây là phiên bản của tôi với bộ dữ liệu mô phỏng của bạn:

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

Tôi cho phép bạn quản lý các chi tiết về nhãn trục x / y và định vị chú giải.

nhập mô tả hình ảnh ở đây


Có vẻ tốt, ngoại trừ (tất nhiên) chúng ta sẽ cần chia tỷ lệ (x1) và tỷ lệ (x2) trước.
russellpierce

1
@drknexus Vâng, tất nhiên (trong các thử nghiệm ban đầu của tôi, tôi đã sử dụng các biến thể N (0; 1) được tiêu chuẩn hóa, thay vì của bạn).
chl

5

Tính toán các ước tính cho y với điểm Z là 0 ( cột y0 ), -1 ( cột y1m ) và 1 ( cột 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

Vẽ các đường với cơ sở 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")

nhập mô tả hình ảnh ở đây

Để sử dụng ggplot, bạn có thể gọi 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")

nhập mô tả hình ảnh ở đây


2
bạn có thể nhận được dự đoán bằng cách sử dụng dự đoán. dat [, "y0"] <- dự đoán (res, newdata = data.frame (x1 = dat [, "x1"], x2 = 0)) Lưu một chút khi gõ.
mpiktas

@mpiktas: cảm ơn bạn, tôi không biết predict, nhưng có vẻ hữu ích.
daroczig

1
Tôi luôn khuyên bạn nên sử dụng dự đoán thay vì tự tính toán độ dốc - đơn giản hơn nhiều đặc biệt là khi bạn có các tương tác hoặc các thành phần phi tuyến tính.
hadley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.