Rでar関数や残差分析などの復習
前回「Rのts.arima関数を使ってみる」を書いてから、5日経過。
すでに色んなことを忘れているwww。1日開けば殆ど忘れます。SE的にすべきことが多いので。
今回は、まずRの使い方の復習から。
>setwd("D:\\dev\\DataAnalysis\\Data") >f1min_20151112_Day<-read.csv("f1min_20151112_Day.csv") >f1min_20151112_Day.close<-f1min_20151112_Day[,5] >f1min_20151112_Day.close.ts<-as.ts(as.numeric(f1min_20151112_Day.close)) >library(forecast) >f1min_20151112_Day.close.ts.arima<-auto.arima(f1min_20151112_Day.close.ts,max.p=100,stepwise=T,trace=T) >plot(forecast(auto.arima(f1min_20151112_Day.close.ts,max.p=100,stepwise=T,trace=T),level=c(10,50,90),h=100))
とりあえず、Rでグラフ描画。ここまでは前回と同じ(ファイル名など若干変更しているがデータは同じ)。
◎自己相関関数(ACF:Auto Correlation Function)の描画
> acf(f1min_20151112_Day.close.ts)
◎偏自己相関関数(PACF:partial autocorrelation function)の描画
> pacf(f1min_20151112_Day.close.ts)
直前のラグ以外は相関が非常に小さいので、直前データからの影響のみ考えれば良い?
◎モデル推定
試しにARモデルを仮定する。
Rの関数ARで自己回帰モデルを求めてみる。
> ar(f1min_20151112_Day.close.ts,aic=TRUE, order.max=25) Call: ar(x = f1min_20151112_Day.close.ts, aic = TRUE, order.max = 25) Coefficients: 1 2 3 4 5 6 7 0.7873 0.1407 0.1064 -0.0722 -0.0785 -0.0521 0.1434 Order selected 7 sigma^2 estimated as 65.73
次数7のARモデルが提案された。
AICを確認してみる。
> ar(f1min_20151112_Day.close.ts,aic=TRUE, order.max=25)$aic 0 1 2 3 4 5 896.2693150 8.2582626 0.6746665 1.5664388 2.4096834 4.3744895 6 7 8 9 10 11 5.0628233 0.0000000 1.9851290 3.4629374 3.7822072 5.7391055 12 13 14 15 16 17 5.4711945 5.8728777 7.1771941 7.5596980 9.5242780 10.5502276 18 19 20 21 22 23 10.5247654 11.2311400 12.4292297 14.0319148 15.9847824 17.6573267 24 25 17.6592898 19.2360679
プロットしてみる。
> plot(ar(f1min_20151112_Day.close.ts,aic=TRUE, order.max=25)$aic)
次数0だけが非常にAICが大きいので、これを除いてプロットしてみる。
> plot(ar(f1min_20151112_Day.close.ts,aic=TRUE, order.max=25)$aic[2:24])
次数2のARモデルが次数7のARモデルの次にAICが小さいようだ。
◎モデルの診断
残差分析を行って、作成したモデルの適切さを判断する。
ARモデルは、「残差が平均0の正規分布に従い、互いに独立であること」を条件としたモデルなので、これに近いことが望まれる。
リュング・ボックス検定を行って、残差の独立性を検定してみる。
> f1min_20151112_Day.close.ar<- ar(f1min_20151112_Day.close.ts,aic=TRUE,order.max=25) > Box.test(f1min_20151112_Day.close.ar$res, type="Ljung") Box-Ljung test data: f1min_20151112_Day.close.ar$res X-squared = 0.094802, df = 1, p-value = 0.7582
ここで以下のwikipediaからの引用を参照する。
これを見ると、P値が大きく帰無仮説が棄却できないと、「残差は無作為である」ことが言えそう。
大きいとは定量的に幾ら以上のことを言うのかは。。。わからない。。。
有意水準をαとして、p値がα以上の場合に帰無仮説を棄却できない(逆に、p<αの際に帰無仮説が棄却される)のだが、ここでは有意水準αを0.05(5%)として、p値は大きいとしておこう・・・。
Ljung-Box 検定は、以下のとおり定義される。
H0:(帰無仮説)データは無作為である。
Ha:(対立仮説)テータは無作為でない。
ここで、Ljung-Box 統計量(-とうけいりょう、英: Ljung-Box statistic)を以下のとおり定義する。
これで、次数7のARモデルは残差の独立性についてはOKであろう。
残差の正規性を検証する。
さて、ar関数を使用してAR(7)を求めたが、arima関数を使用して同じものを求めてみる。
何故かと言うと、AICの計算値はAR(7)の次にAR(2)が大きかったので、AR(2)も調べてみたいのだが、ar関数を使用したAR(2)の求め方が分からないからw。なので、arima関数を使用してAR(7)とAR(2)を求めてみようということ。
> f1min_20151112_Day.close.arima700<- arima(f1min_20151112_Day.close.ts,orde=c(7,0,0)) > f1min_20151112_Day.close.arima700 Call: arima(x = f1min_20151112_Day.close.ts, order = c(7, 0, 0)) Coefficients: ar1 ar2 ar3 ar4 ar5 ar6 ar7 intercept 0.7778 0.1684 0.1130 -0.0840 -0.0589 -0.0934 0.1544 19684.1574 s.e. 0.0547 0.0696 0.0701 0.0703 0.0703 0.0700 0.0554 15.7499 sigma^2 estimated as 57.13: log likelihood = -1171.65, aic = 2361.3
これがAR(7)。ar関数を使用して求めた結果と若干数値が異なるが、気にしないw。
これに残差分析を行う。
> Box.test(f1min_20151112_Day.close.arima700$resid, type="Ljung") Box-Ljung test data: f1min_20151112_Day.close.arima700$resid X-squared = 0.002245, df = 1, p-value = 0.9622
有意水準α=0.05として、p値は0.9622>αなので、帰無仮説を棄却できない。
やはり、arima関数を使用した場合でも残差の独立性に問題はない。
ちなみに、arima関数を使用した場合、モデル診断を行うツールとしてtsdiag関数を使用できる。
> tsdiag(f1min_20151112_Day.close.arima700, gof.lag=12)
◎予測
predict関数を使用すればできる。
n.aheadには予測期間を指定する。
> (f1min_20151112_Day.close.ar.predict<-predict(f1min_20151112_Day.close.ar,n.ahead=10)) $pred Time Series: Start = 341 End = 350 Frequency = 1 [1] 19686.72 19687.08 19685.90 19688.42 19690.72 19693.76 19692.16 19692.42 [9] 19692.48 19691.69 $se Time Series: Start = 341 End = 350 Frequency = 1 [1] 8.107262 10.318167 12.019842 13.719601 15.042394 15.963852 16.562025 [8] 17.229448 17.821954 18.355708
プロットしてみる。
> ts.plot(f1min_20151112_Day.close.ar.predict$pred)
過去の実測値に予測データを付け加えてプロットしてみる。
> ts.plot(f1min_20151112_Day.close)
> lines(f1min_20151112_Day.close.ar.predict$pred, col="red")