Как заказать модели от лучших к худшим на основе AIC из результата lapply в R - PullRequest
1 голос
/ 06 мая 2019

Предположим, у меня есть следующие 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?

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

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

В настоящее время вы объединяете объекты списка с методами 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)]
1 голос
/ 06 мая 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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...