【问题标题】:How do I store "arrays" of statistical models?如何存储统计模型的“数组”?
【发布时间】:2017-09-26 01:33:58
【问题描述】:

是否有一个 R 数据结构可以存储多个 lmlmergam 对象? 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
> 

或者,有没有办法在 &lt;- 的 LHS 上创建和使用变量名?

最后,也许你有一个更好的成语供我考虑。例如,我正在尝试在一组主题和年份上创建 GAM 模型的集合。后来,我希望能够从这些模型中进行绘图或预测,所以我认为我需要保留完整的模型。因为我希望以后能够将此代码用于不同的数据集,所以我不想硬编码gam 对象的名称或它们的编号。

虽然我首先将 gam() 调用置于循环中,但我认为其中一个 apply() 函数可能会更好,但我仍然需要一个地方来存储输出。

【问题讨论】:

  • 您可能还想研究 plyr,这使得这种模型拟合非常容易。

标签: r


【解决方案1】:

列表需要[[ 运算符,试试

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

另一个常见的提示是,如果你知道你可能有多少元素,你可能想要预先分配,我经常这样做

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

对于给定的N

【讨论】:

  • 两个答案基本相同,似乎解决了我的问题;谢谢!
  • 您也可以使用字符串作为列表索引——这在以后更有用和可读。例如models[[model_name]] &lt;- model.
  • 执行类似 testlist[[1]]
【解决方案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"

【讨论】:

  • 看起来我比你快了一两分钟 :) 但是刚刚给你一个赞,给你一个很好的例子,gam() 模型。
  • @Dirk 全面披露:我只是从 ?gam 的 Simon 的例子中偷来的;-)
【解决方案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

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2015-11-10
    • 2023-01-05
    • 1970-01-01
    相关资源
    最近更新 更多