Для простых моделей это относительно просто, следуя коду в методе vif()
объектов "lm"
в пакете car , как предложил Джон Фокс в ветке 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 и используем его для вычисления VIF для той же моделииспользуя lm()
, мы можем видеть, что он дает тот же результат
> require(car)
> mod <- lm(ff, data = trees)
> vif(mod)
log(Girth) log(Height)
1.391027 1.391027
vif()
выглядит немного умнее, чем код, который я показываю, так как получается, если термины модели включены в большее число коэффициентов, чем простоодин основной эффект, который предполагает мой код.В таких случаях ковариата модели будет включена в более чем один столбец / строку дисперсионно-ковариационной матрицы v
, и вам необходимо сохранить / исключить все строки / столбцы, содержащие термин, при вычислении определителей в цикле for()
.Вы можете решить это из матрицы дисперсии-ковариации, но вы можете понять это сами.
При тестировании этого, приспособьте вашу модель к небольшой случайной выборке данных, используя и biglm()
и lm()
,и вычислить VIF-коды, используя car s vif()
на полученном объекте "lm"
и вручную на объекте "biglm"
, и проверьте, совпадают ли они.