有參與得到一些基本的步驟,你想要什麼:
- 定義所有潛在預測組合的模型網格
- 模型運行預測
- 使用標準的所有可能的組合(或一組多個標準)來選擇預測器的最佳子集
模型網格可以用以下f例如:
# 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()函數遍歷所有模型組合(例如,不用於循環)。預測包然後提供交叉驗證函數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行之後,模型結果開始下降。那是因爲收入和儲蓄似乎是消費的關鍵驅動因素。由於這兩個變量是從預測變量中刪除的,模型性能顯着下降。
自定義函數的性能很穩定,因爲這裏給出的結果與本書引用的結果相匹配。
給你一個美好的一天。
這些建模函數中的大多數(如果不是全部的話)都可以處理多項模型,但是如果您是R的新手,則數據組裝方式或模型規範/解釋可能存在問題。例如,'glmnet'可能說最好的模型是所有因素,但更有可能你沒有使用合理的lambda來正確解釋結果。你應該和一位統計學家交談,因爲在選擇模型時需要理解很多,並且存在很多缺陷。即使您的R代碼正確,模型選擇也不適合初學者進行統計。 – David