Як можна зробити один сюжет безперервним шляхом безперервної взаємодії в 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-балі 0, один на Z-бал +1, а інший на a Z-бал -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
Я завжди рекомендую використовувати прогнозування, а не самостійно розраховувати схили - це набагато простіше, особливо коли у вас взаємодія або нелінійні компоненти.
хадлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.