r - 寻找 R 中 AIC 最低的模型(从 for 循环返回)

标签 r for-loop glm model-comparison

我正在尝试寻找 AIC 最低的模型。模型是从两个 for 循环返回的,这两个 for 循环可以实现列的组合。我无法制作具有最低 AIC 的函数返回模型。下面的代码演示了我陷入困境的地方:

rm(list = ls())

data <- iris

data <- data[data$Species %in% c("setosa", "virginica"),]

data$Species = ifelse(data$Species == 'virginica', 0, 1)

mod_headers <- names(data[1:ncol(data)-1])

f <- function(mod_headers){
    for(i in 1:length(mod_headers)){
    tab <- combn(mod_headers,i)
    for(j in 1:ncol(tab)){
      tab_new <- c(tab[,j])
      mod_tab_new <- c(tab_new, "Species")
      model <- glm(Species ~., data=data[c(mod_tab_new)], family = binomial(link = "logit"))
    }
    }
  best_model <- model[which(AIC(model)[order(AIC(model))][1])]
  print(best_model)
}

f(mod_headers)

有什么建议吗?谢谢!

最佳答案

我用矢量化替代方案替换了您的 for 循环

library(tidyverse)
library(iterators)
# Column names you want to use in glm model, saved as list
whichcols <- Reduce("c", map(1:length(mod_headers), ~lapply(iter(combn(mod_headers,.x), by="col"),function(y) c(y))))

# glm model results using selected column names, saved as list
models <- map(1:length(whichcols), ~glm(Species ~., data=data[c(whichcols[[.x]], "Species")], family = binomial(link = "logit")))

# selects model with lowest AIC
best <- models[[which.min(sapply(1:length(models),function(x)AIC(models[[x]])))]]

输出

Call:  glm(formula = Species ~ ., family = binomial(link = "logit"), 
data = data[c(whichcols[[.x]], "Species")])

Coefficients:
 (Intercept)  Petal.Length  
       55.40        -17.17  

Degrees of Freedom: 99 Total (i.e. Null);  98 Residual
Null Deviance:      138.6 
Residual Deviance: 1.208e-09    AIC: 4

关于r - 寻找 R 中 AIC 最低的模型(从 for 循环返回),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45254502/

相关文章:

r - 重叠并固定小平面中的 x 尺度(尺度 =“free” )以制作电影

r - 如何将第一行更改为 R 中的标题?

python-3.x - 使用循环创建多个数据框

r - 逻辑回归预测的置信区间

dataframe - Julia 中的虚拟变量

r - 用 tidyr 收集两组列

R - 使用函数过滤向量

Javascript 嵌套数组代表问题

停止和等待算法的 Python 实现

r - 如何使用 purrr 中的 map 和 dplyr 中的 mutate 来生成 glm 汇总表?