Я хотел написать функцию, которая берет модель, вычисляет vif и возвращает новую модель с удаленными коллинеарными переменными. Вот мой код:
remodel_vif <- function(mdl, vif_cutoff){
bad_x <- mdl %>% car::vif() %>% {which(. > vif_cutoff)}
new_df <- mdl$model %>% dplyr::select(.,-bad_x)
return(lm(new_df))
}
Если я выполняю функцию, выдается ошибка:
data <- data.frame(c1 = c(1,5,3,2,1,7,7,7,6,5), c2 = 0.3*c(1:10), c3 = 0.5*c(1:10)+rnorm(10), c4 = 0.1*rnorm(10))
remodel_vif(data,2.0)
Error in model.matrix.default(mt, mf, contrasts) :
model frame and formula mismatch in model.matrix()
Однако, если я сделаю это изменение в функции:
new_df <- mdl$model %>% dplyr::select(.,-bad_x) %>% as.matrix() %>% as.data.frame()
тогда это работает:
> remodel_vif(lm(data),2)
Call:
lm(formula = new_df)
Coefficients:
(Intercept) c4
2.700 4.268
Примечание: я знаю, что эта функция не имеет особого смысла и не очень полезна - мне просто интересно, что вызывает ошибку и почему ее преобразование назад и вперед помогает.
Я нашел подобный вопрос здесь, на SE, но я не понимаю, насколько это уместно: я не использую параметры объекта исходной модели - я только извлекаю базовый фрейм данных и изменяю его. Я не вижу, как могут быть какие-то взаимодействия от удаленных переменных, висящих вокруг ...