首页 > 解决方案 > 是否有用于替换(或完全删除)解释线性模型(lm)中的变量的函数?

问题描述

我有一个包含许多解释变量(自变量)的线性模型

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)
}

但我仍然不明白如何搜索所需的解释变量,将其从公式中删除并再次运行该函数。

标签: rlinear-regressionlm

解决方案


问题解决了!

我创建了一个包含lm模型所有变量的列表:

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

然后我使用不同的方式设置lm模型:

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

所以我们可以从Price列表中删除具有最高 VIF 的变量。

有了我已经提出的功能,代码将是:

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)))

}

推荐阅读