线性模型的部分残差图包括相互作用项

时间:2014-07-25 14:14:34

标签: r plot statistics

我的模型包含一个响应变量,五个预测变量和一个预测变量_1和预测变量_2的交互项。我想为每个预测变量绘制部分残差图,我通常会使用包crPlots中的car函数来实现。不幸的是,该功能抱怨它不适用于包含交互术语的模型。

还有另一种做我想做的事吗?

编辑:我创建了一个说明问题的小例子

require(car)
R <-  c(0.53,0.60,0.64,0.52,0.75,0.66,0.71,0.49,0.52,0.59)
P1 <- c(3.1,1.8,1.8,1.8,1.8,3.2,3.2,2.8,3.1,3.3)
P2 <- c(2.1,0.8,0.3,0.5,0.4,1.3,0.5,1.2,1.6,2.1)

lm.fit1 <- lm(R ~ P1 + P2)
summary(lm.fit1)
crPlots(lm.fit1) # works fine

lm.fit2 <- lm(R ~ P1*P2)
summary(lm.fit2)
crPlots(lm.fit2) # not available

2 个答案:

答案 0 :(得分:5)

另一种方法是将交互项放在一个单独的变量中(避免攻击crPlot(...)的代码。)

df <- data.frame(R,P1,P2,P1.P2=P1*P2)
lm.fit1 <- lm(R ~ ., df)
summary(lm.fit1)
crPlots(lm.fit1)

请注意,summary(lm.fit1)summary(lm(R~P1*P2,df))的结果完全相同。

答案 1 :(得分:0)

我必须承认我并不熟悉部分残差图,所以我并不完全确定应该给出一个交互项的正确解释。但基本上,相当于

crPlot(lm.fit1, "P1")

x <- predict(lm.fit1, type="term", term="P1")
y <- residuals(lm.fit1, type="partial")[,"P1"]
plot(x, y)
abline(lm(y~x), col="red", lty=2)
loessLine(x,y,col="green3",log.x = FALSE, log.y = FALSE, smoother.args=list())

所以真的,没有真正的理由同样的想法也不能用于交互术语。由于交互作为一个单独的实体,我们只是将变量的部分贡献留下来,而只关注非交互贡献。所以我要做的就是取出对交互项的检查,然后我们可以使用该功能。假设

body(car:::crPlot.lm)[[11]]
# if (any(attr(terms(model), "order") > 1)) {
#     stop("C+R plots not available for models with interactions.")
# }

我们可以复制和修改以创建一个没有检查的新功能

crPlot2 <- car:::crPlot.lm
body(crPlot2) <- body(crPlot2)[-11]
environment(crPlot2) <- asNamespace("car")

然后我们可以运行

layout(matrix(1:2, ncol=2))
crPlot2(lm.fit2, "P1")
crPlot2(lm.fit2, "P2")

获取

enter image description here

我确信作者有充分的理由不将模型与交互术语合并,因此使用此hack需要您自担风险。在制作情节时,我不清楚交互项中的残差会发生什么。