【问题标题】:Run linear model in a powerset of variables在变量的幂集中运行线性模型
【发布时间】:2019-05-06 09:31:28
【问题描述】:

我正在尝试获取具有不同变量的数据框,并为这些变量的每个组合运行一个线性模型。

一个简单的例子是:

names <- c("Var1", "Var2", "Var3") 
vars <- ggm::powerset(names, sort = T, nonempty = T) 

powerset 函数为我提供了 3 个变量的所有组合——一个包含 7 个元素的列表,每个元素都是字符类型。 (我尝试运行的实际代码有 16 个变量,这就是我不想手动编写每个模型的原因)。

我现在想做的是在每个变量组合中运行模型。目前,我已经编写了以下代码(它不起作用,但可能是一个好的开始):

i <- 1
for (dep_var in vars){
  assign(paste0("modelo", i), lm(lapply(paste("Y", dep_var, sep = "~"), formula), 
  data = data))
  i <- i+1
}

最终,我想创建不同的模型,并从样本 AIC 和 BIC 以及样本 MAE 和 RMSE 的组合中选择最佳模型。

非常感谢!任何帮助表示赞赏!

【问题讨论】:

  • 你试过MuMIn(多模型推理)包吗?它有一个dredge 函数...
  • 参见 ?stephelp("stepAIC", "MASS") 以及跳跃包。请注意,计算所有 substs 是不利的,您可能希望查看 glmnet 以了解选择变量的不同方法。

标签: r linear-regression data-modeling


【解决方案1】:

使用mtcars 数据和mpg 作为因变量和用于模型选择的AIC 集合的简单示例。我同意有很多 R 包可以根据某些标准(bestglmleapsglmultiMASS)测试多个模型。

mtcars_exp <- mtcars %>%
  select(-mpg)

vars <- ggm::powerset(names(mtcars_exp), sort = T, nonempty = T) 

results <- data.frame(AIC_lm_fit =  vector("numeric"),
           model = vector("character"))

用于拟合线性模型的 For 循环

for (j in 1:length(vars)){
  lm_fit <- lm(mpg ~ ., data = mtcars[,c("mpg", vars[[j]])])
  results <- rbind(results,
                   data.frame(AIC_lm_fit =  AIC(lm_fit),
                            model = toString(vars[[j]])))
}

选择AIC最小的模型

results[AIC_lm_fit==min(AIC_lm_fit),]
        AIC_lm_fit        model
105   154.1194 wt, qsec, am

与 MASS::stepAIC 函数的结果比较

library(MASS)
lm_fit <- lm(mpg ~ ., data = mtcars)
lm_fit_2 <- stepAIC(lm_fit)
lm_fit_2$call

lm(formula = mpg ~ wt + qsec + am, data = mtcars)

【讨论】:

  • 非常感谢!代码正是我需要的!
猜你喜欢
  • 2020-10-06
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
相关资源
最近更新 更多