我的模型包含一个响应变量,五个预测变量和一个预测变量_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
答案 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")
获取
我确信作者有充分的理由不将模型与交互术语合并,因此使用此hack需要您自担风险。在制作情节时,我不清楚交互项中的残差会发生什么。