Как хранить "массивы" статистических моделей?
Есть ли структура данных 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()
может работать лучше, но мне все еще нужно место для хранения вывода.
Ответы
Ответ 1
Вам нужен оператор [[
для списков, попробуйте
testlist[[1]] <- subject1.2008.gam
Другим обычным советом является то, что вы можете предварительно выделить, если знаете, сколько у вас элементов, я часто делаю
testlist <- vector(mode="list", length=N)
для данного N
.
Ответ 2
Используйте [[
для доступа к элементам списка:
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"
Ответ 3
Другие ответы показывают, как использовать индекс и [[ ]]
, но вы также можете сделать что-то вроде
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