手动计算厨师烹饪距离......遇到for循环问题

时间:2018-04-17 00:34:02

标签: r for-loop linear-regression

我一直试图为多元线性回归数据集手动计算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的乘积。

谢谢!

1 个答案:

答案 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个预测变量。这有助于我计算模型的库克距离。再次感谢!