【问题标题】:R: Holt-Winters with daily data (forecast package)R:带有每日数据的 Holt-Winters(预测包)
【发布时间】:2014-03-01 11:34:16
【问题描述】:

在以下示例中,我尝试对每日数据使用 Holt-Winters 平滑处理,但遇到了几个问题:

# generate some dummy daily data
mData = cbind(seq.Date(from = as.Date('2011-12-01'), 
         to = as.Date('2013-11-30'), by = 'day'), rnorm(731))

# convert to a zoo object
zooData = as.zoo(mData[, 2, drop = FALSE], 
                 order.by = as.Date(mData[, 1, drop = FALSE], format = '%Y-%m-%d'),
                 frequency = 7)

# attempt Holt-Winters smoothing
hw(x = zooData, h = 10, seasonal = 'additive', damped = FALSE, 
   initial = 'optimal', exponential = FALSE, fan = FALSE)

# no missing values in the data
sum(is.na(zooData))

这会导致以下错误:

ets(x, "AAA", alpha = alpha, beta = beta, gamma = gamma, 阻尼 = 阻尼,:你一定是在开玩笑。我需要更多数据! 在 另外:警告消息:在 ets(x, "AAA", alpha = alpha, beta = beta, gamma = gamma, damped = damped, : 遇到缺失值。 使用时间序列中最长的连续部分

强调我的。

几个问题: 1. 缺失值从何而来? 2. 我假设“需要更多数据”源于尝试估计 365 个季节性参数?

更新 1:

根据 Gabor 的建议,我为整数为周的数据重新创建了一个小数索引。

我有几个问题。
1. 当假设周期性为每周时,这是否是处理每日数据的合适方式?
2. 在处理日常数据时,有没有更优雅的方式来处理日期?

library(zoo)
library(forecast)

# generate some dummy daily data
mData = cbind(seq.Date(from = as.Date('2011-12-01'), 
                       to = as.Date('2013-11-30'), by = 'day'), rnorm(731))

# conver to a zoo object with weekly frequency
zooDataWeekly = as.zoo(mData[, 2, drop = FALSE], 
                 order.by = seq(from = 0, by = 1/7, length.out = 731))


# attempt Holt-Winters smoothing
hwData = hw(x = zooDataWeekly, h = 10, seasonal = 'additive', damped = FALSE, 
   initial = 'optimal', exponential = FALSE, fan = FALSE)
plot(zooDataWeekly, col = 'red')
lines(fitted(hwData))

【问题讨论】:

  • 您已指定频率为 7,因此它在每对点之间填充 6 个 NA 以满足指定的要求。
  • @G.Grothendieck 我一发帖就意识到了这一点。 :) 我想我的问题真的是我可以使用hw() 函数来提取带有每日数据的每周季节性吗? ts 需要哪些属性才能做到这一点?
  • 时间应该以周而不是天来衡量,例如连续观察的次数可以是 0, 1/7, 2/7, ...
  • @G.Grothendieck 已更新。如果你能看看会很棒。
  • 是的,没关系。可以交替使用zooreg(mData[, 2], 0, freq = 7)ts(mData[, 2], start = 0, freq = 7)

标签: r zoo forecasting


【解决方案1】:

hw 需要 ts 对象而不是 zoo 对象。使用

zooDataWeekly <- ts(mData[,2], frequency=7)

除非有充分的理由准确指定模型,否则通常最好让 R 为您选择最佳模型:

fit <- ets(zooDataWeekly)
fc <- forecast(fit)
plot(fc)

【讨论】:

  • 罗布,感谢您的回答。我倾向于使用 zoo,因为它更容易指定并根据需要强制转换为 ts。在您的回答和 Gabor 的回答之间,我有一个未回答的问题,那就是在声明频率时如何正确处理 ts 对象中的日期。我倾向于期望大多数函数会保留传递给它们的 zoo 对象的日期。
  • 不幸的是 ts 不擅长处理日期,除非以年为单位指定时间段(而不是这里的周数)。
  • hw 将其第一个参数转换为ts,因此只要您确保它转换为适当的 ts 对象,任何具有as.ts 方法的时间序列类都可以。 zoo 和 zooreg 确实有 as.ts 方法。您可以尝试 as.ts(z) 其中 z 是 zoo 或 zooreg 对象只是为了检查。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2014-11-04
  • 1970-01-01
相关资源
最近更新 更多