R語言-時間序列
時間序列:可以用來預測未來的參數,
1.生成時間序列對象
1 sales <- c(18, 33, 41, 7, 34, 35, 24, 25, 24, 21, 25, 20, 2 22, 31, 40, 29, 25, 21, 22, 54, 31, 25, 26, 35) 3 # 1.生成時序對象 4 tsales <- ts(sales,start = c(2003,1),frequency = 12) 5 plot(tsales) 6 # 2.獲得對象信息 7 start(tsales) 8 end(tsales) 9 frequency(tsales)10 # 3.對相同取子集 11 tsales.subset <- window(tsales,start=c(2003,5),end=c(2004,6)) 12 tsales.subset
結論:手動生成的時序圖
2.簡單移動平均
案例:尼羅河流量和年份的關系
1 library(forecast) 2 opar <- par(no.readonly = T) 3 par(mfrow=c(2,2)) 4 ylim <- c(min(Nile),max(Nile)) 5 plot(Nile,main=‘Raw time series‘) 6 plot(ma(Nile,3),main = ‘Simple Moving Averages (k=3)‘,ylim = ylim) 7 plot(ma(Nile,7),main = ‘Simple Moving Averages (k=3)‘,ylim = ylim) 8 plot(ma(Nile,15),main = ‘Simple Moving Averages (k=3)‘,ylim = ylim) 9 par(opar)
結論:隨著K值的增大,圖像越來越平滑我們需要找到最能反映規律的K值
3.使用stl做季節性分解
案例:Arirpassengers年份和乘客的關系
1 # 1.畫出時間序列 2 plot(AirPassengers)3 lAirpassengers <- log(AirPassengers) 4 plot(lAirpassengers,ylab = ‘log(Airpassengers)‘) 5 # 2.分解時間序列 6 fit <- stl(lAirpassengers,s.window = ‘period‘) 7 plot(fit) 8 fit$time.series 9 par(mfrow=c(2,1)) 10 # 3.月度圖可視化 11 monthplot(AirPassengers,xlab=‘‘,ylab=‘‘) 12 # 4.季度圖可視化 13 seasonplot(AirPassengers,year.labels = T,main = ‘‘)
原始圖 對數變換
總體趨勢圖 月度季度圖
4.指數預測模型
4.1單指數平滑
案例:預測康涅狄格州的氣溫變化
# 1.擬合模型 fit2 <- ets(nhtemp,model = ‘ANN‘) fit2 # 2.向前預測 forecast(fit2,1) plot(forecast(fit2,1),xlab = ‘Year‘, ylab = expression(paste("Temperature (",degree*F,")",)), main="New Haven Annual Mean Temperature") # 3.得到準確的度量 accuracy(fit2)
結論:淺灰色是80%的置信區間,深灰色是95%的置信區間
4.2有水平項,斜率和季節項的指數模型
案例:預測5個月的乘客流量
1 # 1.光滑參數 2 fit3 <- ets(log(AirPassengers),model = ‘AAA‘) 3 accuracy(fit3) 4 # 2.未來值預測 5 pred <- forecast(fit3,5) 6 pred 7 plot(pred,main=‘Forecast for air Travel‘,ylab = ‘Log(Airpassengers)‘,xlab = ‘Time‘) 8 # 3.使用原始尺度預測 9 pred$mean <- exp(pred$mean) 10 pred$lower <- exp(pred$lower) 11 pred$upper <- exp(pred$upper) 12 p <- cbind(pred$mean,pred$lower,pred$upper) 13 dimnames(p)[[2]] <- c(‘mean‘,‘Lo 80‘,‘Lo 95‘,‘Hi 80‘,‘Hi 95‘) 14 p
結論:從表格中可知3月份的將會有509200乘客,95%的置信區間是[454900,570000]
4.3ets自動預測
案例:自動預測JohnsonJohnson股票的趨勢
1 fit4 <- ets(JohnsonJohnson) 2 fit4 3 plot(forecast(fit4),main=‘Johnson and Johnson Forecasts‘, 4 ylab="Quarterly Earnings (Dollars)", xlab="Time")
結論:預測值使用藍色線表示,淺灰色表示80%置信空間,深灰色表示95%置信空間
5.ARIMA預測
步驟:
1.確保時序是平穩的
2.找出合理的模型(選定可能的p值或者q值)
3.擬合模型
4.從統計假設和預測準確性等角度評估模型
5.預測
library(tseries) plot(Nile) # 1.原始序列差分一次 ndiffs(Nile) dNile <- diff(Nile) # 2.差分後的圖形 plot(dNile) adf.test(dNile) Acf(dNile) Pacf(dNile) # 3.擬合模型 fit5 <- arima(Nile,order = c(0,1,1)) fit5 accuracy(fit5) # 4.評價模型 qqnorm(fit5$residuals) qqline(fit5$residuals) Box.test(fit5$residuals,type = ‘Ljung-Box‘) # 5.預測模型 forecast(fit5,3) plot(forecast(fit5,3),xlab = ‘Year‘,ylab = ‘Annual Flow‘)
原始圖 一次差分圖形
正態Q-Q圖(如果滿足正態分布,點會落在圖中的線上) 使用Arima(0,1,1)模型的預測值
Arima自動預測
案例:預測3個月之後的太陽黑子
1 fit6 <- auto.arima(sunspots) 2 fit6 3 forecast(fit6,3) 4 accuracy(fit6) 5 plot(forecast(fit6,3), xlab = "Year", 6 ylab = "Monthly sunspot numbers")
結論:函數自動選定(2,1,2)與其他模型相比,AIC的值最小,預測結果更準確
R語言-時間序列