我一直试图为多元线性回归数据集手动计算Cook的距离,但遇到for循环的问题。我一直在做的是:
这是原始的线性模型,以及相关的拟合值,长度=' n'。
{fitted = lm10$fitted.values}
这是我用来保存新拟合值的新的n X n空白矩阵。
{lev.mat <- matrix(rep(0, nrow(X.des)^2), nrow = nrow(X.des))}
我想节省时间,所以我手动填写了矩阵的第一列。
{newData = as.data.frame(X.des[-1,])
newModel = lm(fev~., data = newData - 1)
newFitted = newModel$fitted.values
newDist = c(fitted[1],newFitted)
lev.mat[,1] = newDist}
然后我尝试使用for循环来填充lev.mat的其余列。
for(i in 2:nrow(lev.mat)){
newData = as.data.frame(X.des[-i, ])
newModel = lm(fev~., data = newData - 1)
newFitted = newModel$fitted.values
newDist = c(newFitted[1:(i-1)],fitted[i],newFitted[i:length(newFitted)])
lev.mat[,i] = newDist
}
但我不断反复收到这个错误:
{Error in lev.mat[, i] <- newDist :
number of items to replace is not a multiple of replacement length}
我现在已经在这里工作了三个小时,而且令人沮丧。任何人都可以指出错误并帮助我继续前进吗?我的净步骤是计算新拟合值矩阵中原始拟合值与每列值之间的差异,对差异求和,并除以预测变量数和MSE的乘积。
谢谢!
答案 0 :(得分:0)
非常感谢@Harlan Nelson为我提供了一个很棒的链接!我使用链接here中提供的背景来完成我的工作。这是我的其余代码:
Hmat = hatvalues(lm10)
Leverage = Hmat/(1 - Hmat)
mse = (lm10$residuals)^2/var(lm10$residuals)
CooksD <- (1/6)*(mse)*Leverage
lm10是我的线性模型的名称,我在模型中有6个预测变量。这有助于我计算模型的库克距离。再次感谢!