R中的时间序列分析

Raj*_*Raj 1 r time-series forecasting

我已经获得了118天的数据集.我应该预测接下来28天的价值.我已经尝试了下面的代码.但是我在28天内获得了相同的价值.你能帮我找到我的错吗?谢谢.

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)
Run Code Online (Sandbox Code Playgroud)

数据由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,233,277,338,279,279,266,253,178,238,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)

这是我得到的预测.

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
Run Code Online (Sandbox Code Playgroud)

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

coa*_*ess 6

理解 ets()

ets()函数是状态空间模型的指数平滑技术.默认情况下,该ets()函数将尝试model = 'ZZZ'使用提供的frequency=参数自动将模型拟合到时间序列.这尤其成问题,因为错误指定frequency=将导致非理想模型生成季节性,从而产生平坦估计.

Seasonalities

您可能认为应该frequency=1ts()对象中指定日常数据.但是,这是一种不正确的方式.事实上,指定的正确方法frequency=是理解R的"唯一"定义:

频率是观测的数量每赛季.

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

有两个指导表可供咨询.

第一个是宏观视图:

Data    Frequency
Annual      1
Quarterly   4
Monthly     12
Weekly      52
Run Code Online (Sandbox Code Playgroud)

第二个是微观视图:

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
Run Code Online (Sandbox Code Playgroud)

frequency=每日数据需要考虑两个季节性因素(例如选项):

7(每周)和365.25(每日)

有关更多信息,请参阅:季节性时段

重新审视估计

之所以ets()不能正常工作,是因为使用了季节性.(例如frequency = 1).通过根据以上内容进行更改,我们得到:

# 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)
Run Code Online (Sandbox Code Playgroud)

freq_7

替代型号

还有其他三款车型值得研究的简要:HoltWinters(), auto.arima(),和gmwm().讨论可用于先前:HoltWinters与ets

hw = HoltWinters(ts_product)
f_ets = predict(hw, n.ahead = 28, prediction.interval = T, level = 0.95)
plot(hw, f_ets)
Run Code Online (Sandbox Code Playgroud)

HoltWinters

ARIMA运行中产生auto.arima():

aa = auto.arima(ts_product)
f_ets = forecast(aa, h = 28)
plot(f_ets)
Run Code Online (Sandbox Code Playgroud)

auto_arima

并且,最后,小波矩的广义方法(GMWM){免责声明:我是作者之一},在撰写本消息时,它没有预测函数,但可以分解不同的状态空间.

install.packages("gmwm")
library("gmwm")

(b = gmwm(WN()+RW(), ts_product))
plot(b, process.decomp = T)
Run Code Online (Sandbox Code Playgroud)

gmwm_estimation

型号输出:

型号信息:

估计

WN 1709.2589

RW 400.0807

  • 用于最小化GMWM目标函数的参数的初始值由种子下面的程序生成:1337.

其他数据说明

简要查看您的数据:

ts_product = ts(a, start=1, frequency=1)
plot(ts_product)
Run Code Online (Sandbox Code Playgroud)

ts_graph

注意,在18-85之间存在相对大的干扰,这将导致模型被认为是非静止的.您可能希望先尝试将其差异化diff(),然后重复上述步骤.

此外,您可能希望尝试获取一整年的数据而不是仅仅118天.