หนึ่งพล็อตจะต่อเนื่องโดยการโต้ตอบอย่างต่อเนื่องใน ggplot2 ได้อย่างไร


11

สมมติว่าฉันมีข้อมูล:

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)

ฉันต้องการพล็อตแบบต่อเนื่องโดยการโต้ตอบแบบต่อเนื่องเช่นที่ x1 อยู่บนแกน X และ x2 แทนด้วย 3 เส้นเส้นหนึ่งซึ่งแทน x2 ที่ Z-score เป็น 0 หนึ่งที่ Z-+1 ที่ +1 Z-score ที่ -1 โดยแต่ละบรรทัดจะมีสีแยกกันและติดป้ายกำกับ ฉันจะทำสิ่งนี้โดยใช้ ggplot2 ได้อย่างไร

ตัวอย่างเช่นอาจมีลักษณะเช่นนี้ (แต่แน่นอนว่ามีเส้นสีต่างกันแทนที่จะเป็นประเภทเส้นต่างกัน): ภาพตัวอย่าง


คุณสามารถแสดงภาพตัวอย่างจากแพ็คเกจ / ซอฟต์แวร์อื่นหรือให้คำอธิบายโดยละเอียดเกี่ยวกับสิ่งที่คุณต้องการลงจุดได้หรือไม่?
daroczig

คำตอบ:


9

นี่คือรุ่นของฉันพร้อมชุดข้อมูลจำลองของคุณ:

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 และการจัดตำแหน่งคำอธิบาย

ป้อนคำอธิบายรูปภาพที่นี่


ดูดียกเว้น (แน่นอน) เราต้องปรับสเกล (x1) และสเกล (x2) ก่อน
russellpierce

1
@drknexus ใช่แน่นอน (ในการทดสอบครั้งแรกของฉันฉันใช้ตัวแปร N (0; 1) ที่ได้มาตรฐานแทนที่จะเป็นของคุณ)
chl

5

การคำนวณค่าประมาณสำหรับ y ด้วยคะแนน Z เป็น 0 ( คอลัมน์y0 ), -1 ( คอลัมน์y1m ) และ 1 ( คอลัมน์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

พล็อตเส้นที่มีฐาน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")

ป้อนคำอธิบายรูปภาพที่นี่

หากต้องการใช้ ggplot คุณสามารถโทร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")

ป้อนคำอธิบายรูปภาพที่นี่


2
คุณสามารถรับการทำนายได้โดยใช้การทำนาย dat [, "y0"] <- ทำนาย (res, newdata = data.frame (x1 = dat [, "x1"], x2 = 0)) บันทึกการพิมพ์เล็กน้อย
mpiktas

@mpiktas: ขอบคุณฉันไม่รู้เกี่ยวกับpredictแต่ดูเหมือนว่ามีประโยชน์
daroczig

1
ฉันขอแนะนำให้ใช้การทำนายแทนการคำนวณความลาดชันด้วยตัวเอง - มันง่ายกว่ามากโดยเฉพาะเมื่อคุณมีปฏิสัมพันธ์หรือส่วนประกอบที่ไม่ใช่เชิงเส้น
hadley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.