R: получить лучшие N значений из всех подмножеств списка

У меня есть сводки многих линейных моделей в списке под названием "listlumummary".

listlmsummary <- lapply(listlm, summary)
listlmsummary

Выход из listlmsummary выглядит так (довольно сокращенно):

$a
Residual standard error: 3835 on 1921 degrees of freedom
  (50 observations deleted due to missingness)
Multiple R-squared:   0.11, Adjusted R-squared:  0.1063 
F-statistic: 29.68 on 8 and 1921 DF,  p-value: < 2.2e-16

$b
Residual standard error: 3843 on 1898 degrees of freedom
  (68 observations deleted due to missingness)
Multiple R-squared:  0.1125,    Adjusted R-squared:  0.1065 
F-statistic: 18.51 on 13 and 1898 DF,  p-value: < 2.2e-16

$c
Residual standard error: 3760 on 1881 degrees of freedom
  (87 observations deleted due to missingness)
Multiple R-squared:  0.1221,    Adjusted R-squared:  0.117 
F-statistic: 23.79 on 11 and 1881 DF,  p-value: < 2.2e-16

$d
Residual standard error: 3826 on 1907 degrees of freedom
  (60 observations deleted due to missingness)
Multiple R-squared:  0.115, Adjusted R-squared:  0.1094 
F-statistic: 20.64 on 12 and 1907 DF,  p-value: < 2.2e-16

Я хочу извлечь наибольшее N (например, 2) скорректированных значений R-квадрата, чтобы найти лучшую модель, и что она также сообщает мне, из какого элемента списка происходит это значение Adj.R-sqr. У кого-нибудь есть идеи как это сделать?

Я знаю, что могу получить одно значение R-квадрата с помощью этого вызова:

listlmsummary[["a"]]$adj.r.squared

Но извлекая все значения R-квадрата с чем-то вроде этого listlmsummary[[]]$adj.r.squared или же listlmsummary[[c("a", "b", "c", "d")]]$adj.r.squaredи тогда порядок вывода не работает.

Спасибо за любую помощь!:)

3 ответа

Решение
sapply(listlmsummary, function(x) x$adj.r.squared)

Также смотрите новый broom пакет.

Мы можем использовать sapply извлекать adj.r.squared в vector а также order в убывающем. Тогда получите head из 'n' элементов из упорядоченного 'listlmsummary'

i1 <- order(-sapply(listlmsummary, `[[`, "adj.r.squared"))
head(listlmsummary[i1], n)

ПРИМЕЧАНИЕ. На это ответили логика и полное решение, запрошенное пользователем.

Быстрый и грязный способ сделать это может быть:

Maxr2sq <- max(unlist(sapply (listlm, "[", i = "adj.r.squared")))
Position <- which(unlist(sapply (listlm, "[", i = "adj.r.squared")) == Maxr2sq)
Maxr2sq
Position

Тем не менее, вы можете сохранить все результаты в data.frame для дальнейшего использования. Например, теоретически возможно, что более одного Adj.R2 получают одинаковое значение. Кроме того, удобно хранить вызов регрессии (т.е. формула).

В этом случае вы можете запустить:

library(tidyverse)

AR2 <- sapply (listlm, "[", i = "adj.r.squared") %>%
       stack() %>% 
       select(values) %>% 
       rename(Adj.R.sqr = values)
Call <- as.character(sapply (listlm, "[", i = "call"))
Position <- setNames(data.frame(seq(1:length(listlm))), c("Position"))
DF <- as_data_frame(cbind(AR2,Call,Position))
DF
Другие вопросы по тегам