状態空間モデルの実行方法と実行環境の比較 ·...

15
状態空間モデルの実行方法と実行環境の比較 誌名 誌名 日本生態學會誌 ISSN ISSN 00215007 著者 著者 伊東, 宏樹 巻/号 巻/号 66巻2号 掲載ページ 掲載ページ p. 361-374 発行年月 発行年月 2016年7月 農林水産省 農林水産技術会議事務局筑波産学連携支援センター Tsukuba Business-Academia Cooperation Support Center, Agriculture, Forestry and Fisheries Research Council Secretariat

Upload: others

Post on 29-Sep-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

状態空間モデルの実行方法と実行環境の比較

誌名誌名 日本生態學會誌

ISSNISSN 00215007

著者著者 伊東, 宏樹

巻/号巻/号 66巻2号

掲載ページ掲載ページ p. 361-374

発行年月発行年月 2016年7月

農林水産省 農林水産技術会議事務局筑波産学連携支援センターTsukuba Business-Academia Cooperation Support Center, Agriculture, Forestry and Fisheries Research CouncilSecretariat

Page 2: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

日本生態学会誌 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

Page 3: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

伊東宏樹

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とも

Page 4: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

状態空間モデルの実行方法と実行環境

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にしめす。

Page 5: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

伊東宏樹

平滑化された曲線を見ると、 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”)を指定することで、状態のうち

Page 6: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

状態空間モデルの実行方法と実行環境

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日確

Page 7: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

伊東宏樹

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)の計算

Page 8: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

際医藍也民応広ι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

Page 9: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

伊東宏樹

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)状態

空間モデルを用いた階層ベイズ推定法によるキヨン

Page 10: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

状態空間モデルの実行方法と実行環境

(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

Page 11: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

伊東宏樹

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

Page 12: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

状態空間モデルの実行方法と実行環境

柑季節調整成分と回帰成分の状態を表示

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]);

Page 13: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

伊東宏樹

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;

Page 14: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

状態空間モデルの実行方法と実行環境

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)

Page 15: 状態空間モデルの実行方法と実行環境の比較 · 分布を使用して、誤差分布が正規分布の状態空間モデルのパラメーター推定がおこなえる。

伊東宏樹

.,.,

噌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