手动计算mtcars数据集的方差膨胀因子(VIF)时与car包结果不一致的问题排查
手动计算mtcars数据集的方差膨胀因子(VIF)时与car包结果不一致的问题排查
嗨,Lara,我来帮你揪出问题的根源~
你手动计算VIF时出现的偏差,核心是对VIF的计算逻辑理解有一点小偏差,具体来说是在计算disp的VIF时,错误地排除了关键自变量cyl。
先明确VIF的正确计算逻辑
方差膨胀因子的定义是:对于全模型(也就是你用lm(mtcars[,1] ~ ., mtcars[,-1])构建的mpg ~ cyl + disp + hp + ... + carb模型)中的每个自变量Xᵢ,VIFᵢ = 1/(1-R²ᵢ)。这里的R²ᵢ是把Xᵢ作为因变量,对全模型里其他所有自变量做回归得到的决定系数。
你的错误点拆解
当你计算disp的VIF时,写的代码是:
fit2 <- lm(mtcars[,3] ~ ., mtcars[,- c(1:3)])
这里mtcars[,-c(1:3)]意味着你去掉了第1列(响应变量mpg)、第2列(cyl)、第3列(当前因变量disp)。但按照VIF的要求,你只需要去掉响应变量mpg和当前因变量disp,cyl是全模型里的其他自变量,必须保留在回归式中!
修正后的代码验证
调整数据子集的选择,保留cyl再计算:
# 正确计算disp的VIF:将disp作为因变量,对除mpg和disp外的所有自变量回归 fit2_correct <- lm(mtcars[,3] ~ ., mtcars[, -c(1,3)]) summary(fit2_correct)$r.squared # 输出约为0.9538 1/(1-summary(fit2_correct)$r.squared) # 此时结果就会和car包给出的21.620241完全一致啦!
补充验证逻辑
你之前计算cyl的VIF是正确的,因为你用的mtcars[,-c(1:2)]刚好去掉了响应变量mpg和当前因变量cyl,剩下的disp、hp等都是全模型里的其他自变量,完全符合VIF的计算要求。
总结一下:计算某个自变量的VIF时,回归模型的自变量应该是全模型中除响应变量和当前这个自变量之外的所有其他自变量,可不能额外排除其他变量哦~
备注:内容来源于stack exchange,提问作者Lara
相关产品推荐
相关产品推荐

