Как получить VIF используя пакет biglm? - PullRequest
2 голосов
/ 09 августа 2011

Я ссылаюсь на этот пост http://r.789695.n4.nabble.com/Questions-about-biglm-td878929.html, в котором рассказывается, как получить VIF с помощью biglm.

Есть ли альтернативный способ получения VIF от объекта, созданного biglm?

Спасибо за вашу помощь

1 Ответ

6 голосов
/ 09 августа 2011

Для простых моделей это относительно просто, следуя коду в методе 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", и проверьте, совпадают ли они.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...