Как получить лучшее подмножество для полиномиальной регрессии в R?

Я новый пользователь R, и я использую полиномиальную регрессию (т.е. логистическую регрессию с переменной ответа, которая имеет более 2 классов) с функцией «vglm» в R. В моем наборе данных есть 11 непрерывных предикторов и 1 ответ переменная, которая является категориальной с 3 классами.

Я хочу получить лучшее подмножество для моей регрессии, но я не знаю, как это сделать. Есть ли какая-то функция для этого или я должен сделать это вручную. Потому что линейные функции не кажутся подходящими.

Я попробовал функцию bestglm, но ее результаты не подходят для полиномиальной регрессии.

Я также попробовал метод сжатия, glmnet, который относится к лассо. Он выбирает все переменные в модели. Но, с другой стороны, полиномиальная регрессия с использованием vglm сообщает о том, что некоторые переменные несущественны.

Я много искал в Интернете, включая этот сайт, но не нашел хорошего ответа. Поэтому я спрашиваю здесь, потому что мне действительно нужна помощь в этом. Спасибо


person Hanie Bk    schedule 09.12.2016    source источник
comment
Большинство, если не все, из этих функций моделирования могут работать с полиномиальными моделями, но если вы новичок в R, возможно, у вас возникли проблемы с тем, как собираются данные или со спецификацией/интерпретацией вашей модели. Например, возможно, что glmnet говорит, что лучшая модель — это все факторы, но, скорее всего, вы неправильно интерпретируете результаты, используя разумную лямбду. Вам следует поговорить со статистиком, потому что при выборе модели нужно многое понять и есть много подводных камней. Даже если ваш код R правильный, выбор модели не для новичков в статистике.   -  person David    schedule 12.12.2016


Ответы (1)


Есть несколько основных шагов, чтобы получить то, что вы хотите:

  • определить модельную сетку всех потенциальных комбинаций предикторов
  • модель запускает все возможные комбинации предикторов
  • используйте критерии (или набор нескольких критериев), чтобы выбрать наилучшее подмножество предикторов

Сетка модели может быть определена с помощью следующей функции:

# 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