web-dev-qa-db-ja.com

線形モデルから交互作用効果をプロットするための最良の方法

ここにRタグを入力できるようにするために、学生からよく寄せられる質問をいくつか投稿します。私は何年にもわたってこれらに対する独自の答えを開発してきましたが、おそらく私が知らないより良い方法が浮かんでいます。

質問:連続変数yxを使用して回帰を実行しましたが、因子flevels(f)c("level1","level2")を生成します)

_ thelm <- lm(y~x*f,data=thedata)
_

ここで、yの予測値をxでプロットし、fで定義されたグループごとに分類します。私が得るすべてのプロットは醜く、あまりにも多くの線を示しています。

私の答え:predict()関数を試してください。

_##restrict prediction to the valid data 
##from the model by using thelm$model rather than thedata

 thedata$yhat <- predict(thelm,
      newdata=expand.grid(x=range(thelm$model$x),
                          f=levels(thelm$model$f)))

 plot(yhat~x,data=thethedata,subset=f=="level1")
 lines(yhat~x,data=thedata,subset=f=="level2")
_

(1)初心者にとって理解しやすい、および/または(2)他の観点からより良いアイデアは他にありますか?

15
Jake

効果パッケージには、回帰の予測値を視覚化するための優れたプロット方法があります。

thedata<-data.frame(x=rnorm(20),f=rep(c("level1","level2"),10))
thedata$y<-rnorm(20,,3)+thedata$x*(as.numeric(thedata$f)-1)

library(effects)
model.lm <- lm(formula=y ~ x*f,data=thedata)
plot(effect(term="x:f",mod=model.lm,default.levels=20),multiline=TRUE)
18
Ian Fellows

ええと-まだ私の脳をexpand.grid()に巻きつけようとしています。比較のために、これは私がそれを行う方法です(ggplot2を使用):

thedata <- data.frame(predict(thelm), thelm$model$x, thelm$model$f)

ggplot(thedata, aes(x = x, y = yhat, group = f, color = f)) + geom_line()

Ggplot()ロジックは非常に直感的だと思います-行をfでグループ化して色付けします。グループの数が増えるにつれ、それぞれにレイヤーを指定する必要がなくなると、ますます役に立ちます。

3
Matt Parker

私はRの専門家ではありませんが、次のものを使用します。

xyplot(y ~ x, groups= f, data= Dat, type= c('p','r'), 
   grid= T, lwd= 3, auto.key= T,)

これもオプションです。

interaction.plot(f,x,y, type="b", col=c(1:3), 
             leg.bty="0", leg.bg="beige", lwd=1, pch=c(18,24), 
             xlab="", 
             ylab="",
             trace.label="",
             main="Interaction Plot")
2

これは、Mattによる優れた提案への小さな変更と、Helgiに似ていますが、ggplotを使用したソリューションです。上記との唯一の違いは、回帰直線を直接プロットするgeom_smooth(method = 'lm)を使用したことです。

set.seed(1)
y = runif(100,1,10)
x = runif(100,1,10)
f = rep(c('level 1','level 2'),50)
thedata = data.frame(x,y,f)
library(ggplot2)
ggplot(thedata,aes(x=x,y=y,color=f))+geom_smooth(method='lm',se=F)
0
Vishal Lala