Как мне хранить «массивы» статистических моделей? - PullRequest
14 голосов
/ 08 апреля 2011

Существует ли структура данных R, в которой я могу хранить несколько объектов lm или lmer или gam?J имеет упакованные массивы, и в ячейки такого упакованного массива можно поместить практически все, что угодно.Я думаю, это то, что я ищу в R.

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

> testlist <- list()
> testlist[1] <- subject1.2008.gam
Warning message:
In testlist[1] <- subject1.2008.gam :
  number of items to replace is not a multiple of replacement length
> 

В качестве альтернативы, есть ли способ создать и использовать имя переменной на LHS, равное <-?

Наконец, возможно, у вас есть лучшая идиомадля меня, чтобы рассмотреть.Я, например, пытаюсь создать коллекцию моделей GAM на основе набора предметов и лет.Позже я хочу иметь возможность строить или прогнозировать по этим моделям, поэтому я думаю, что мне нужно сохранить полную модель.Поскольку позже я хочу использовать этот код с другими наборами данных, я бы не хотел жестко кодировать имена объектов gam и их число.

Пока я начинал с помещения gam() вызов в цикле, я думаю, что одна из функций apply() могла бы работать лучше, но мне все еще нужно место для хранения вывода.

Ответы [ 3 ]

20 голосов
/ 08 апреля 2011

Вам необходим оператор [[ для списков, попробуйте

testlist[[1]] <- subject1.2008.gam

Другой обычный совет: вы можете захотеть предварительно выделить, если вы знаете, сколько элементов у вас может быть, я часто делаю

testlist <- vector(mode="list", length=N)

для данного N.

3 голосов
/ 08 апреля 2011

Используйте [[ для доступа к элементам списка:

library(mgcv)
set.seed(0) ## simulate some data... 
dat <- gamSim(1,n=400,dist="normal",scale=2)

mods <- vector(mode = "list", length = 3)
for(i in seq_along(mods)) {
    mods[[i]] <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat)
}

Предоставление:

> str(mods, max = 1)
List of 3
 $ :List of 43
  ..- attr(*, "class")= chr [1:3] "gam" "glm" "lm"
 $ :List of 43
  ..- attr(*, "class")= chr [1:3] "gam" "glm" "lm"
 $ :List of 43
  ..- attr(*, "class")= chr [1:3] "gam" "glm" "lm"
2 голосов
/ 09 апреля 2011

Другие ответы показывают, как использовать индекс и [[ ]], но вы также можете сделать что-то вроде

x1  <- 1:10  ; y1  <-  30*x1 + rnorm(10)
x2  <- rnorm(20)  ; y2  <- 30*x2 + 100 + rnorm(20)
lm1 <- lm(y1 ~ x1); lm2 <- lm(y2 ~ x2) 

testlist <- list( A = lm1, Z = lm2 ) 
testlist$Z
testlist$Z$model$y2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...