我是新的R用户,我使用多项回归(即使用具有2个以上类别的响应变量进行逻辑回归),并使用函数' vglm'在R.我的数据集中有11个连续预测变量和1个响应变量,它们分类为3个类。
我希望得到最好的回归子集,但我不知道如何做到这一点。是否有任何功能,或者我必须手动完成。因为线性函数看起来不合适。
我尝试过bestglm功能,但其结果似乎不适合多项回归。
我也尝试了一种收缩方法,glmnet相对于套索。它选择模型中的所有变量。但另一方面,使用vglm的多项式回归报告一些变量是无关紧要的。
我在互联网上搜索了很多,包括这个网站,但没有找到任何好的答案。所以我在这里问,因为我真的需要帮助。 谢谢
答案 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行之后,模型结果开始降级。那是因为收入和储蓄似乎是消费的主要驱动因素。由于这两个变量从预测变量中删除,模型性能显着下降。
自定义函数的性能非常稳定,因为此处显示的结果与引用的书籍的结果相匹配。
祝你好运。