【问题标题】:R: storing regression modelsR:存储回归模型
【发布时间】:2013-04-09 13:48:55
【问题描述】:

我正在使用多个回归模型来建模问题,例如一周中的每一天。我想将这些存储在 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 = ax = 2.5,当时的想法是运行这样的东西:

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

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

【问题讨论】:

  • 我不在我的电脑前。你能检查一下传递给predict函数的模型向量的class吗?
  • 不应该是for(i in v.type)吗?

标签: r loess


【解决方案1】:

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

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

    1234563 .然后你尝试将此列表保存为data.table 中的列。
  1. 我不明白您为什么要将模型最终存储在 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.tabledata.frame,但在这种情况下您不会利用data.table 的任何优势。所以你最终必须决定什么更快,更不容易出错。


在所有三种情况下,您都可以调用

predict( model[["a"]], newdata = 2.5)
[1] 8.5

【讨论】:

  • 不仅感谢您的回答,而且还为我的错误提供了一个非常有启发性和有用的解释。
  • 这适用于示例数据集,但是上述所有方法都会导致我的实际数据集出现以下错误:Error in simpleLoess(y, x, w, span, degree, parametric, drop.square, normalize, : invalid 'x'。这种错误消息是否存在“通常的罪魁祸首”,这只能通过查看我的实际数据集来回答吗?
  • 就我个人而言,我不知道 usual 罪魁祸首,但如果您至少可以尝试将问题归结为 @987654336 的子集,那将非常有帮助@ 为其抛出错误。也许只需在plyr 函数中打印unique(data$z) 或在for 循环中打印i。子集看起来很奇怪吗?
  • 问题已解决。一些流氓NA 已经潜入。感谢您的帮助比斯特菲尔德。
【解决方案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-11-22
  • 2020-04-30
  • 2018-04-28
  • 2018-01-26
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
相关资源
最近更新 更多