在R中从多元回归中绘制“回归线”的图表

8
我进行了多元回归分析,使用了几个连续预测变量,并且其中几个变量的结果显著,我想创建一个散点图或类似散点图来将我的因变量针对其中一个预测变量进行展示,包括"回归线"。如何实现这个操作?
我的图形看起来像这样:
D = my.data; plot( D$probCategorySame, D$posttestScore )

如果是简单回归,我可以添加一个回归线,就像这样:

如果是简单回归,我可以添加一个回归线,就像这样:

lmSimple <- lm( posttestScore ~ probCategorySame, data=D )
abline( lmSimple ) 

但是我的实际模型是这样的:
lmMultiple <- lm( posttestScore ~ pretestScore + probCategorySame + probDataRelated + practiceAccuracy + practiceNumTrials, data=D )

我希望添加一个回归线,以反映实际模型中的系数和截距,而不是简化模型中的内容。为了做到这一点,我愿意假设所有其他预测变量的平均值,虽然我准备听取相反的建议。
可能没有什么区别,但为了避免混淆,我需要说明一下,情况稍微有些复杂,因为我可能不想绘制原始数据。相反,我想绘制预测变量的分段平均值的DV,如下所示:
D[,'probCSBinned'] = cut( my.data$probCategorySame, as.numeric( seq( 0,1,0.04 ) ), include.lowest=TRUE, right=FALSE, labels=FALSE )
D = aggregate( posttestScore~probCSBinned, data=D, FUN=mean )
plot( D$probCSBinned, D$posttestScore )

我之所以这样做,是因为这样对我的数据看起来更加清晰。


1
你不能绘制单个预测器而不指定该图的所有其他预测器的(静态)值。您能澄清您想要显示什么吗? - Carl Witthoft
已添加澄清,谢谢。我想我倾向于假设所有其他预测变量都假定其均值。 - baixiwei
3个回答

11

要绘制线性或广义线性模型(即使用 lm glm 拟合)中的各个项,请使用 termplot 。无需进行分箱或其他操作。

# plot everything on one page
par(mfrow=c(2,3))
termplot(lmMultiple)

# plot individual term
par(mfrow=c(1,1))
termplot(lmMultiple, terms="preTestScore")

2
你好。我尝试了termplot,但它会将每个绘图分别显示在不同的图形上。请问如何将它们绘制在同一张图上? - skan

6
您需要创建一个x值向量,该向量处于绘图区域内,并预测它们对应的模型y值。为此,您需要将这个向量注入到一个数据框中,该数据框由与您的模型中相匹配的变量组成。您表示您可以保持其他变量的平均值不变,因此在我的解决方案中我使用了这种方法。在设置这个过程时,您可能应该考虑预测的x值是否实际上是合法的,考虑到绘图中的其他值。
如果没有示例数据,我不能确定这对您是否完全有效,所以如果下面有任何错误,请您原谅,但这应该至少阐明了这种方法。
# Setup
xmin = 0; xmax=10 # domain of your plot
D = my.data
plot( D$probCategorySame, D$posttestScore, xlim=c(xmin,xmax) )
lmMultiple <- lm( posttestScore ~ pretestScore + probCategorySame + probDataRelated + practiceAccuracy + practiceNumTrials, data=D )

# create a dummy dataframe where all variables = their mean value for each record
# except the variable we want to plot, which will vary incrementally over the 
# domain of the plot. We need this object to get the predicted values we
# want to plot.
N=1e4
means = colMeans(D)
dummyDF = t(as.data.frame(means))
for(i in 2:N){dummyDF=rbind(dummyDF,means)} # There's probably a more elegant way to do this.
xv=seq(xmin,xmax, length.out=N)
dummyDF$probCSBinned = xv 
# if this gives you a warning about "Coercing LHS to list," use bracket syntax:
#dummyDF[,k] = xv # where k is the column index of the variable `posttestScore`

# Getting and plotting predictions over our dummy data.
yv=predict(lmMultiple, newdata=subset(dummyDF, select=c(-posttestScore)))
lines(xv, yv)

谢谢!这种方法行得通,只是在“预测”内部我不得不使用“newdata”而不是“data”。 - baixiwei
有时它会显示:在termplot(mymodel)中发出警告: “model”似乎涉及交互作用:请参阅帮助页面,它只绘制其中一条线。 - skan

3

在TeachingDemos包中,可以使用Predict.Plot函数来绘制一个预测变量与其他预测变量给定值下的响应变量之间的关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接