Как упорядочить модели от лучших к худшим на основе AIC из результата lapply в R

Предположим, у меня есть следующий df.

ind1 <- rnorm(100)
ind2 <- rnorm(100)
ind3 <- rnorm(100)
ind4 <- rnorm(100)
ind5 <- rnorm(100)
dep <- rnorm(100, mean=ind1)

df <- data.frame(dep,ind1, ind2, ind3, ind4, ind5)

Я вычислил полиномиальную регрессию 3-го порядка между переменной dep и каждой из переменных ind отдельно, используя lapply (), как показано ниже:

polys <- lapply(df[,-1], function(x) summary(lm(dep ~ poly(x, 3, raw = 
TRUE), data = df)))

Теперь хочу перечислить / заказать лучшие модели на базе AIC. Я пробовал это безуспешно.

stepAIC(polys)
polys$AIC

Ты хоть представляешь, как мне это сделать в R?

Заранее спасибо!


person R starter    schedule 06.05.2019    source источник


Ответы (2)


В настоящее время вы объединяете объекты списка с методами stepAIC и AIC, которые выполняются на определенных компонентах. Конкретно,

  1. Функция stepAIC в пакете MASS выполняется на отдельных объектах модели (например, lm типов классов), а не на сводке объектов модели и не на списке объектов модели (т.е. polys) с вашей неудачной попыткой: stepAIC(polys).

  2. Функция AIC в пакете MASS выполняется на отдельных объектах модели обычно после вызова stepAIC и не является элементом возврата с вашей неудачной попыткой: polys$AIC.

Рассмотрите следующий рефакторинг вашего кода с начальными данными для воспроизводимости для сортировки списка lm-объектов, polys, по возрастанию значений AIC:

library(MASS)

set.seed(50619)    
#... same data build code ...

# LIST OF lm OBJECTS (NO SUMMARY)
polys <- lapply(df[,-1], function(x) lm(dep ~ poly(x, 3, raw = TRUE), data = df))

# SORTED VECTOR OF AIC VALUES (USING sapply)
AIC_vec <- sort(sapply(polys, function(x) AIC(stepAIC(x))))
AIC_vec
#     ind1     ind3     ind2     ind4     ind5 
# 297.1865 352.3694 352.8260 352.8260 352.8260

# SORTED polys BY AIC (BEST TO WORST)
sorted_polys <- polys[names(AIC_vec)]
person Parfait    schedule 06.05.2019
comment
Большое спасибо. это то, что я хочу. Могу ли я убедиться, как я могу увидеть результат sorted_polys? Спасибо за подробное объяснение моей неудачи. - person R starter; 06.05.2019
comment
Большой! Рад помочь. Если внутри IDE, например RStudio, просто вызовите sorted_polys в отдельной строке, чтобы увидеть результат. Если вы работаете не в интерактивном режиме, как в командной строке, используйте print: print(sorted_polys). Помните, что это именованный список объектов, поэтому вы используете квалификатор $ для отдельных элементов: sorted_polys$ind1, sorted_polys$ind2 и т. Д. - person Parfait; 06.05.2019
comment
@ Парфе. Извините, что снова беспокою вас. Я только что заметил 2 вещи относительно calc. 1) результирующие значения AIC из AIC_vect полностью отличаются от AIC_vec ‹- .... В выводе AIC_vec‹ - ... нет таких высоких чисел, как 297.1865 и т. Д., Все они примерно 70 с чем-то. как я понял, они не должны отличаться. (второй, как показано ниже) - person R starter; 08.05.2019
comment
2) в списке моделей от лучших к худшим моделям, модели, которые не имеют какой-либо существенной корреляции с dep, оцениваются как лучшие модели, чем те, которые имеют высокую корреляцию с dep, когда эта полиномиальная регрессия проверяется отдельно для каждой независимой переменной. Я совершенно не понимаю, почему они такие? - person R starter; 08.05.2019
comment
1) Что такое AIC_vectt)? Помните, что здесь мы используем случайные нормальные данные со значениями по умолчанию. 2) Вы указали только порядок ранжирования по значениям AIC без какого-либо упоминания значимости с помощью dep. Расширьте функцию sapply для проверки значимости, возможно, по p-значению. - person Parfait; 08.05.2019

Вот одно из решений:

ind1 <- rnorm(100)
ind2 <- rnorm(100)
ind3 <- rnorm(100)
ind4 <- rnorm(100)
ind5 <- rnorm(100)
dep <- rnorm(100, mean=ind1)

df <- data.frame(dep,ind1, ind2, ind3, ind4, ind5)

# Create all the models
polys <- lapply(df[,-1], function(x) (lm(dep ~ poly(x, 3, raw = TRUE), data = df)))

# Find the best predictors using `setpAIC()`
mod <- lapply(polys, MASS::stepAIC)

# Calculate the AIC of each model and sort it increasingly.
i <- order(unlist(lapply(mod, AIC)))

# Show the models starting with the lowest AIC first
mod[i]

person Philippe Massicotte    schedule 06.05.2019
comment
Любое объяснение? Ответы только на код не слишком интуитивно понятны. - person Parfait; 06.05.2019
comment
@ Филипп Массикотт. Большое спасибо. когда я запускаю mod ‹-, я получаю следующие результаты для каждой модели, в которых я не могу определить, какая переменная x является этой. Итак, есть ли способ извлечь имя переменных x, как они находятся в df. Начало: AIC = -5.29 dep ~ poly (x, 3, raw = TRUE) Df Сумма Sq RSS AIC ‹none› 87,555 -5,291 - poly (x, 3, raw = TRUE) 3 96,303 183,857 62,899 - person R starter; 06.05.2019
comment
Я хочу упорядочить модели AIC от низшего к высшему (от лучшего к худшему). - person R starter; 06.05.2019
comment
Неправда, mod<-... возвращает именованный список объектов. Проверьте с names(mod) и names(mod[i]). Обратите внимание, что они отличаются из-за повторного заказа. - person Parfait; 06.05.2019
comment
Я не говорил об отсутствии объяснения кода. - person James Phillips; 06.05.2019