У меня возникли проблемы с извлечением некоторой сводной статистики модели из R.

В качестве примера воспользуемся набором данных iris.

data(iris)
model1 <- summary(lm(Sepal.Length~Sepal.Width,data=iris))

Я хочу извлечь r.squared и adj.r.squared из сводной статистики.

lapply(model1, "[", c("r.squared", "adj.r.squared"))
Error in terms.formula(newformula, specials = names(attr(termobj, "specials"))) : 
  invalid model formula in ExtractVars

Я сбит с толку, потому что, похоже, все работает нормально:

model1[c('r.squared', 'adj.r.squared')]
# $r.squared
# [1] 0.01382265
# 
# $adj.r.squared
# [1] 0.007159294

Кто-нибудь понимает эту ошибку? Большое спасибо за любую помощь, которую вы можете предоставить.

0
Mike.Gahan 20 Май 2014 в 16:27

2 ответа

Лучший ответ

Здесь нет необходимости в lapply. str(model1) сообщает нам, что model1 - это список из 11 элементов с

> names(model1)
#  [1] "call"          "terms"         "residuals"     "coefficients"  
#  [5] "aliased"       "sigma"         "df"            "r.squared" 
#  [9] "adj.r.squared" "fstatistic"    "cov.unscaled" 

Весь список можно просмотреть с помощью c(model1). Доступ к значениям r-квадрат можно получить напрямую с помощью

> model1[c('r.squared', 'adj.r.squared')]
# $r.squared
# [1] 0.01382265

# $adj.r.squared
# [1] 0.007159294

Или с регулярным выражением для захвата обоих значений в квадрате

> model1[grepl('squared', names(model1))]
# $r.squared
# [1] 0.01382265

# $adj.r.squared
# [1] 0.007159294
3
Rich Scriven 20 Май 2014 в 12:53

В качестве альтернативы @RichardScriven, если вы действительно хотите использовать lapply (возможно, потому, что это обобщение аналогичных тестов): вы поменяли местами аргументы.

Вы пытаетесь перебрать список статистики модели за один прогон и получить два элемента. Например, если:

a <- list(x=1, y=2, z=3)

Тогда lapply(a, [, c('x', 'y')) сначала развернется к a[1][ c('x', 'y') ], затем к a[2][ c('x', 'y') ] и, наконец, к a[3][ c('x', 'y') ], а не (я думаю) к тому, что вы хотите. 1 < / sup>

Два возможных пути для вас.

  1. Попробуйте lapply( c('x', 'y'), function(i) a[[i]]) (или sapply, если на то пошло). Это, возможно, немного неудобно, поскольку в действительности у него нет никаких преимуществ перед a[ c('x', 'y') ].

  2. Если вы намереваетесь получить статистику модели из нескольких прогонов и просто пытаетесь использовать один набор статистических данных, попробуйте:

    lapply (список (a), `[`, c ('x', 'y'))

    Замените list(a) на modellist, который мог быть сформирован с помощью modellist <- list(model1, model2, model3) (или, что более уместно, возврата другой функции *apply.

PS:
1 , если вы попробуете, он не сделает этого в точности - результат не совпадает - но это концептуально то, как я представляю, что происходит.

0
r2evans 20 Май 2014 в 15:10