簡體   English   中英

R中的時間序列分析

[英]Time series Analysis in R

我已經獲得了 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)

Qty的數據由下式給出:

數量 = c(53, 40, 37, 45, 69, 105, 62, 101, 104, 46, 92, 157, 133, 173, 139, 163, 145, 154, 245, 147, 81 192, 240, 346, 267, 267, 243, 233, 233, 244, 241, 136, 309, 236, 310, 266, 280, 321, 349, 335, 3, 4, 6, 24, 24 282, 203, 250, 233, 233, 277, 338, 279, 279, 266, 253, 178, 238, 126, 279, 258, 350, 277, 226, 16, 182, 82 133, 292, 212, 307, 232, 165, 107, 121, 188, 198, 154, 128, 85, 106, 67, 63, 88, 107, 56, 41, 7, 5, 5 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

另外,您認為我們在這里使用的 ets 以外的任何其他模型都可以解決這個問題嗎?

理解ets()

ets()函數是一種用於狀態空間模型的指數平滑技術。 默認情況下, ets()函數將嘗試使用提供的frequency=參數通過model = 'ZZZ'自動將模型擬合到時間序列。 這尤其成問題,因為不正確指定的frequency=將導致生成非理想模型,而季節性會產生平坦的估計。

季節性

您可能認為應該在ts()對象中為每日數據指定frequency=1 然而,這是一種不正確的方法。 實際上,指定frequency=的正確方法是理解 R 的“唯一”定義:

頻率每個季節的觀察次數

因此,我們需要關注您數據的季節性。

有兩個指導表可以參考。

首先是宏觀觀點:

Data    Frequency
Annual      1
Quarterly   4
Monthly     12
Weekly      52

二是微觀:

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 )。 通過基於上述更改它,我們得到:

# 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)

頻率_7

替代模型

還有兩個值得簡要研究的模型: HoltWinters()auto.arima() 可用於先前的討論: HoltWinters vs. ets

hw = HoltWinters(ts_product)
f_ets = predict(hw, n.ahead = 28, prediction.interval = T, level = 0.95)
plot(hw, f_ets)

霍爾特溫特斯

通過運行auto.arima()生成的ARIMA

aa = auto.arima(ts_product)
f_ets = forecast(aa, h = 28)
plot(f_ets)

auto_arima

雜項數據說明

簡要查看您的數據:

ts_product = ts(a, start=1, frequency=1)
plot(ts_product)

ts_graph

請注意,時間 18-85 之間存在相對較大的干擾,這會導致模型被認為是非平穩的。 您可能希望首先嘗試通過diff()對其進行區分,然后重復上述操作。

此外,您可能想要嘗試獲取一整年的數據,而不僅僅是 118 天。

看看?arima 例如:

mar=arima(product$Qty,order = c(1,0,1))
f_ar=forecast(mar, h=28)
plot(f_ar)

在此處輸入圖片說明

您的數據似乎具有季節性,請嘗試在 ets 或 arima 模型中使用該信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM