Есть несколько основных шагов, чтобы получить то, что вы хотите:
- определить модельную сетку всех потенциальных комбинаций предикторов
- модель запускает все возможные комбинации предикторов
- используйте критерии (или набор нескольких критериев), чтобы выбрать наилучшее подмножество предикторов
Сетка модели может быть определена с помощью следующей функции:
# 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() для перебора всех комбинаций моделей (например, без цикла 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 комбинаций предикторов, поскольку комбинация моделей со всеми отключенными предикторами была удалена. Глядя на таблицу, лучшее подмножество — это подмножество со всеми включенными предикторами. Однако во второй строке используются только 3 из 4 переменных, и результаты производительности примерно такие же. Также обратите внимание, что после строки 4 результаты модели начинают ухудшаться. Это потому, что доходы и сбережения являются ключевыми факторами потребления. Поскольку эти две переменные исключаются из предикторов, производительность модели значительно падает.
Производительность пользовательской функции стабильна, так как представленные здесь результаты соответствуют результатам книги, на которую ссылаются.
Доброго вам дня.
person
Brad Horn
schedule
27.10.2017
glmnet
говорит, что лучшая модель — это все факторы, но, скорее всего, вы неправильно интерпретируете результаты, используя разумную лямбду. Вам следует поговорить со статистиком, потому что при выборе модели нужно многое понять и есть много подводных камней. Даже если ваш код R правильный, выбор модели не для новичков в статистике. - person David   schedule 12.12.2016