gpt4 book ai didi

r - 如何使用biglm包获取VIF?

转载 作者:行者123 更新时间:2023-12-04 12:30:09 24 4
gpt4 key购买 nike

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

是否有其他方法可以从 biglm 生成的对象中获取 VIF?

感谢您的帮助

最佳答案

对于简单模型,按照 car 包中 "lm" 对象的 vif() 方法中的代码相对容易,正如 John Fox 在您链接到的 R-Help 线程中建议的那样。您不能直接使用 car 包,因为它使用模型矩阵,而使用 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 的多列/行中,并且在计算模型中的行列式时,您需要保留/排除包含该项的所有行/列。 for() 循环。您可以从方差-协方差矩阵中计算出来,但您也可以自己计算出来。

测试时,使用 biglm()lm() 将您的模型拟合到一小部分随机数据样本,并使用 计算 VIF carvif() 作用于生成的 "lm" 对象,并手 Action 用于 "biglm" 对象并检查它们同意。

关于r - 如何使用biglm包获取VIF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6994675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com