どのようにして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本の線で表されるように、連続的な相互作用による連続をプロットしたいと思います。 Zスコアは-1で、各線は個別の色でラベル付けされています。ggplot2を使用してこれを行うにはどうすればよいですか?

たとえば、次のようになります(もちろん、線の種類が異なるのではなく、色付きの線が異なります)。 画像の例


他のパッケージ/ソフトウェアのサンプル画像を表示したり、プロットしたいものをより詳細に説明したりできますか?
daroczig 01年

回答:


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軸のラベルと凡例の配置の詳細を管理できます。

ここに画像の説明を入力してください


(もちろん)最初にscale(x1)とscale(x2)を指定する必要があることを除いて、見栄えは良いです。
russellpierce

1
@drknexusはい、もちろんです(私の最初のテストでは、標準化されたN(0; 1)変量を使用しました)。
chl

5

Zスコアが0(y0列)、-1(y1m列)および1(y1p列)のyの推定値を計算します。

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

baseでラインをプロットする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"] <-predict(res、newdata = data.frame(x1 = dat [、 "x1"]、x2 = 0))入力を少し節約します。
mpiktas '26年

@mpiktas:ありがとう、私は知りませんでしたがpredict、役に立ちそうです。
daroczig、2011年

1
自分で勾配を計算する代わりに、予測を使用することを常にお勧めします。特に、相互作用や非線形コンポーネントがある場合は、はるかに簡単です。
ハドリー2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.