Как можно построить непрерывный непрерывный взаимодействия в 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, а другая при Z-оценка -1, с каждой строкой отдельный цвет и помечены. Как я могу сделать это с помощью ggplot2?

Например, это может выглядеть примерно так (хотя, конечно, с разными цветными линиями, а не с разными типами линий): Пример изображения

russellpierce
источник
Не могли бы вы показать пример изображения из другого пакета / программного обеспечения или дать более подробное описание того, что вы хотите построить?
Дарочиг

Ответы:

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

введите описание изображения здесь

daroczig
источник
2
вы можете получить прогнозы с помощью предсказать. dat [, "y0"] <- предикат (res, newdata = data.frame (x1 = dat [, "x1"], x2 = 0)) Сохраняет немного ввода.
mpiktas
@mpiktas: спасибо, я не знал о predict, но кажется полезным.
Дарочиг
1
Я бы всегда рекомендовал использовать прогнозирование вместо вычисления уклонов самостоятельно - это намного проще, особенно если у вас есть взаимодействия или нелинейные компоненты.
Хэдли