Существует ли функция для подстановки (или вообще удаления), объясняющая переменные в линейной модели (lm)? - PullRequest
2 голосов
/ 30 апреля 2020

Это мой первый вопрос на stackoverflow.com, поэтому не стесняйтесь указывать на мои ошибки при «задании вопросов», а также на ошибки кода. Кстати, Engli sh не мой родной язык, поэтому я постараюсь изо всех сил.

У меня есть линейная модель с множеством объясняющих переменных (независимых переменных)

model <- lm(y ~ x1 + x2 + x3 + ... + x100)

некоторые из которых линейно зависят друг от друга (мультиколлинеарность).

Я хочу, чтобы аппарат искал имя объясняющей переменной, которая имеет самый высокий коэффициент VIF (например, x2), удалил ее из формулы и затем запустил старую функцию lm с новой формулой

model <- lm(y ~ x1 + x3 + ... + x100)

Я уже научился извлекать имя объясняющей переменной, которая имеет самый высокий коэффициент VIF:

max_vif <- function(x) {
  vifac <- data.frame(vif(x))
  nameofmax <- rownames(which(vifac == max(vifac), arr.ind = TRUE))
  return(nameofmax)
}

Но я все еще не понимаю, как искать нужную объясняющую переменную, удалите ее из формулы и снова запустите функцию.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Проблема решена!

Я создал список, содержащий все переменные для lm модель:

Price <- list(y,x1,...,x100)

Затем я использовал другой способ установки lm модель:

model <- lm(y ~ ., data = Price)

Таким образом, мы можем просто удалить переменную с самым высоким VIF из списка Price.

С функцией, которую я уже выполнил, код будет:

Price <- list(y,x1,x2,...,x100)

model <- lm(y ~ ., data = Price)

max_vif <- function(x) { # Function for finding name of variable with the highest VIF
  vifac <- data.frame(vif(x))
  nameofmax <- rownames(which(vifac == max(vifac), arr.ind = TRUE))
  return(nameofmax)
}


n <- max(data.frame(vif(model)))

while(n >= 5) { # Loop for deleting variable with the highest VIF from `Price` list one after another, untill there is no VIF equal or higher then 5 
  Price[[m]] <- NULL
  model_auto <- lm(y ~ ., data = Price)
  m <- max_vif(model)
  n <- max(data.frame(vif(model)))

}
0 голосов
/ 30 апреля 2020

Мы можем использовать функцию update и вставить в столбец, который необходимо удалить. Сначала мы можем подобрать модель, а затем использовать обновление, чтобы изменить формулу этой модели. Формула модели может быть выражена в виде символьной строки, которая позволяет объединить общую формулу .~. и любые переменные, которые вы хотите удалить (используя знак минус -).

Здесь Вот пример:

fit1 <- lm(wt ~ mpg + cyl + am, data = mtcars)
coef(fit1)

# (Intercept)         mpg         cyl          am 
#  4.83597190 -0.09470611  0.08015745 -0.52182463 

rm_var <- "am"
fit2 <- update(fit1, paste0(".~. - ", rm_var))
coef(fit2)

# (Intercept)         mpg         cyl 
#  5.07595833 -0.11908115  0.08625557 

Используя max_vif, мы можем заключить это в функцию:

rm_max_vif <- function(x){
  # find variable(s) needing to be removed
  rm_var <- max_vif(x)
  # concatenate with "-" to remove variable(s) from formula
  rm_var <- paste(paste0("-", rm_var), collapse = " ")
  # update model
  update(x, paste0(".~.", rm_var))
}
...