如何存储“统计模型”的“数组”?

17

有没有一种 R 数据结构可以用来存储多个 lmlmergam 对象?J 有盒状数组(boxed arrays),可以把几乎任何东西放入盒子中。我认为这就是我在 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
> 
此外,是否有一种方法可以在 `<-` 的左侧创建和使用变量名?
最后,也许你有更好的习惯用法要建议给我。例如,我正在尝试创建一个关于一组主题和年份的GAM模型集合。稍后,我想能够从这些模型中绘制或预测,因此我认为需要保留完整的模型。由于我想稍后能够将此代码与不同的数据集一起使用,因此我不希望硬编码 `gam` 对象的名称或数量。
虽然我开始是将 `gam()` 调用放入循环中,但我认为 `apply()` 函数之一可能效果更好,但我仍需要一个存储输出的地方。

你可能还想看看 plyr,它可以使这种模型拟合变得非常容易。 - hadley
3个回答

25

你需要使用[[操作符来访问列表,请尝试使用

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

另一个常用的技巧是,如果你知道你可能会有多少个元素,你可能需要预先分配空间。我经常这样做。

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

对于给定的N


两个答案本质上是相同的,似乎都解决了我的问题;谢谢! - Bill
您还可以使用字符串作为列表索引 - 这在后期更加有用和可读。例如:models[[model_name]] <- model - metakermit
尝试将testlist[[1]] <- subject1.2008.gam应用于我的lm()模型对象时出现问题。例如,我无法使用fitted(testlist[[1]])。相反,我使用了以下结构:testlist <- list(subject1.2008.gam=subject1.2008.gam)。 - ginko

3

使用[[访问列表元素:

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"

1
看起来我比你快了一两分钟 :) 但是我给了你一个赞,因为你用gam()模型提供了一个不错的例子。 - Dirk Eddelbuettel
@Dirk 完全透明化披露:我刚从Simon在?gam中的示例中偷了这个;-) - Gavin Simpson

2
其他答案展示了如何使用索引和[[ ]],但您也可以像这样进行操作:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接