手动计算库克在 R 中的距离...遇到 for 循环问题



我一直在尝试手动计算多元线性回归数据集的库克距离,但遇到了 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 的乘积。

谢谢!

非常感谢@Harlan Nelson为我提供了一个精彩的链接!我使用此处链接中提供的背景来完成我的工作。这是我的其余代码:

Hmat = hatvalues(lm10)
Leverage = Hmat/(1 - Hmat)
mse = (lm10$residuals)^2/var(lm10$residuals)
CooksD <- (1/6)*(mse)*Leverage

lm10 是我的线性模型的名称,模型中有 6 个预测变量。这帮助我计算了模型的库克距离。再次感谢!

相关内容

最新更新