如何在R中获得多项式回归的最佳子集?

时间:2016-12-09 13:36:46

标签: logistic-regression glm multinomial

我是新的R用户,我使用多项回归(即使用具有2个以上类别的响应变量进行逻辑回归),并使用函数' vglm'在R.我的数据集中有11个连续预测变量和1个响应变量,它们分类为3个类。

我希望得到最好的回归子集,但我不知道如何做到这一点。是否有任何功能,或者我必须手动完成。因为线性函数看起来不合适。

我尝试过bestglm功能,但其结果似乎不适合多项回归。

我也尝试了一种收缩方法,glmnet相对于套索。它选择模型中的所有变量。但另一方面,使用vglm的多项式回归报告一些变量是无关紧要的。

我在互联网上搜索了很多,包括这个网站,但没有找到任何好的答案。所以我在这里问,因为我真的需要帮助。 谢谢

1 个答案:

答案 0 :(得分:0)

要获得您想要的东西,需要采取一些基本步骤:

  • 定义所有潜在预测变量组合的模型网格
  • 模型运行预测变量的所有潜在组合
  • 使用标准(或一组多个标准)来选择预测变量的最佳子集

可以使用以下函数定义模型网格:

# define model grid for best subset regression
# defines which predictors are on/off; all combinations presented
model.grid <- function(n){
     n.list <- rep(list(0:1), n)
     expand.grid(n.list)
}

例如,对于4个变量,我们得到n ^ 2或16个组合。值为1表示模型预测器已打开,值为零表示预测器已关闭:

model.grid(4)
   Var1 Var2 Var3 Var4
1     0    0    0    0
2     1    0    0    0
3     0    1    0    0
4     1    1    0    0
5     0    0    1    0
6     1    0    1    0
7     0    1    1    0
8     1    1    1    0
9     0    0    0    1
10    1    0    0    1
11    0    1    0    1
12    1    1    0    1
13    0    0    1    1
14    1    0    1    1
15    0    1    1    1
16    1    1    1    1

我在下面提供了另一个运行所有模型组合的功能。它还将创建一个排序的数据框表,使用5个标准对不同的模型拟合进行排序。根据训练数据和提供的预测因子,表格顶部的预测器组合是“最佳”子集:

# function for best subset regression
# ranks predictor combos using 5 selection criteria

 best.subset <- function(y, x.vars, data){
 # y       character string and name of dependent variable
 # xvars   character vector with names of predictors
 # data    training data with y and xvar observations

 require(dplyr)
 reguire(purrr)
 require(magrittr)
 require(forecast)

 length(x.vars) %>%
      model.grid %>%
      apply(1, function(x) which(x > 0, arr.ind = TRUE)) %>%
      map(function(x) x.vars[x]) %>%
      .[2:dim(model.grid(length(x.vars)))[1]] %>%
      map(function(x) tslm(paste0(y, " ~ ", paste(x, collapse = "+")), data = data)) %>%
      map(function(x) CV(x)) %>%
      do.call(rbind, .) %>%
      cbind(model.grid(length(x.vars))[-1, ], .) %>%
      arrange(., AICc)
}

你会看到指定了tslm()函数......可以使用其他函数,例如vglm()等。只需交换你想要的模型函数。

该功能需要4个已安装的软件包。该函数简单地配置数据并使用map()函数迭代所有模型组合(例如,no for循环)。然后,预测包提供交叉验证函数CV(),该函数具有5个度量或选择标准来对预测变量子集进行排名

这是一本从“预测原理与实践”一书中摘录的应用实例。该示例还使用了本书中的数据,该数据位于fpp2包中。

library(fpp2)

# test the function
y <- "Consumption"
x.vars <- c("Income", "Production", "Unemployment", "Savings")

best.subset(y, x.vars, uschange) 

结果表按AICc指标排序,如下所示。最佳子集最小化度量值(CV,AIC,AICc和BIC),最大化调整后的R平方并位于列表顶部:

   Var1 Var2 Var3 Var4     CV    AIC   AICc    BIC   AdjR2
1     1    1    1    1 0.1163 -409.3 -408.8 -389.9 0.74859
2     1    0    1    1 0.1160 -408.1 -407.8 -391.9 0.74564
3     1    1    0    1 0.1179 -407.5 -407.1 -391.3 0.74478
4     1    0    0    1 0.1287 -388.7 -388.5 -375.8 0.71640
5     1    1    1    0 0.2777 -243.2 -242.8 -227.0 0.38554
6     1    0    1    0 0.2831 -237.9 -237.7 -225.0 0.36477
7     1    1    0    0 0.2886 -236.1 -235.9 -223.2 0.35862
8     0    1    1    1 0.2927 -234.4 -234.0 -218.2 0.35597
9     0    1    0    1 0.3002 -228.9 -228.7 -216.0 0.33350
10    0    1    1    0 0.3028 -226.3 -226.1 -213.4 0.32401
11    0    0    1    1 0.3058 -224.6 -224.4 -211.7 0.31775
12    0    1    0    0 0.3137 -219.6 -219.5 -209.9 0.29576
13    0    0    1    0 0.3138 -217.7 -217.5 -208.0 0.28838
14    1    0    0    0 0.3722 -185.4 -185.3 -175.7 0.15448
15    0    0    0    1 0.4138 -164.1 -164.0 -154.4 0.05246

由于已删除所有预测变量的模型组合,因此在输出中仅分析了15个预测变量组合。查看表格,最佳子集是具有所有预测变量的子集。但是,第二行仅使用4个变量中的3个,性能结果大致相同。另请注意,在第4行之后,模型结果开始降级。那是因为收入和储蓄似乎是消费的主要驱动因素。由于这两个变量从预测变量中删除,模型性能显着下降。

自定义函数的性能非常稳定,因为此处显示的结果与引用的书籍的结果相匹配。

祝你好运。