逻辑回归:如何尝试R中的每个预测变量组合?

时间:2017-07-23 22:51:47

标签: r combinatorics logistic-regression

这是https://stats.stackexchange.com/questions/293988/logistic-regression-how-to-try-every-combination-of-predictors的副本。

我想进行逻辑回归:我有1个因变量和~10个预测变量。

我想尝试对每个组合进行详尽的搜索,例如更改顺序和添加/删除预测变量等。例如:

  • y~x1 + x2 + x3 + x4 + x5

  • y~x2 + x1 + x3 + x4 + x5

  • y~x1 + x2 + x3

  • y~x5 + x1 + x2 + x3 + x4

  • y~x4 + x2

  • ......等等。

在这种情况下,计算时间对我来说不是一个停止的问题:这主要是一项教育活动。

你知道我该怎么做吗?我用R。

编辑:要明确:这主要是一项教育练习:我想测试每个模型,以便我可以根据某些索引(例如AUC或伪R²)对它们进行排序向我的“学生”展示哪些预测变量看起来很有趣但没有科学意义。我打算执行bootstrap重采样以进一步测试“ fishiest ”模型。

2 个答案:

答案 0 :(得分:7)

我不确定这个"教育练习"的价值,但为了编程,这将是我的方法:

首先,让我们创建一些示例预测变量名称。我在你的例子中使用了5个预测变量,但对于10,你显然需要用10替换5。

X = paste0("x",1:5)
X
[1] "x1" "x2" "x3" "x4" "x5"    

现在,我们可以使用combn获得组合。

例如,一次只能输入一个变量:

 t(combn(X,1))
     [,1]
[1,] "x1"
[2,] "x2"
[3,] "x3"
[4,] "x4"
[5,] "x5"

一次两个变量:

> t(combn(X,2))
      [,1] [,2]
 [1,] "x1" "x2"
 [2,] "x1" "x3"
 [3,] "x1" "x4"
 [4,] "x1" "x5"
 [5,] "x2" "x3"
 [6,] "x2" "x4"
 [7,] "x2" "x5"
 [8,] "x3" "x4"
 [9,] "x3" "x5"
[10,] "x4" "x5"

我们可以使用lapply连续调用这些函数,并考虑越来越多的变量,并在列表中捕获结果。例如,查看lapply(1:5, function(n) t(combn(X,n)))的输出。要将这些组合转换为公式,我们可以使用以下内容:

out <- unlist(lapply(1:5, function(n) {
  # get combinations
  combinations <- t(combn(X,n))
  # collapse them into usable formulas:
  formulas <- apply(combinations, 1, 
                    function(row) paste0("y ~ ", paste0(row, collapse = "+")))}))

或等效地使用FUN的{​​{1}}参数(由user20650指出):

combn

这给出了:

out <- unlist(lapply(1:5, function(n) combn(X, n, FUN=function(row) paste0("y ~ ", paste0(row, collapse = "+")))))

现在可以将其传递给逻辑回归函数。

示例:

让我们使用out [1] "y ~ x1" "y ~ x2" "y ~ x3" "y ~ x4" "y ~ x5" [6] "y ~ x1+x2" "y ~ x1+x3" "y ~ x1+x4" "y ~ x1+x5" "y ~ x2+x3" [11] "y ~ x2+x4" "y ~ x2+x5" "y ~ x3+x4" "y ~ x3+x5" "y ~ x4+x5" [16] "y ~ x1+x2+x3" "y ~ x1+x2+x4" "y ~ x1+x2+x5" "y ~ x1+x3+x4" "y ~ x1+x3+x5" [21] "y ~ x1+x4+x5" "y ~ x2+x3+x4" "y ~ x2+x3+x5" "y ~ x2+x4+x5" "y ~ x3+x4+x5" [26] "y ~ x1+x2+x3+x4" "y ~ x1+x2+x3+x5" "y ~ x1+x2+x4+x5" "y ~ x1+x3+x4+x5" "y ~ x2+x3+x4+x5" [31] "y ~ x1+x2+x3+x4+x5" 数据集,mtcars作为因变量。

mpg

现在,让我们使用上述功能:

X = names(mtcars[,-1])
X
 [1] "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

它为我们提供了所有组合的矢量作为公式。

要运行相应的模型,我们可以做例如

out <- unlist(lapply(1:length(X), function(n) combn(X, n, FUN=function(row) paste0("mpg ~ ", paste0(row, collapse = "+")))))

由于您想要捕获特定的统计数据并相应地对模型进行排序,我会使用mods = lapply(out, function(frml) lm(frml, data=mtcars)) broom::glancebroom::tidy输出转换为数据帧(如果要比较系数等,则非常有用)和lm转r-squared,sigma,F-statistic,logLikelihood,AIC,BIC等进入数据帧。例如:

broom::glance

您可以按照自己的意愿排序。

答案 1 :(得分:2)

有&#39; sa这样做,MuMIn mu lti m odel ference),作为一部分一个更有原则的多模型方法(即它不仅仅选择最好的模型,而忽略选择已经完成的事实):

设置数据和完整模型:

set.seed(101)
d <- data.frame(replicate(5,rnorm(100)))
d$y <- rbinom(100,size=1,prob=0.5)
full <- glm(y~.,data=d,na.action=na.fail)

&#34;疏通&#34;结果:

library(MuMIn)
allfits <- dredge(full)

结果(还包含所有拟合参数):

head(allfits[,7:11])
##    df    logLik     AICc    delta     weight
## 3   3 -69.66403 145.5781 0.000000 0.15916685
## 11  4 -69.22909 146.8792 1.301191 0.08304293
## 19  4 -69.30856 147.0382 1.460123 0.07669921
## 7   4 -69.31233 147.0457 1.467655 0.07641093
## 4   4 -69.40589 147.2328 1.654775 0.06958615
## 1   2 -72.07662 148.2769 2.698896 0.04128523