首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的时间序列分析

R中的时间序列分析
EN

Stack Overflow用户
提问于 2016-04-25 21:19:40
回答 2查看 1.6K关注 0票数 2

我已经有118天的数据集了。我应该预测下一个28天的数值。我已经试用了下面的代码。但是我得到了28天相同的数值。你能帮我找到我的错误吗?谢谢。

代码语言:javascript
复制
library(forecast)
library(dplyr)
head(product)
ts_product = ts(product$Qty, start=1,frequency=1)
ts_product
plot(ts_product)
#predictions of 28 days
m_ets = ets(ts_product)
f_ets = forecast(m_ets, h=28)
plot(f_ets)

Qty的数据由以下方法提供:

Qty = c(53、40、37、45、69、105、62、101、104、46、92、157、133、173、139、163、145、154、245、147、85、131、228、192、240、346、267、267、243、233、233、244、241、136、309、236、310、266、280、321、349、335、410、226、391、314、250、368、282、203、250、233、277、338、279、279、266、253、178238、126、279、258、350、277、226、287、180、268、191、279、214、133、292、212、307、232、165、107、121、188、198、154、128、85、106、67、63、88、107、56、41、59、27、58、80、75、93、54、14、36、107、82、83、112、37、57、9、51、47、57、68、97、25、45、69、89)

这是我得到的预言。

代码语言:javascript
复制
Point Forecast      Lo 80    Hi 80      Lo 95    Hi 95
119       69.53429   2.089823 136.9788  -33.61312 172.6817
120       69.53429  -2.569107 141.6377  -40.73834 179.8069
121       69.53429  -6.944751 146.0133  -47.43031 186.4989
122       69.53429 -11.083248 150.1518  -53.75959 192.8282
123       69.53429 -15.019428 154.0880  -59.77946 198.8480
124       69.53429 -18.780346 157.8489  -65.53129 204.5999
125       69.53429 -22.387517 161.4561  -71.04798 210.1166
126       69.53429 -25.858385 164.9270  -76.35622 215.4248
127       69.53429 -29.207323 168.2759  -81.47798 220.5466
128       69.53429 -32.446345 171.5149  -86.43163 225.5002
129       69.53429 -35.585612 174.6542  -91.23273 230.3013
130       69.53429 -38.633808 177.7024  -95.89454 234.9631
131       69.53429 -41.598429 180.6670 -100.42854 239.4971
132       69.53429 -44.485993 183.5546 -104.84468 243.9133
133       69.53429 -47.302214 186.3708 -109.15172 248.2203
134       69.53429 -50.052133 189.1207 -113.35736 252.4259
135       69.53429 -52.740222 191.8088 -117.46844 256.5370
136       69.53429 -55.370474 194.4391 -121.49106 260.5596
137       69.53429 -57.946468 197.0150 -125.43070 264.4993
138       69.53429 -60.471431 199.5400 -129.29230 268.3609
139       69.53429 -62.948280 202.0169 -133.08032 272.1489
140       69.53429 -65.379664 204.4482 -136.79880 275.8674
141       69.53429 -67.768000 206.8366 -140.45144 279.5200
142       69.53429 -70.115495 209.1841 -144.04163 283.1102
143       69.53429 -72.424177 211.4928 -147.57245 286.6410
144       69.53429 -74.695908 213.7645 -151.04676 290.1153
145       69.53429 -76.932409 216.0010 -154.46719 293.5358
146       69.53429 -79.135268 218.2038 -157.83618 296.9048

另外,你认为除了ets以外,我们在这里使用的任何其他模型都能解决这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2016-04-26 01:58:53

理解ets()

ets()函数是状态空间模型的一种指数平滑技术。默认情况下,ets()函数将尝试使用提供的frequency=参数通过model = 'ZZZ'自动将模型与时间序列相匹配。这尤其有问题,因为不正确指定的frequency=将导致生成非理想模型w.r.t到季节性,从而产生平坦的估计。

季节性

您可能认为应该在frequency=1对象中为日常数据指定ts()。然而,这是一种不正确的做法。事实上,指定frequency=的正确方法是理解R的“唯一”定义:

频率是每个季节的观测次数。

因此,我们需要关注数据的季节性。

有两个指导表可供参考。

第一个是宏视图:

代码语言:javascript
复制
Data    Frequency
Annual      1
Quarterly   4
Monthly     12
Weekly      52

第二种是微观观点:

代码语言:javascript
复制
Data    Frequencies             
         Minute  Hour   Day   Week   Year
Daily                          7     365.25
Hourly                    24  168    8766
Half-​​hourly               48  336    17532
Min­utes             60   1440 10080  525960
Sec­onds      60   3600  86400 604800 31557600

在日常数据中有两个季节(例如frequency=选项)需要考虑:

7 (每周)和365.25 (每日)

有关更多信息,请参见:季节周期

重新审视估计

ets()不能正常工作的原因是由于所使用的季节性。(如frequency = 1)。通过在上述基础上对其进行更改,我们得到:

代码语言:javascript
复制
# Changed the frequency to 7
ts_product = ts(product$Qty, start=1, frequency=7)

# Predictions of 28 days
m_ets <- ets(ts_product)
f_ets <- forecast(m_ets, h = 28)
plot(f_ets)

替代模型

还有另外两种模型值得简短地研究:HoltWinters()auto.arima()。的讨论可用于前面的:HoltWinters与ets

代码语言:javascript
复制
hw = HoltWinters(ts_product)
f_ets = predict(hw, n.ahead = 28, prediction.interval = T, level = 0.95)
plot(hw, f_ets)

运行ARIMA生成的auto.arima()

代码语言:javascript
复制
aa = auto.arima(ts_product)
f_ets = forecast(aa, h = 28)
plot(f_ets)

Misc数据说明

简要查看您的数据如下:

代码语言:javascript
复制
ts_product = ts(a, start=1, frequency=1)
plot(ts_product)

注意,在18-85次之间有一个相对较大的扰动,这会导致模型被认为是非平稳的。您可能希望首先尝试通过diff()对其进行差分,然后重复上面的内容。

此外,您可能希望获得全年的数据,而不是仅仅118天。

票数 7
EN

Stack Overflow用户

发布于 2016-04-26 00:36:13

看看?arima。例如:

代码语言:javascript
复制
mar=arima(product$Qty,order = c(1,0,1))
f_ar=forecast(mar, h=28)
plot(f_ar)

您的数据似乎具有季节性,尝试在ets或arima模型中使用这些信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36851269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档