1

我正在使用多个回归模型来模拟一个问题,例如一周中的每一天。我想将这些存储在 R 中的数据结构中,以便在需要时调用它们。作为问题的一个最小示例,假设我想为 的每个值构造一个z

df = data.frame(z = rep(c('a', 'b'), each = 10),
            x = rep.int(1:10, times = 2), 
            y = rep.int(10:1, times = 2))

天真地,我尝试了以下尝试:

dt = data.table(df)

v.type = unique(dt$z)
v.loess = numeric(0)

for(i in v.type)
  v.loess = c(v.loess, loess(y ~ x, data = dt[z==i]))

dt.loess = data.table(type = v.type, model = v.loess)

给定例如type = aand x = 2.5,然后的想法是运行这样的东西:

predict(dt.loess[z == 'a', 'model', with = FALSE], newdata = 2.5)

这种方法彻底失败。任何帮助表示赞赏。

4

2 回答 2

4

loess()返回类的 S3 对象loess。在内部,这些对象表示为列表,如果您调用str()它们,您可以看到什么。

现在,您的解决方案失败主要有两个原因:

  1. 在 for 循环中,您连接这些对象(在此处阅读列表),这些对象c()只是将列表元素(或对象字段)连接到一个更大的列表,从而导致 class 的无效对象loess。然后,您尝试将此列表另存为data.table.

  2. 我不明白你为什么要将模型最后存储在 a 中data.table,但我几乎可以肯定,这是不可能的,因为列元素必须是(据我记得)原子向量或列表. 我宁愿将模型存储在命名列表中并将它们留在那里。


使用基础 R 的解决方案

model <- list()
for( i in unique(dt$z) ){
  model[[i]] <- loess(y ~ x, data = dt[ z==i ] )
}

使用 plyr 的解决方案

library("plyr")
model <- dlply( df, "z", function(data){
  loess( y ~ x, data = data )
} )

甚至更短:

library("plyr")
model <- dlply( df, "z", loess, formula = quote(y ~ x) )

后两种解决方案可以同时应用于:data.table和,但在这种情况下data.frame你没有利用任何优势。data.table所以你最终必须决定什么更快,更不容易出错。


在所有三种情况下,您都可以致电

predict( model[["a"]], newdata = 2.5)
[1] 8.5
于 2013-04-09T17:47:47.863 回答
2

一方面,使用c组合结果给出有趣的结果;最好直接填写清单。另一方面,使用data.table来得到结果是很棘手的;我不是data.table专家,所以我会直接使用列表中的结果。

v.type = unique(df$z)
v.loess = list()
for(i in v.type) {
  v.loess[[i]] <- loess(y ~ x, data = df[df$z==i,])
}
predict(v.loess$a, newdata=2.5)
predict(v.loess$b, newdata=2.5)
于 2013-04-09T16:55:02.610 回答