我参考这篇文章http://r.789695.n4.nabble.com/Questions-about-biglm-td878929.html,讨论如何使用biglm获取VIF。
是否有另一种方法可以从biglm生成的对象中获取VIF?
感谢您的帮助
答案 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)
接下来,要在
中保留VIFres <- 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()
对象上并检查它们是否同意。