如何使用biglm包获取VIF?

时间:2011-08-09 10:22:03

标签: r regression

我参考这篇文章http://r.789695.n4.nabble.com/Questions-about-biglm-td878929.html,讨论如何使用biglm获取VIF。

是否有另一种方法可以从biglm生成的对象中获取VIF?

感谢您的帮助

1 个答案:

答案 0 :(得分:6)

对于简单模型,按照汽车包中的vif()对象"lm"方法中的代码,这相对容易,正如John Fox在R-Help中提到的那样你链接的线程。您不能直接使用汽车包,因为它使用模型矩阵,biglm()无法实现。为了说明如何执行此操作,请考虑?biglm

中的简单示例
require(biglm)
data(trees)
ff <- log(Volume) ~ log(Girth) + log(Height)
chunk1<-trees[1:10,]
chunk2<-trees[11:20,]
chunk3<-trees[21:31,]
a <- biglm(ff,chunk1)
a <- update(a,chunk2)
a <- update(a,chunk3)

拟合模型在a中,我们从中提取参数的方差 - 协方差矩阵,删除截距,计算相关矩阵R及其行列式:

v <- vcov(a)
## drop intercept
v <- v[-1, -1, drop = FALSE]
R <- cov2cor(v)
detR <- det(R)

接下来,要在

中保留VIF
res <- numeric(length = ncol(v))
names(res) <- colnames(v)

最后,循环模型术语(减去截距)并计算每个术语的VIF

for(i in seq_len(ncol(v))) {
    res[i] <- det(R[i, i, drop = FALSE]) * det(R[-i, -i, drop = FALSE]) / detR
}

这导致:

> res
 log(Girth) log(Height) 
   1.391027    1.391027

如果我们加载 car 包并使用它来计算使用lm()拟合的相同模型的VIF,我们可以看到它提供了相同的输出

> require(car)
> mod <- lm(ff, data = trees)
> vif(mod)
 log(Girth) log(Height) 
   1.391027    1.391027

vif()看起来比我展示的代码更聪明,因为如果模型术语包含在更多系数中,而不仅仅是我的代码所假设的一个主效应。在这种情况下,模型协变量将包含在多个方差 - 协方差矩阵v的列/行中,并且您需要在计算{{1}中的决定因素时保留/排除包含该术语的所有行/列循环。你可以从方差 - 协方差矩阵中解决这个问题,但你可以自己解决这个问题。

测试时,请使用for()biglm()将模型拟合到数据的小型随机样本中,并使用 car {{1}计算VIF在生成的lm()对象上,手动放在vif()对象上并检查它们是否同意。