4.7.1 移動平均による古典的な時系列の成分への分解 decompose()
時系列を,移動平均により季節,傾向,不規則成分に分解する.加法,乗法モデルをと もに扱える.
書式:
decompose(x, type=c("additive","multiplicative"), filter=NULL)
*5Portmanteau適合度検定は「かばん」検定と訳されることがある.複数の期間にわたる自己相関の有無
をまとめて検定する.時系列解析ではBox-Pierce, Ljung-Box検定が代表的.
引数:
x
時系列type
季節成分のタイプfilter
季節成分を取り除くためのフィルタ係数のベクトルで(AR,MA
係数のように
)
時間に関して逆順に並べる.NULL
なら,対称なウィンドによる移動平均が 使われる返り値: クラス
"decomposed.ts"
のリストで次の成分を持つ:seasonal
季節成分(
つまり,繰り返される季節パターン)
figure
推定された季節パターンのみtrend
傾向成分random
残りの不規則成分type type
引き数値加法,加法モデルはそれぞれ次式で定義される.
T
t, S
t, e
tはそれぞれ傾向成分,季節 成分,残差である:Y
t= T
t+ S
t+ e
t, Y
t= T
tS
t+ e
t.
注意:関数
stl()
はより洗練された分解を与える.# 炭酸ガス濃度データco2を使用(以下の図を参照)
> m <- decompose(co2)
> m$figure
[1] -0.05100038 0.61075638 1.38363926 2.50942755 2.99729917 2.34354917 [7] 0.82455143 -1.24613551 -3.07113551 -3.25780218 -2.08016704 -0.96298236
> plot(m)
320330340350360
observed 320330340350360
trend −3−2−10123
seasonal −0.50.00.5
random
1960 1970 1980 1990
Time
Decomposition of additive time series
炭酸ガス濃度データの成分への分 解
上から,原データ,傾向成分,季 節成分,不規則成分
4.7.2 loess を用いた時系列の成分への分解 stl()
loess()
関数を用いた時系列の,季節,傾向,不規則成分への分割(Seasonal Decom-position of Time Series by Loess)
.STL
と略される.書式:
stl(x, s.window, s.degree = 0, t.window = NULL, t.degree = 1, l.window = nextodd(period), l.degree = t.degree,
s.jump = ceiling(s.window/10), t.jump = ceiling(t.window/10), l.jump = ceiling(l.window/10), robust = FALSE,
inner = if(robust) 1 else 2, outer = if(robust) 15 else 0, na.action = na.fail)
引数:
x
分解すべき一変量時系列.周期が2
以上のクラス"ts"
のオブジェクトs.window
文字列"periodic"
か,季節成分取り出しのためのloess()
のウィンド 幅(
ラグ単位)
で奇数.既定値は無いs.degree
季節成分取り出しのための局所的当てはめ多項式の次数.0
か1
t.window
傾向成分を取り出すためのloess()
用のウィンドの区間幅(
ラグ単位)
で 奇数.NULL
なら既定値はceiling((1.5*period)/(1-(1.5/s.window)))
以 上の最小の奇数t.degree
傾向成分取り出しのための局所当てはめ多項式の次数.0
か1
l.window
各副系列に使われるローパスフィルタのloess()
用のウィンドの区間幅(
ラグ単位)
.既定値はfrequency(x)
以上の最小奇数で,傾向・季節成分間の競 合を防ぐために勧められる.もし奇数でなければ,次に大きい奇数に増やされるl.degree
副系列用のローパスフィルタの局所的当てはめ多項式の次数.0
か1
s.jump,t.jump,l.jump
それぞれの平滑操作を加速するための整数で,最低でも1
.各
*.jump
番目の値間で線形補間がされるrobust
論理値でloesss()
の適用に当たって頑健な当てはめを使うかどうか指示inner
整数.「内的(
後退的当てはめ)
な」繰り返し数.普通僅か(2
回)
の繰り返しで 十分outer
整数.「外的な」頑健性のための繰り返し数na.action
欠側値に対する処理返り値: クラス
"stl"
のリストで次の成分を持つ:time.series
列seasonal, trend, remainder
を持つ多変量時系列weights
最終的な頑健重み(
もし当てはめが頑健に行われないならば全て1)
call
呼出し式win "s", "t", "l"
平滑操作に対して使われる区間幅を持つ長さ3
の整数ベクトルdeg
それぞれの平滑操作に対して使われる多項式の次数を持つ長さ3
の整数ベクトルjump
それぞれの平滑操作に対して使われる「ジャンプ」数を持つ長さ3
の整数ベクトル
ni
内的な繰りかえし数no
外的な繰りかえし数季節成分は季節副系列
(
全ての一月の値,全ての二月の値,...
からなる系列)
をloess()
で平滑化することにより得られる.もしs.window = "periodic"
ならば,平滑化は実 際には平均操作で置き換えられる.季節値が取り除かれ,残りが傾向成分を見出すため平 滑化される.全体的水準が季節成分から除かれ,傾向成分に加えられる.この過程が数回 繰り返される.remainder
成分は季節成分と傾向成分の和からの残差である.結果のク ラス"stl"
にはplot.stl()
等の幾つかのメソッドがある.注意: これは
S-PLUS
のstl()
関数に似ているが同一ではない.S-PLUS
が与えるremainder
成分は,この関数のtrend
,remainder
成分の和である.関連: クラス
stl
オブジェクト用のプリントメソッド関数plot.stl(), loess() (
実際 はstl()
中では使われない)
,別種の分解を与えるStructTS()
.# ノッチンガム城の気温データnottemを使用(以下の図を参照).図を横に並べるため余白の調整
> op <- par(mar = c(0, 4, 0, 3), oma = c(5, 0, 4, 0), mfcol = c(4, 2))
> plot(stl(nottem, "per"), set.pars=NULL) # 周期条件で分解
> plot(stl(nottem, s.win = 4, t.win = 50, t.jump = 1), set.pars=NULL)
3035404550556065
data −10−50510
seasonal 48495051
trend −6−4−2024
1920 1925 1930 1935 1940
remainder
time
3035404550556065
data −10−5051015
seasonal 48.048.549.049.550.0
trend −4−20246
1920 1925 1930 1935 1940
remainder
time
5.755.805.855.90
data −0.010−0.0050.0000.005
seasonal 5.755.805.855.90
trend −0.0020.0000.0010.002
1960 1970 1980 1990
remainder
time
5.755.805.855.90
data −0.010−0.0050.0000.005
seasonal 5.755.805.855.90
trend −0.0050.0000.0050.010
1960 1970 1980 1990
remainder
time
stl(mdeaths, s.w = "per", robust = FALSE / TRUE )
1000150020002500 −4000200400600
1300140015001600 −400−2000200400600
1974 1975 1976 1977 1978 1979 1980
time
1000150020002500
data −400−2000200400
seasonal 135014501550
trend −2000200400600800
1974 1975 1976 1977 1978 1979 1980
remainder
time
stl()による時系列の成分への分解 (上左) ノッチンガム城の気温データ.上か ら原データ季節成分,傾向成分,不規則成分.
左は周期条件制約
(上右) 炭酸ガス濃度データの対数値.右は 線形トレンド,周期制約条件
(下左) 英国の呼吸器疾患死亡者数.右は頑 健版
# 炭酸ガス濃度データco2を使用
> plot(stllc <- stl(log(co2), s.window=21), set.pars=NULL) # 対数値を分解
> summary(stllc) # 分解結果要約
# 線形トレンド,周期条件
> plot(stl(log(co2), s.window="per", t.window=1000), set.pars=NULL)
> data(UKLungDeaths) # 英国の呼吸器疾患死亡者数
> stmd <- stl(mdeaths, s.w = "per") # 頑健でない
> summary(stmR <- stl(mdeaths, s.w = "per", robust = TRUE)) # 頑健版の要約 Call:
stl(x = log(co2), s.window = 21) Time.series components:
seasonal trend remainder
Min. :-9.939103e-03 Min. :5.753541 Min. :-2.255405e-03 1st Qu.:-4.536535e-03 1st Qu.:5.778556 1st Qu.:-4.586796e-04 Median : 8.777611e-04 Median :5.815125 Median :-8.867395e-06 Mean :-1.304469e-06 Mean :5.819267 Mean :-1.965549e-06 3rd Qu.: 4.997747e-03 3rd Qu.:5.859806 3rd Qu.: 4.023465e-04 Max. : 9.114691e-03 Max. :5.898750 Max. : 1.939626e-03 (途中省略)
> plot(stmd, set.pars=NULL, labels = NULL,
main = "stl(mdeaths, s.w = \"per\", robust = FALSE / TRUE )")
> plot(stmR, set.pars=NULL)
> iO <- which(stmR $ weights < 1e-8) # 外れ値をマーク(外れ値は10個)
> sts <- stmR$time.series
> points(time(sts)[iO], .8* sts[,"remainder"][iO], pch = 4, col = "red")