我一直在尝试手动计算多元线性回归数据集的库克距离,但遇到了 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 个预测变量。这帮助我计算了模型的库克距离。再次感谢!