状態空間モデルの実行方法と実行環境の比較 ·...
TRANSCRIPT
状態空間モデルの実行方法と実行環境の比較
誌名誌名 日本生態學會誌
ISSNISSN 00215007
著者著者 伊東, 宏樹
巻/号巻/号 66巻2号
掲載ページ掲載ページ p. 361-374
発行年月発行年月 2016年7月
農林水産省 農林水産技術会議事務局筑波産学連携支援センターTsukuba Business-Academia Cooperation Support Center, Agriculture, Forestry and Fisheries Research CouncilSecretariat
日本生態学会誌 66:361 -374 (2016) j金鍾惨事
肩蚕互生態学分野における状態空間モデルの利用
騒割
状態空間モデルの実行方法と実行環境の比較
伊東 宏樹*
森林総合研究所
A comparison of so食waresfor state space models
Hiroki Ito*
Fores位yand Forest Products Research Institute
要旨:状態空間モデルを使用した統計解析をおこなうためのソフトウェア環境として、 dlm・ KFAS ・ BUGS言語 ・Stan
を紹介する。 dlmおよびKFASはRパッケージであり、比較的簡単に利用可能で、ある。 dlmは誤差分布に正規分布のみ
利用可能であるが、 KFASではポアソン分布なども利用可能である。一方、パラメーター推定に関しては dlmでは最尤
推定のほか、マルコフ連鎖モンテカルロ法(MCMC)によるベイズ推定が可能である。 BUGS言語は、 MCMCによる
ベイズ推定のためのモデリング言語であり、実行処理系としては WinBUGS、OpenBUGS、JAGSがある。柔軟なモデリ
ングが可能であり、状態空間モデルを記述することもできる。 Stanは比較的新しいソフトウェアであるが、ハミルトニ
アンモンテカルロ法を使ってベイズ推定をおこなえる。 Stanには gaussian_ dlm _obsという分布が用意されており、この
分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。また、 gaussiandim obs分
布を使用せずに、状態空間モデルを記述することも可能である。複雑なモデルのパラメーター推定は、 BUGS言語また
はStanによりベイズ推定でおこなうことになるだろうが、 dimや KFASで最尤推定が可能なモデルであればそれらを使
用する方が実用的であろう。
キーワード: BUGS、dim、KFAS、R、Stan
はじめに
状態空間モデルは、時系列データを扱うことのできる
統計的手法のひとつである。生態学では、生物の個体数
の増減といった時系列のデータをあっかう必要がしばし
ばある。時系列データでは、ある時点の測定値がその前
後の測定値と相関をもっ、すなわち時間的自己相闘があ
ることが多い。直線回帰はじめ通常の統計的手法は、各
測定値は独立にサンプリングされたものであることを前
提にしているのが普通で、あるため、自己相関のあるデー
タに適用すると解釈を誤ることになりかねない
(Commandeur and Koopman 2007)。このため、時系列デー
タの解析のためには、自己相関を考慮した統計的手法が
必要となる。
2015年3月31日受付、 2015年7月22日受理
、町mail:hiroki@a飴cgo.jp
361
状態空間モデルはまた、観測対象の(しかし直接には
観測できない)システム自体と、実際に観測値を得る過
程とを分離してモデリングする。これにより、システム
自体に由来する誤差(ノイズ)と観測に伴う誤差(ノイズ)
とをそれぞれ明示的に扱うことができ、システムの時間
的変化について妥当な推測を得ることが可能となる(深
谷 2016;山村 2016)。生態学で扱うデータでは、観測に
伴う誤差が無視できない場合が多く、これも状態空間モ
デルを使う利点となろう。
状態空間モデルは、汎用のプログラミング、言語を使っ
てもモデリングが可能であるが、さまざまな統計処理ソ
フトウェアでも利用可能である(Commandeuret al.
2011)。 2011年 5月発行の Journalof Statistical So丘ware41
巻は状態空間モデルの特集号であり、さまざまな統計処
理ソフトウェアによる状態空間モデルの解析が紹介され
ている。 R (R Core Team 2015)についても、 Petrisand
伊東宏樹
Petrone (2011)による総説が掲載されており、 Rのパッ
ケージの dlm(Petris et al. 2009 ; Pe仕is2010)とロAS(Helske
2015)を使用した例がおもに紹介されている。ただし、
KFASについては現在では関数名が変更されているとこ
ろが多々あり、注意が必要である。このほか、Tusell(2011)
の総説には、 Rでカルマンフィルターを取り扱うことの
できるパッケージの解説がある。状態空間モデル以外に
も、自己回帰移動平均モデル(システムと観測過程の分
離はおこなわない)はじめ時系列データを扱うことので
きる Rパッケージは多数あるが、ここでは詳しくは触れ
ないので、 CRANTask View: Time Series Analysis (http://
cran.r-project.org/web/views/TimeSeries.html、2015年6月3
日確認)を参照されたい。
本稿においては、状態空間モデルを使用した解析の実
行環境として、先に挙げた Rパッケージの dlmおよび
KFASを紹介するほか、 BUGS言語(Gilks et al. 1994 .
Spiegelhalter et al. 1996; Lunn et al. 2012)およびStan(Stan
Development Team 2014)を使用したパラメーターのベイ
ズ推定の実行例を紹介する。なお、使用したソフトウェ
アのパージョンは R3.1.3、dlm1.1-4、KFAS1.1.1、rjags
3-14 (JAGS 3.4.0)、 RStan2.6.0 (Stan 2.6.0)である。
本稿では、状態空間モデル自体の解説はおこなわない
ので、興味のある読者は本特集の深谷(2016)などを参
照されたい。また、生態学分野での利用例については、
本特集において飯島(2016)がシカの個体群動態を、山
村(2016)が見虫の個体数の変動をそれぞれ扱っている。
このほか、キヨンの個体数推定をおこなった浅田ほか
(2014)も、モデルについて詳しく記述しており、プログ
ラムコードも公開されているので参考になろう。
dlmによる状態空間モデルの解析
状態空間モデルを取り扱うためのRパッケージのひと
つに dlm(Bayesian and Likelihood Analysis of Dynamic
Linear Models; Petris et al. 2009 ; Petris 2010)がある。その
名前のとおり、 dlmは状態空間モデルのうち、変数聞の
関係が線形で、誤差分布が正規分布の動的線形モデル
(Dynamic Linear Model)を扱う(P出 iset al. 2009)。動的
線形モデルは、状態空間モデルの基本形ともいえ、非線
形や非正規分布のものとくらべて統計計算が比較的単純
で扱いやすいという利点がある。 dlmでは、パラメーター
推定には、最尤推定のほかマルコフ連鎖モンテカルロ法
(MCMC)によるベイズ推定も使用可能である。また、カ
ルマンフィルターによる予測およびカルマンスムーザー
362
による平滑化ができる。これらアルゴリズムの詳細につ
いては北川(2005)、 Petriset al. (2009)などを参照され
たい。
dlmにおける状態空間モデルの記法は以下の式のよう
になっており、ここで使用されている変数名がdlmの関
数でもそのまま、あるいは似た名前で(式中のF、Gが
それぞれdlmでは FF、GGとなっている)使用されている。
y, = F,(), + v,, 叫~Normal(O,JI,)
(), = G,B,.1 + w,, w,~Normal(O, W,), t = 1,…,n
o。~Normal(m0,C。)
(1)
(2)
式(1)は、状態から観測値が得られる過程をモデル化し
たもので、データモデル(あるいは「観測モデル」)と呼
ばれる。式(2)は、状態の変化をモデル化したもので、
プロセスモデル(あるいは「システムモデル」)と呼ばれ
る。 y,は時点tにおける観測値のベクト jレ、 (), は時点tに
おける状態のベクトルである。 F,,G,は係数行列であり、
v,, w,はそれぞれ、データモデルおよびプロセスモデルの
時点tの誤差ベクトルである。 Fうはデータモデルの誤差
の分散共分散行列、 w,はプロセスモデルの誤差の分散共
分散行列である。 mo,Coはそれぞれ、時点0における状
態。。の平均のベクトルおよび分散共分散行列である。
dlmによる状態空間モデルの解析の一例として、 Petris
and Petrone (2011)にあるナイル川の流量の解析例をと
りあげる(付録リスト 1)。ナイル川流量のデータは 1871年
から 1970年までのナイル川の年間流量の測定値(108m3)
であり、 Nileデータセットとして Rで利用可能である。
このデータの場合、時点 tにおける観測値y,はスカラー
である。状態がランダムウオークによって変化し、観測
値は一定の誤差(ノイズ)をともなうと仮定する。この
ようなモデルはランダムウオーク・プラス・ノイズモデ
ルまたはローカルレベルモデルと呼ばれる(Petriset al.
2009)。この場合、 81,F,, G,, v,, w,, V,, W.,もスカラーとなり、
F,およびG,はtによらず一定で、 F=G=lである。 v,お
よびw,も tによらず一定であり、 yおよび Wの値を最尤
推定する。
dlmでモデル指定をするための関数BuildLLMを定義す
る。これには多項モデルを指定する関数の dlmModPoly
関数を使用する。 dlmModPoly関数では order引数で次
数を指定し、ローカルレベルモデルでは lを与える。 dV
引数に、データモデルの誤差の分散共分散行列 yの対角
成分を、 dW引数に、プロセスモデルの誤差の分散共分散
行列 Wの対角成分を指定するが、この場合は v,wとも
状態空間モデルの実行方法と実行環境
1400
1200
σ3
E 1000 α3 0 マ嗣輔
、‘”’s ~ 800
600
1875 1900 1925 Year
1950
図 1. ナイル川流量の dimによる解析例。点+細線は観測値。灰色の太線はローカルレベルモデルに
より推定した誤差分散を使用して、平滑化をおこなった曲線。
スカラーであるため、 dVdWはそれぞれそのままデータ
モデル、プロセスモデルの誤差分散となる。 moとcoに
はそれぞれ、既定値とおなじ 0および 107を与える。定
義される関数BuildLLMは引数として thetaをとり、そ
の第 l要素に dVの値を、第2要素に dWの値を与える。
これら引数の値により指定されたモデルがBuildLLM関
数の返り値となる。
BuildLLM <-function(theta)
dlmModPoly(order = 1,
dV = theta[l],
dW = theta[2],
mo = o,
CO = le+7)
dlmMLE関数で最尤推定をおこなう。 buildにはモデル
を定義した関数を、 parmには buildで指定する関数に与
える初期値をそれぞれ指定する。この例ではさらに、
lowerにてパラメーターの下限値を指定している。
fit.llmく- dlmMLE(y = Nile, build = BuildLLM,
parm = c ( 1 O O , 2 ) ,
363
lower= rep(le-4, 2))
結果が得られたら、 print(fit.11叫 par)でパラメー
ターの推定値が表示される。
[l] 15099.787 1468.438
この例では、データモデルの分散(ηが 15100、プロセス
モデルの分散(的が 1468と推定された。
推定したパラメーターを、先に定義した BuildLLM関
数の引数に与えたモデルを得る。
model.llmくー BuildLLM(fit.llm$par)
このモデルとデータとを dlmSmooth関数の引数に与え
て、平滑化をおこなう。平滑化とはこの場合、現在まで
の観測値から過去の状態を推定することとなる。なお、
現在の状態についての推定はフィル夕、将来の状態につ
いては予測と呼ばれる(北Jll2005)。
smooth.llm <ー dlmSmooth(y= Nile,
mod = model. llm)
データと平滑化曲線をプロットしたものを図 1にしめす。
伊東宏樹
平滑化された曲線を見ると、 1900年ごろから流量が減少
したことがわかる。これは実はアスワンダムの建設が関
係しており、この要因を組み込んだモデルも dimで解析
できるのだが、ここでは触れない。興味のある方は Petris
and Petrone (2011)などを参照されたい。このほか、状
態空間モデルでは欠測値を含むデータについて尤度を計
算することができ(北川 2005)、 dimでも、この後とりあ
げる KFASでも、欠測値を“NA”にしておけばそのまま
平滑化などをおこなうことができる。
KFASによる状態空間モデルの解析
KFAS (Kalman Filter and Smoother for Exponential Family
State Space Models; Helske 2015)は dlmと同じく状態空間
モデルを扱うためのRパッケージである。dlmとは異なり、
ポアソン分布のような正規分布以外の分布も指定するこ
とができる。パラメーター推定は最尤推定によりおこな
われる。
KFASでは以下のような記法を使用している。
y,=Z,α,+e,, e,~Normal(O, H,)
αt+l = 1;α,+R,ηt,η,~Normal(O, Q.ふ t= 1,…,n
α1~Normal(a" P1)
ここで、 y,は時点 tにおける観測値、 αrは時点 tにおける
, 状態の値、 Z,,T,,R,は係数行列、 e,,, ηtはそれぞれデータ
モデルおよびプロセスモデルの誤差ベクトル、 H,,Q,は誤
差の分散共分散行列、 a,およびP,はそれぞれα1の平均
および分散共分散行列である。 dlmとは、 t= 1が最初の
データとなる点も異なっている。
KFASによる状態空間モデルの解析方法を、 KFASのオ
ンラインマニュアルにある例題をつかつて説明する(付
録リスト 2;詳細は Durbinand Koopman 1997, 2000を参
照)。データとして Seatbeltsデータセットを使用する。
このデータセットは 1969ii三1月から 1984年 12月まで、
1983年 1月31日のシートベルト着用義務化の前後にわ
たる、イギリスでの自動車事故による死者・重傷者のデ
ータを月ごとに集計したものである。
まず、以下のようにモデルを定義する。このモデルは、
シートベルト着用義務化の前後を説明変数とし、時系列
をランダムウオーク+季節成分+誤差に分解する季節調
整モデルとなっている。
364
model.van <-SSModel(VanKilled~ law +
SSMtrend(degree = 1,
Q = list(matrix(NA))) +
SSMseasonal(period = 12,
sea.type =”dummy",
Q = matrix(NA)),
data = Seatbelts,
distribution =”pois son“)
VanKilledはパンの運転者の死者数、 lawはシートベ
ルト着用義務化の前後をしめすダミー変数である。
SSMtrendはトレンド成分を構成する関数であるが、
degreeにlを指定しているので、ランダムウオークとな
る。 SSMseasonalは季節成分を構成する関数であり、
periodに12を指定することで、周期が 12、すなわち月
ごとにデータがあることを指定している。 sea.typeに
”dummy ”を指定して、月をダミー変数に変換してモデル
に取り入れている。なお、 sea.typeに冗rigonometric”
を指定すると季節成分を三角関数に当てはめることがで
きる。また、 distributionで、観測値の誤差分布にポ
アソン分布を指定している。このため、データモデルの
分散Hはこのモデルには存在しない。プロセスモデルの
誤差分散QでNAと指定されているところが、後で推定の
対象となる。
fitSSM関数により最尤推定法によるパラメーター推定
をおこなう。
fit.vanく- fitSSM(model = model. van,
inits = c(l, 1))
推定されたQの値は以下のようになる。
> fit.van卒model宇Q
' ' 1
[ 'l] [ '2]
[l,J 0.0005957183 o.ooooooe+oo
[2,] 0.0000000000 2.298786e-09
Q[ 1, l]がトレンド成分の、 Q[2, 2]が季節成分のそ
れぞれの分散となる。
つづいて、平滑化をおこなう。以下の例では、 KFS関
数により平滑化をおこなったのち、 signal関数で states
にc(”trendぺ”regression”)を指定することで、状態のうち
状態空間モデルの実行方法と実行環境
a
15
ω 忌目。〉..... て3c: 10 cu 〉
匂トー。。z
b
5
0.1
Q) 0.0 4・df百噌欄4
Cl) -0.1
-0.2
1970 1975 1980 1985 Year
1970 1975 1980 1985 Year
図2. イギリスのパン運転手の死亡数の KFASによる解析例。 a)点+細線は観測値。灰色の太線は、季節成
分を除き、トレンド成分と、 1983年 1月のシートベルト着用義務化の前後を説明変数とする回帰成分と
を使用して平滑化をおこなった曲線。 b)季節成分(実線)と回帰成分の状態(点線)。
トレンド成分と回帰成分のみを取り出すようにしている。 ただし、シートベルト着用義務化の変数を入れないモデ
ルとの尤度比検定の結果では、義務化の効果は有意では
out.van <- KFS(fit.van宇model, smoothing = なかった。
c(”state"))
sig.van <-signal(out.van,
states = c(”trend”,”regression”))
状態の値は観測値の対数スケールになっτいるので、観
測値のスケールに変換した結果を図 2aにしめす。また、
図2bには、季節成分および回帰成分の状態の値をしめし
た。 1971年ごろから死者数は減少傾向にあったが、シー
トベルト着用義務化によりさらに減少したようにみえる。
365
BUGS言語を使用した状態空間モデルの解析
BUGS言語(Gilks et al. 1994 ; Spiegelhalter et al. 1996 ;
Lunn et al. 2012)は、 MCMCによるベイズ推定のための
モデリング言語である。実行処理系としては WinBUGS
(http://www.mrc-bsu.cam.ac.uk/software/bugs/the-bugs司
project-winbugs/、2015年2月18日確認)、OpenBUGS(Lunn
et al. 2009, http://www.openbugs.net/、2015年2月18日確
伊東宏樹
50 、, 、s、 . 、ー、 . 、
ーー沖A! ・ -・(f)
c 。30ーC田百d’ コa.
d: 20 . . 10
。 10 20 30 40 50 Time
図3.発見率を考慮して個体数の変化を BUGSで推定した例。点は観測値、実線は各観測期ごとの観測値の平
均。点線は、実際の個体数の期待値。
認)、 JAGS(Plurr
net/、 2015年 2月 18日確認)がある。柔軟なモデリング
が可能で、あり、状態空間モデルを記述することも可能で、
ある(Keryand Schaub 2011)。
ここでは、発見率を考慮したモデルのパラメーター推
定を例に説明する(付録リスト 3)。データとして以下の
ような仮想データを使用する。ある生物の個体数を経時
的に観測するが、観測個体数は、実際の個体数に対して
一定の発見率で観測されるとする。また、発見率の推定
のため、 l回の観測の際に個体数の測定を複数回おこな
うとする。ここでは、 50期の観測で、各期ごとに 4回の
個体数測定をおこない、図 3の点のような観測値が得ら
れたとする。なお、実線は各期ごとの平均値である。
このデータを状態空間モデルで解析する。データモデ
ルは以下のようにモデル化した。時点 tにおける(観測
されない)実際の個体数を N,、発見率を pとして、第 t
期の i番目の観測値 Y,,は、これらをそれぞれ試行回数、
生起確率とする二項分布に従うとする。 また、 N,は
exp(A,)を平均とするポアソン分布に従う とする。
九~Binomial(N,,p)
N,~Poisson( exp(λ,))
また、プロセスモデルは、以下のようにλFがランダムウ
オークするとモデル化した。
366
λr~Normal(λt ,,d)
これを解析する BUGSコードは以下のようになる。λ1の
事前分布は、平均 0、標準偏差 100の正規分布、 pの事前
分布は [O,1]で一様なベータ分布、 σの事前分布は[O,
100]の一様分布とした。
model {
##データモデル
for ( t in 1 : n. t)
for (i in l:n.obs)
Y[t, i]~ dbin(p, N[t]);
N[t]~ dpois(exp(lambda[t]));
##フ 口セスモデル
for (t in 2:n.t)
lambda[t] -dnorm(lambda[t -l], tau);
##事前分布
lambda[l] -dnorm(O, 1.0E-4);
p -dbeta ( 1 , 1 ) ;
sigma -dunif ( 0, 100);
tau 〈ー 1I (sigma * sigma);
## exp(lambda)の計算
際医藍也民応広ιwh器品広rkγいLE号、,hi
と
状態空間モデルの実行方法と実行環境
F[ 1, l] <ー 1;
G[l, l] くー 1;
for (t in l:n.t) {
mO[l] <ー O;
CO[l, l] <ー 1.Oe+6;
exp.lambda[t] <-exp(lambda[t]);
par叩 eters{
realくlower=O>sigma(2];
.,., vw
]
噌E占I
X
1J
・1
1
r
rtt
r
a
o
m
+lM
一
c
v
e
o
v
c
transformed par釘neters{
R上から rjagsを使用して JAGSによりパラメーター推
定をおこなった結果、 pの事後平均は 0'.69、σの事後平均
は0.071と推定された。実際の個体数の期待値exp(λ,)の
事後平均を図 3にしめした。この結果から、この個体群
では、 1回の個体数測定での発見率がおよそ 70%である
ことがわかったほか、個体数は減少傾向にあることが示
V[l]く- sigma[l] * sigma[l];
W[l, l] <-sigma(2] * sigma[2];
唆された。
model {
y -gaussian_dlm」obs(F,G, v, w, mo, CO);
sigma -uniform( 0-, 1. Oe+6);
このモデルを RStanにより計算させると、 vの事後平
均として 15085、wの事後平均として 2282が得られた。
推定法の違いのためか、 dlmパッケージで計算した最尤
推定値とは値が異なり、とくにプロセスモデルの誤差分
散wが大きく推定された。ここでさらに、事後分布から
得られた値をパラメーターとして使用して、 dlmパッケ
ージの関数を利用することが可能である。この例では
dlmの節で定義したのと同等のモデルに Stanで推定した
事後平均をパラメーターとして与えた。作成されたグラ
フ(図4)を図 lとくらべると、プロセスモデルの誤差
が大きく推定されたために曲線の振れ幅がやや大きくな
っているが、傾向としては図 lと同様で、あった。
gaussian_dlm_obs分布で記述できないようなモデル
もあるが、 BUGSと同じようにモデルを記述することも
可能で、ある。上の例を gaussian一dlm_obs分布を使用せ
ずに記述すると以下のようになる。
Stanによる状態空間モデルの解析
Stan (Stan Development Team 2014)は、 2012年 8月に
パージョン 1.0がリリースされた新しいベイズ推定ソフ
トウェアである。ハミルトニアンモンテカルロ(HMC)
アルゴリズムを使用しており、通常の MCMCよりも高速
に目的分布に収束するとされる(Gelmanet al. 2013)。 R
上からは RStanパッケージにより利用できる。モデリン
グの構文自体は BUGS言語と似ているため、 BUGSを使
い慣れていれば比較的容易に理解できるであろう。ただ
し、データとパラメーターを厳密に定義する点や、分布
などの名前の相違、現在のところは離散パラメーターの
推定ができないといった点に注意が必要となる。
Stanには動的線形モデルのための gaussian一dlm_obs
という分布が用意されている。この分布を使用した例を
以下にしめす(付録リスト 4)。データにはNileを使用し、
dlmの節で作成したローカ jレレベルモデルと同等のモデ
ルである。また、 gaussian_dlm_obs分布の引数は、 dlm
パッケージの記法に合致した名前となっている。
data {
int<lower=O> N;
N;
data {
int<lower=O>
y;
transformed data {
matrix[l, l]
matrix[l, l]
F;
matrix[l, NJ
y[N]; real G;
vector[l] mO;
cov_matrix[l] CO;
theta[N];
parameters {
real
367
伊東宏樹
1400
1200
σ3
E 1000 α3 Cコマ・ー)
$:
~ 800
600
1875 1900 1925 Year
1950
図4 ナイル川流量を Stanを使用してローカルレベルモテつレで、解析した例。点+細線は観測値。灰色の太線は推定
された誤差分散を使用して平滑化をおこなった曲線。
real<lower=O> sigma[2];
model {
// データモデル
for (t in 1 :N)
y[七]~ normal(theta[t], sigma[l]);
//フ口セスモデル
for ( t in 2 : N) {
theta[t] -normal(theta[t -l],
sigma[2]);
// 事前分布
theta[l]ー normal( 0, 1. Oe+6);
sigma~ uniform( O, 1. Oe+6);
このコードを用いても、 v、wの事後平均がそれぞれ
14995、2354と、 gaussian_dlm_obs分布を使用 した場合
とほぼ同様の結果が得られた。
BUGS言語や Stanを使用すれば、ランダム効果を含む
ような複雑なモデルも記述でき、パラメーター推定をお
こなうことが可能である。ただし、実行時間がかかるこ
368
とは覚悟する必要がある。dimや KFASなどの Rパッケ
ージで最尤推定が可能なモデルであれば、それらを利用
する方が実用的ではあろう 。
おわりに
このほか、 Rのパッケージでは dse(Gilbert 2009)、
FKF (Luethi et al. 2014)などがある。R以 タトでは
MATLABや SASも状態空間モデルを扱うことができる
( Commandeur et al. 2011)。
今回紹介したモデルはいずれも比較的単純なものであ
る。実際のデータを解析するときには引用文献などを参
考に独自のモデルを構築する こと になるであろう 。
謝 辞
本稿を まとめるにあたり、山梨県森林総合研究所の飯
島勇人博士、統計数理研究所の深谷肇一博士、 2名の匠
名の査読者の方から有用なコメン トをいただいた。
にお礼申しあげる。
引用文献
、炉、F、ーー にーー
浅田正彦 ・長田穣 -深沢圭太 ・落合啓二(2014)状態
空間モデルを用いた階層ベイズ推定法によるキヨン
状態空間モデルの実行方法と実行環境
(Muntiacus reevesi)の個体数推定.日甫乳類科学, 54:53-72
Commandeur JJF, Koopman SJ (2007) An introduction to state
space time series analysis. Oxford University Press, Oxford
(日本語訳:和合肇訳(2008)状態空間時系列分析入門.
シーエーピー出版,東京)
Commandeur JJF, Koopman SJ, Ooms M (2011) Statistical
software for state space methods. Journal of Statical
Software, 41(1)
Durbin J, Koopman SJ ( 1997) Monte Carlo maximum
likelihood estimation for non-Gaussian state space models.
Biometrika, 84:669-684
Durbin J, Koopman SJ (2000) Time series analysis of non-
Gaussian observations based on state space models from
both classical and Bayesian perspectives. Journal of the
Royal Statisitcal Society Series B, 62:3-56
深谷肇ー(2016)状態空間モテゃルによる時系列解析とその
生態学への応用.日本生態学会誌, 66:375-389
G巴lmanA, Carlin JB, Stem HS, Dunson DB, Vehtari A, Rubin
DB (2013) Bayesian data analysis, 3rd ed .. CRC Press, Boca
Raton
Gilbert P (2009) Brief User’s Guide: Dynamic Systems
Estimation (DSE). http://cran.r-project.org/web/packages/
dse/vigne抗es/Guide.pdf
Gilks WR, Thomas A, Spiegelhalter DJ (1994) A language
and program' for complex Bay巴sianmodelling. Statistician,
43: 169-177
Helske J (2015) KFAS: Kalman Filter and Smoother for
Exponential Family State Space Models. R package version
1.1.l. http://CRAN.R-project.org/package=KFAS
飯島勇人(2015)シカ類の個体群動態の推定における状態
空間モデルの有用性.日本生態学会誌, 66:35ト359
Kery M, Schaub M (2011) Bayesian population analysis using
WinBUGS. Academic Press, Waltham
北川源四郎(2005)時系列解析入門.岩波書店,東京
369
Luethi D, Erb P, Otziger S (2014). FKF: Fast Kalman Filter.
R package version 0.1.3. http・://CRAN.R-project.org/
packag巴=FKF
Lunn D, Spiegelhalter D,百iomasA, Best N (2009) The BUGS
project: Evolution, critique, and fu旬redirections. Statistics
in Medicine, 28:3049-3067
Lunn D, Jackson C, Best N. Thomas A, Spiegelhalter D (2012)
The BUGS book-A practical introduction to Bayesian
analysis. CRC Press, Boca Raton
Petris G (2010) An R package for dynamic linear models.
Journal of Statistical So食ware,36(12)
Petris G, Petrone S, Campagnoli P (2009) Dynamic lin巴ar
models with R. Springer, New York (日本語訳:和合肇監
訳,萩原淳一郎訳(2013)Rによるペイジアン動的線形
モデル.朝倉書店,東京)
Pe仕isG, Petrone S (2011) State space models in R. Journal of
Statistical Software, 41(4)
Plummer M (2003) JAGS: A program for analysis of Bayesian
graphical models using Gibbs sampling. In: Proceedings of
the 3rd International Workshop on Distributed Statistical
Computing (DSC 2003). March. pp. 20-22.
R Core Team (2015). R: A language and environment for
statistical computing. R F,oundation for Statistical
Computing, Vienna
Spiegelhalter D, Thomas A, Best N, Gilks W (1996) BUGS 0.5
Bayesian inference using Gibbs sampling manual (version
ii). MRC Biostatistics Unit, Institute of Public Health,
Cambridge
Stan Development Team (2014) Stan: A C++ Library for
Probability and Sampling, Version 2.6.0. htゆ://mc-stan.orダ
Tusell F (2011) Kalman filtering in R. Journal of Statistical
So丘ware,39(2).
山村光司(2016)状態空間モデルによる昆虫個体数変動の
解析における諸問題.日本生態学会誌, 66:339・350
伊東宏樹
Appendix
リスト 1dlmによる解析例
## dlmパッケージと Nileデータを使用
library(dlm)
data(Nile)
## Build '1:unctionの定義
BuildLLM <-function(theta) {
dlmModPoly(order = 1,
dV = theta[l], dW = theta[2],
mO = O, CO = le+7)
#最尤推定
fit.llm 〈ー dlmMLE(Nile,build = BuildLLM,
parm = c(lOO, 2), lower= rep(le-4, 2))
#推定値の表示
print(fit.llm$par)
##推定したパラメーターを Buildfunctionで使用
model.llm <ー BuildLLM(fit. llm宇par)
#平滑化
smooth.llm <-dlmSmooth(y = Nile, mod = model.
llm)
##グラフ表示
library(ggplot2)
p <-ggplot(data.frame(Year = start(Nile)
[ l] :end(Nile) [ l],
Flow = c (Nile),
Smooth = smooth.llm宇s[ーl]))
p + geom」point(aes(x=Year, y =Flow)) +
geom_line(aes(x =Year, y =Flow))+
geom_line(aes(x =Year, y =Smooth),
colour =”gray35”, linetype = 1, size =
1.2) +
ylab(expression(paste(”Flow (”, 10A8, mA3,
")”)))+
theme_classic(12,”Helvetica”)
370
リスト 2KFASによる解析例
## KFAS パッケージと Seatbeltsデータをイ吏用
library(KFAS)
data(Seatbelts)
##モデル定義
model.van <ー SSModel(VanKilled-law+
SSMtrend(degree = 1, Q = list(matrix(NA))) +
SSMseasonal(period = 12, sea.type =”dummy",
Q = matrix(NA)),
data = Seatbelts, distribution =”pois son”)
fit.van <-fitSSM(model = model.van, inits =
c(O, 0))
## Qを表示
print(fit.van$model卒Q)
##カルマンスムーザー適用と、信号の取出
out.van <-KFS(fit.van$model, smoothing =
c(”state"))
sig.van <-signal(out.van, states= c("trend”,
"regression”))
season.van <ー signal(out.van, states =
c(”seasonal"))
reg.van <山 signal(out.van, states =
c(”regression”))
##グラフ表示
library(ggplot2)
d <凶 data.frame(Year= seq(start(Seatbelts)[l],
end(Seatbelts)[l] + 11/12, 1 I 12),
VanKilled = c(Seatbelts[,”vanKilled”]),
Smooth = exp(c(sig.van卒signal)),
Seasonal = c(season.van宇signal),
Regression= c(reg.van$signal))
p <-ggplot(d)
p + geom_point(aes(x =Year, y = vanKilled)) +
geom_line(aes(x =Year, y = VanKilled)) +
geom」line(aes(x=Year, y =Smooth),
colour =“gray35”, size = 1.2) +
ylab(”No. of van drivers ”)+
theme_classic(12,”Helvetica”)
状態空間モデルの実行方法と実行環境
柑季節調整成分と回帰成分の状態を表示
p + geom_line(aes(x =Year, y =Seasonal)) +
geom_line(aes(x =Year, y =Regression),
linetype = 2) +
ylab(”State”)+
theme_classic(12,”Helvetica”)
## law変数のないモデル
model. van2 <-SSModel ( VanKilled -
SSMtrend (degree = 1,
Q = list(matrix(NA))) +
SSMseasonal(period = 12, sea.type =”dummy”,
Q = matrix(NA)),
data = Seatbelts, distribution =”pois son“)
fit.van2 <-fitSSM(model = model.van2, inits =
c(O,。))
#尤度比検定(結果は有意ではない)
diff.2logLik <ー 2安(logLik(fit.van宇model) -
logLik(fit.van2卒model))
print ( 1 -pchisq ( diff. 2logLik, df = 1))
リスト 3BUGS言語によるモデリング例
## rjagsを使用
library(rjags)
n.t <ー 50
n.obs <-4
#観測値
#観察をおこなった期数
# 1期あたりの反復測定回数
y <ー t(matrix(c(33, 37, 29, 34, 38, 36, 37, 26,
29' 30'
20, 31, 32, 31, 31, 28, 26, 25, 21, 20,
25, 35, 27, 27, 25, 27, 29, 26, 20, 23,
18, 22, 20, 32, 25, 24, 25, 19, 16, 16,
17, 18, 12, 15, 13, 19, 11, 12, 9, 11,
38, 34, 30, 28, 42, 37, 45, 29, 29, 35,
28, 31, 25, 28, 34, 27, 30, 24, 28, 24,
18, 41, 25, 27, 24, 22, 28, 23, 28, 26,
24, 22, 28, 27, 24, 18, 21, 20, 19, 20,
18, 19, 14, 16, 13, 21,. 13, 13, 14, 10,
371
34, 31, 27, 30, 40, 38, 42, 31, 32, 27,
22, 25, 28, 36, 36, 23, 28, 26, 25, 20,
24, 44, 23, 30, 24, 25, 28, 26, 25, 18,
22, 25, 26, 19, 25, 19, 26, 16, 20, 18,
22, 15, 16, 19, 17, 19, 10, 11, 10, 13,
34, 35, 29, 33, 32, 33, 44, 31, 27, 28,
25, 33, 25, 30, 36, 24, 30, 27, 24, 22,
24, 32, 26, 29, 21, 27, 30, 24, 26, 22,
17, 20, 22, 24, 23, 19, 29, 23, 20, 17,
19, 18, 16, 14, 14, 18, 14, 11, 13, 12)'
nrow = n.obs, byrow =TRUE))
## BUGSによるモデル
model.bugs 〈ー”
var
n.t,
n.obs,
Y[n.t, n.obs],
N[n.t],
lambda[n.t],
exp.lambda[n.七],
p, tau, sigma;
model {
##データモデル
for (t in l:n.t)
for (i in l:n.obs)
Y[t, i]ー dbin(p,N[t]);
}
N[t] -dpois(exp(lambda[t]));
}
##プロセスモデル
for ( t in 2 : n. t) {
l創nbda[t] -dnorm(lambda[t -l], tau);
#事前分布
lambda[l] -dnorm(O, 1.0E-4);
p~ dbeta ( 1 , 1 ) ;
sigma -dunif(O, 100);
tau 〈ー 1I (sigma女 sigma);
## exp(lambda)の計算
for (t in l:n.t) {
exp.lambda[t] <ー exp(lambda[t]);
伊東宏樹
cat(model.bugs, file =”ex3.bug.txt”)
#初期値
inits <-list ( )
inits[[l]] <-list(p = 0.9, sigma= 1, N =
rep(SO, n.t),
.RNG.n釘ne=”base::Mersenne-Twister ”,
.RNG. seed = 1)
inits[[2]] <ー list(p= 0.5, sigma = 3, N =
rep ( 7 0, n. t) ,
.RNG.n笛ne=”base::Mersenne-Twister ”,
.RNG.seed = 2)
inits[[3]] <-list(p = 0.3, sigma= 5, N =
rep ( 9 O, n. t) ,
.RNG.name =”base::Mersenne-Twister”,
.RNG.seed = 3)
## JAGS実行
model <-jags.model (百x3.bug.txt”,
da七a=list(n.t = n.t, n.obs = n.obs, Y = Y),
inits = inits, n.chains = 3, n.adapt = 1000)
update(model, 1000)
samp <-coda.samples(model,
variable.names = c(”exp.lambda”,”sigma~”p”),
n.iter = 20000, thin = 20)
#収束診断
gelman.diag(s四 p,multivariate = FALSE)
#結果表示
summary(s悶 p)
##グラフ表示
library(ggplot2)
s <-summary(s制 p)宇statistics
poslく- match(”exp.lambda[!]”, rownames(s))
explambda.mean <-s[posl:(posl + n.七回 1)'
”Mean”]
dl <』 data.frame(t= rep(l:n.t, n.obs), Y =
c(Y))
d2 <ー data.frame(t= l:n.t, Y.mean = apply(Y,
372
1, mean),
N.mean = explambda.mean)
p <-ggplot(d2)
p +
geom_point(da七a=dl, aes(x = t, y = Y),
colour =”black”, size= 2.5, alpha= 0.5) +
geom_line(aes(x = t, y = Y.mean),
colour =”black~”, size = 1, linetype = 1) +
geom_line(aes(x = t, y = N.mean),
colour =”black", size= 1, linetype = 2) +
xlab(”Time”) + ylab(”Population size") +
theme_classic(12, "Helvetica”)
リスト 4Stanによるモテゃリング例
## RstanとNileデータを使用
library(rstan)
data(Nile)
## Stanによるモデル
dlml.stan <ー”
data {
int<lower=O> N;
matrix[l, NJ y;
transformed data {
matrix[l, l] F;
matrix[l, l] G;
vector[l] mO;
cov_matrix[l] CO;
F[l, l] <ー 1;
G[l, l] くー 1;
mO[l] <ー O;
CO [ 1, l] <-1. Oe+6;
parameters {
real<lower=O> sigma[2];
transformed parameters {
vector[l] V;
cov_matrix[ l] W;
状態空間モデルの実行方法と実行環境
ft-L;;井町一
d <】 data.frame(Year= start(Nile)[l]:end(Nile) V[l] <-sigma[l]安 si伊na[l];
W[l, l] <-sigma[2] * sigma[2];
Flow = c(Nile),
Smooth = smooth.llm卒s[-1])
[ l],
}
model {
pく- ggplot(d)
p + geom_point(aes(x =Year, y =Flow)) +
geom」line(aes(x=Year, y =Flow)) +
geom」line(aes(x= Year, y = Smoo七h)'
y -gaussian_dlm_obs(F, G, V, W, mO, CO);
sigma -uniform(O, l.Oe+6);
colour =”gray35”, linetype = 1, size = 1. 2) +
ylab(expression(paste(’'Flow (”, 10A8f mA3f
”)”)))+
theme_classic(l2, ”Helvetica")
#初期値
inits <-list(list(sigma = c(l, 1)),
list(sigma = c(lO, 10)),
list(sigma = c(lOO, 100)),
list(sigma = c(lOOO, 1000)))
## gaussian一dlm_obs()を使用せずにパラメーター推定
した例
dlm2.stan <-"
data {
N; int<lower=O>
fitl <-stan(model_code = dlml.stan,
data= list(y = matrix(c(Nile), nrow = 1),
N = length(Nile)),
pars = c(”V”,”W”),
chains = 4, iter = 10000, warmup = 2000,
一一## Stan芙f丁
y[N]; real
thin = 8,
init = inits, seed = l) parameters {
theta[N];
real<lower=O> sigma[2];
real
model {
//データモデル
#結果表示
print(fitl)
for ( t in 1 : N ) {
y[t] -normal(theta[t], sigma[l]);
}
//プロセスモデル
の平均を抽出
Vくー mean(extract(fitl)$V[, l])
w <ー mean(extract(fitl)宇W[, 1, l])
(誤差標準偏差)## /'{ラメーター
for (t in 2:N) {
#結果を dlmにて使用
library(dlm)
BuildLLM <-function(theta) { theta[t] -normal(theta[t -l], sigma[2]);
//事前分布
dlmModPoly(order = 1, dV = theta[l], dW =
theta[2])
## Stanで推定された誤差を使用して平滑化 theta[ l] -normal ( 0, 1. Oe+6);
sigma -uniform( O, 1. Oe+6); mod.llm <-BuildLLM(c(V, W))
smooth.llm <ー dlmSmooth(Nile,mod.llm)
generated quantities {
real V;
real W;
373
##グラフ表示
library(ggplot2)
伊東宏樹
.,.,
]
]
噌EAm
内Ja
-
-
a
a
m
m
qdqd
・ェ・1
C
M
C
M
*
占
有]
]
咽よ
q4
[
[
a
a
m
m
g
g
El
--
E
S
--
〈
〈vw
# 初期値
inits2 <-list(list(theta = rep(2000,
length(Nile)),
sigma= c(l, 1)),
list(theta = rep(lOOO, length(Nile)),
sigma= c(lO, 10)),
list(theta = rep(SOO, length(Nile)),
sigma= c(lOO, 100)),
list(theta = rep(lOO, length(Nile)),
sigma= c(lOOO, 1000)))
## Stan実行
fit2 <-stan(model_code = dlm2.stan,
data= list(N = length(Nile),
y = c(Nile)),
pars = c(”V”,”W”),
chains = 4, iter = 10000, warmup =
2000, thin = 8,
init = inits2, seed = 2)
#結果表示
print(fit2)
374