我正在使用 R 包MuMIn
进行多模型推理,并使用函数model.avg
来平均由一组模型估计的系数。为了直观地将数据与基于平均系数的估计关系进行比较,我想使用部分残差图,类似于包crPlots
函数创建的那些car
。我已经尝试了三种方法,但我不确定是否合适。这是一个演示。
library(MuMIn)
# Loading the data
data(Cement)
# Creating a full model with all the covariates we are interested in
fullModel <- lm(y ~ ., data = Cement, na.action=na.fail)
# Getting all possible models based on the covariates of the full model
muModel <- dredge(fullModel)
# Averaging across all models
avgModel <- model.avg(muModel)
# Getting the averaged coefficients
coefMod <- coef(avgModel)
coefMod
# (Intercept) X1 X2 X4 X3
# 65.71487660 1.45607957 0.61085531 -0.49776089 -0.07148454
选项 1:使用crPlots
library(car) # For crPlots
# Creating a duplicate of the fullMode
hackModel <- fullModel
# Changing the coefficents to the averaged coefficients
hackModel$coefficients <- coefMod[names(coef(fullModel))]
# Changing the residuals
hackModel$residuals <- Cement$y - predict(hackModel)
# Plot the hacked model vs the full model
layout(matrix(1:8, nrow=2, byrow=TRUE))
crPlots(hackModel, layout=NA)
crPlots(fullModel, layout=NA)
请注意,具有平均系数的完整版本和破解版本的 crPlot 是不同的。
这里的问题是:这合适吗?结果依赖于我在这个答案中找到的一个 hack 。除了残差和系数之外,我是否需要更改模型的其他部分?
选项 2:自制地块
# Partial residuals: residuals(hacked model) + beta*x
# X1
# Get partial residuals
prX1 <- resid(hackModel) + coefMod["X1"]*Cement$X1
# Plot the partial residuals
plot(prX1 ~ Cement$X1)
# Add modeled relationship
abline(a=0,b=coefMod["X1"])
# X2 - X4
plot(resid(hackModel) + coefMod["X2"]*X2 ~ X2, data=Cement); abline(a=0,b=coefMod["X2"])
plot(resid(hackModel) + coefMod["X3"]*X3 ~ X3, data=Cement); abline(a=0,b=coefMod["X3"])
plot(resid(hackModel) + coefMod["X4"]*X4 ~ X4, data=Cement); abline(a=0,b=coefMod["X4"])
情节看起来与crPlots
上面制作的情节不同。
部分残差具有相似的模式,但它们的值和建模关系不同。值的差异似乎是由于 crPlots 使用居中的部分残差这一事实(有关 R 中部分残差的讨论,请参见此答案)。这使我想到了第三个选择。
选项 3:具有居中部分残差的自制图
# Get the centered partial residuals
pRes <- resid(hackModel, type='partial')
# X1
# Plot the partial residuals
plot(pRes[,"X1"] ~ Cement$X1)
# Plot the component - modeled relationship
lines(coefMod["X1"]*(X1-mean(X1))~X1, data=Cement)
# X2 - X4
plot(pRes[,"X2"] ~ Cement$X2); lines(coefMod["X2"]*(X2-mean(X2))~X2, data=Cement)
plot(pRes[,"X3"] ~ Cement$X3); lines(coefMod["X3"]*(X3-mean(X3))~X3, data=Cement)
plot(pRes[,"X4"] ~ Cement$X4); lines(coefMod["X4"]*(X4-mean(X4))~X4, data=Cement)
现在我们的值与crPlots
上述相似,但关系仍然不同。差异可能与截距有关。但我不确定我应该使用什么来代替 0。
关于哪种方法更合适的任何建议?有没有更直接的方法来获得基于模型平均系数的部分残差图?
非常感谢!