【问题标题】:Error when creating list of time series linear models with a loop使用循环创建时间序列线性模型列表时出错
【发布时间】:2018-08-11 13:20:44
【问题描述】:

我有以下数据集(代码需要forecast 包以进行tslm 调用。

x <- rnorm(11, mean = 534, sd = 79)
y <- rnorm(9, mean = 800, sd = 56)
p <- list(x, y) 
tsl <- list(); ts_trend <- list()


for(i in seq_along(p)) {

    tsl[[i]] <- ts(p[[i]], start = c(2018, 1), frequency = 52)
}

    for(i in seq_along(tsl)) {

ts_trend[[i]] <- tslm(tsl[[i]] ~ trend)

}

当我运行它时,我得到了错误

Error in tsl[[i]] : subscript out of bounds

据我所知,下标显然没有超出范围。我在前面的循环中使用了相同的引用,没有错误。

我不知道如何解决这个问题。我错过了什么?

【问题讨论】:

  • 您有两个 for 循环。我认为不需要嵌套。 for(i in seq_along(tsl)) ts_trend[[i]] &lt;- tslm(tsl[[i]] ~ trend)
  • 您实际上可以将两者结合为一个 for 循环。什么是趋势
  • 对不起@akrun,这是我已修复的拼写错误。 @Parfait 趋势仅适用于 tslm 调用。您可以调用trend,coef 将是时间序列对象的线性趋势。您还可以构建调用tslm(x ~ trend + season) 和季节将产生季节性系数以及趋势。

标签: r for-loop forecast


【解决方案1】:

我们可以使用lapply,它会起作用

ts_trendN <- lapply(tsl, function(x) tslm(x ~ trend))

for 循环不起作用的原因是基于计算trend 的环境。我们可以创建一个新环境,它会正常工作

for(i in seq_along(tsl)) {
   ev1 <- new.env()
   ev1$tsl1 <- tsl[[i]]

    ts_trend[[i]] <- tslm(ev1$tsl1 ~ trend)


   }

属性可能会有一些差异。模型输出是一样的

library(broom)
identical(tidy(ts_trendN[[1]]), tidy(ts_trend[[1]]))
#[1] TRUE

【讨论】:

  • Aaaaahhhh...我必须运行调试器 10 次,我发现错误发生在哪里,但我不明白调用的性质。这太棒了……谢谢! eval(mf, parent.frame()) parent.frame() 调用引用了全局环境,但我真的不知道这会影响我直接进行的调用。关于如何了解更多关于环境问题和函数调用的任何建议?
猜你喜欢
  • 2021-06-29
  • 2022-01-11
  • 2021-09-27
  • 2021-12-21
  • 1970-01-01
  • 2019-03-27
  • 2019-02-21
  • 1970-01-01
  • 2016-08-02
相关资源
最近更新 更多