{"action":"created","comment":{"url":"https://api.github.com/repos/stan-ja/stan-ja/pulls/comments/62152294","id":62152294,"diff_hunk":"@@ -0,0 +1,632 @@\n+## 7. 時系列モデル\n+\n+時系列データは、時間軸に沿って得られたデータです。この章では2種類の時系列モデルを紹介します。1つは、自己回帰および移動平均モデルといった回帰に似たモデル、もう1つは隠れマルコフモデルです。\n+\n+15章ではガウス過程を紹介しますが、これも時系列（と空間）データに使えるでしょう。\n+\n+### 7.1. 自己回帰モデル\n+\n+正規ノイズの1次自己回帰モデル(AR(1))では、各点$y_{n}$は次式のように生成される列$y$にまとめられます。\n+\n+![$$y_{n} \\sim \\mathsf{Normal}(\\alpha + \\beta y_{n-1}, \\sigma)$$](fig/fig01.png)\n+\n+すなわち、$y_{n}$の期待値は$\\alpha + \\beta y_{n-1}$で、ノイズのスケールは$\\sigma$です。\n+\n+#### AR(1)モデル\n+\n+傾き（$\\beta$）、切片（$\\alpha$）、ノイズのスケール（$\\sigma$）のパラメータ（**訳注:原文は'regression coefficients'だが、この方がよい?**）に非正則平坦一様分布を設定するなら、AR(1)モデルのStanプログラムは以下のようになります。\n+\n+```\n+data {\n+  int<lower=0> N;\n+  vector[N] y;\n+}\n+parameters {\n+  real alpha;\n+  real beta;\n+  real<lower=0> sigma;\n+}\n+model {\n+  for (n in 2:N)\n+    y[n] ~ normal(alpha + beta * y[n-1], sigma);\n+}\n+```\n+\n+最初の観測データ点`y[1]`はここではモデル化されていません。これは条件となるものが何もないからです。そのかわり、`y[1]`は`y[2]`の条件となっています。このモデルではまた`sigma`に非正則事前分布を使っていますが、もし`y`の時間的変化のスケールに情報があるのなら、問題なく情報事前分布を加えることができます。あるいは、`y`のスケールに大ざっぱな知識があるのであれば弱情報事前分布で推定を良くすることもできます。\n+\n+##### スライシングで効率よく\n+\n+おそらく少し読みにくくはなりますが、上のモデルをとても効率良く記述する方法がベクトルのスライシングです。上のモデルは1行で書けます。\n+\n+```\n+model {\n+  tail(y, N - 1) ~ normal(alpha + beta * head(y, N - 1), sigma);\n+}\n+```\n+\n+`tail`演算は、`y`の末尾から`N - 1`個の要素を取り出すもので、`head`演算は最初の`N - 1`個を取り出すものです。`head`の要素に`beta`を掛けるのにはベクトル計算を使っています。\n+\n+#### AR(1)モデルの拡張\n+\n+回帰係数とノイズのスケールには、さまざまな別の分布族の正則事前分布を設定することもできるでしょう。正規分布ノイズのモデルは、スチューデントのt分布はじめ、上下限のないことを保証するような分布に変えることができます。複数の観測系列があるようなら、このモデルは階層的にもできるでしょう。\n+\n+強制的に定常AR(1)プロセスとして推定するなら、傾きの係数`beta`には以下のように上下限に制約をつけてもよいかもしれません。\n+\n+```\n+real<lower=-1,upper=1> beta;\n+```\n+\n+実際には、こうした制約はおすすめしません。データが定常でないなら、モデルのあてはめのときにそれがわかるというのが最善です。`beta`の値が零近辺に集まるような事前分布を設定することで、定常パラメーターの推定値としやすくできます。\n+\n+#### AR(2)モデル\n+\n+このモデルの次数を拡張するのも簡単です。例えば、2次の係数`gamma`を入れて、以下のモデル文のようにAR(2)モデルをコーディングできるでしょう。\n+\n+```\n+for (n in 3:N)\n+  y[n] ~ normal(alpha + beta*y[n-1] + gamma*y[n-2], sigma);\n+```\n+\n+#### AR($K$)モデル\n+\n+次数自体もデータとして与えるような一般モデルは、係数を配列に入れ、線形予測子をループ内で計算させるようにしてコーディングできます。\n+\n+```\n+data {\n+  int<lower=0> K;\n+  int<lower=0> N;\n+real y[N];\n+}\n+parameters {\n+  real alpha;\n+  real beta[K];\n+  real sigma;\n+}\n+model {\n+  for (n in (K+1):N) {\n+    real mu;\n+    mu <- alpha;\n+    for (k in 1:K)\n+      mu <- mu + beta[k] * y[n-k];\n+   y[n] ~ normal(mu, sigma);\n+  }\n+}\n+```\n+\n+#### ARCH(1)モデル\n+\n+計量経済学と財政学の時系列モデルでは不等分散を仮定するのが普通です（すなわち、系列を定義するノイズ項のスケールが時間的に変化してもよいとします）。そのようなモデルで最も単純なのがARCH（AugoRegressive Conditional Heteroscedasticity, 自己回帰条件付き不等分散）モデルです(Engle, 1982)。自己回帰モデルAR(1)では、系列の平均が時間的に変化しますが、ノイズ項は固定されたままです。ARCH(1)モデルでは、これとは異なり、ノイズ項のスケールが時間的に変化する一方で平均項は固定されたままです。もちろん、平均もスケールも時間的に変化するとモデルを定義することもできるでしょう。計量経済学の文献には多種多様な時系列モデリングの選択肢があります。\n+\n+ARCH(1)モデルは典型的には以下の一連の式で示されます。ここで、$r_{t}$は時点$t$における収益の観測値、$\\mu$、$\\alpha_{0}$、$\\alpha_{1}$は未知の回帰係数パラメーターです。\n+\n+![$$\\begin{array}{rl}r_{t} &= \\mu + a_{t} \\\\ a_{t} &= \\sigma_{t} \\epsilon_{t} \\\\ \\epsilon_{t} &\\sim \\mathsf{Normal}(0, 1) \\\\ \\sigma_{t}^{2} &= \\alpha_{0} + \\alpha_{1}a_{t-1}^{2}\\end{array}$$](fig/fig02.png)\n+\n+ノイズ項$\\sigma_{t}^2$が正であることを保証するため、$\\alpha_{0}, \\alpha_{1} > 0$と、スケール係数は正に制約されています。時系列の定常性を保証するため、$\\alpha_{1} < 1$と、傾きは1未満に制約されています。<sup>1</sup>ARCH(1)モデルはStanでは以下のようにそのままコーディングできます。\n+\n+```\n+data {\n+  int<lower=0> T;   // 時点の数\n+  real r[T];        // 時点tにおける収益\n+}\n+parameters {\n+  real mu;                       // 平均収益\n+  real<lower=0> alpha0;          // 誤差の切片\n+  real<lower=0,upper=1> alpha1;  // 誤差の傾き\n+}\n+model {\n+  for (t in 2:T)\n+    r[t] ~ normal(mu, sqrt(alpha0 + alpha1 * pow(r[t-1] - mu,2)));\n+}\n+```\n+\n+このモデルのループは、時点$t = 1$における収益をモデル化しないように定義されています。次節のモデルで、$t = 1$における収益をモデル化する方法をお見せします。このモデルは、ベクトル化してより効率的にすることができません。次節のモデルでベクトル化の例を紹介します。\n+\n+<sup>1</sup>実際には、この制約を外してみて、非定常な係数の組み合わせの方がデータによく当てはまるかどうかを試すのが有用なこともあります。あるいはまた、当てはめから外れているトレンドがあるなら明らかに非定常でしょうから、モデルにトレンド項を加えることもあります。\n+\n+### 7.2. 時間的不等分散性のモデリング\n+\n+一揃いの変数について、分散がすべて同じなら、等分散ということなります。一方、分散がすべて同じというわけでないなら、不等分散ということになります。不等分散の時系列モデルでは、ノイズ項が時間的に変化してもよいとします。\n+\n+#### GARCH(1,1)モデル\n+\n+基本的なGARCH（Generalized AutoRegressive Conditional Heteroscedasticity, 一般化自己回帰条件付き不等分散）モデルであるGARCH(1,1)はARCH(1)モデルを拡張したもので、一期前の時点$t-1$での収益の平均との差の2乗を、時点$t$のボラティリティの予測変数に含みます。\n+\n+![$$\\sigma_{t}^{2} = \\alpha_{0} + \\alpha_{1}a_{t-1}^{2} + \\beta_{1}\\sigma_{t-1}^{2}$$](fig/fig03.png)\n+\n+スケール項が正であることと時系列が定常であることを保証するため、係数については、$\\alpha_{0}, \\alpha_{1}, \\beta_{1} > 0$、かつ傾きについて$\\alpha_{1} + \\beta_{1} < 1$をすべて満たさなくてなりません。\n+\n+```\n+data {\n+  int<lower=0> T;\n+  real r[T];\n+  real<lower=0> sigma1;\n+}\n+parameters {\n+  real mu;\n+  real<lower=0> alpha0;\n+  real<lower=0,upper=1> alpha1;\n+  real<lower=0,upper=(1-alpha1)> beta1;\n+}\n+transformed parameters {\n+  real<lower=0> sigma[T];\n+  sigma[1] <- sigma1;\n+  for (t in 2:T)\n+    sigma[t] <- sqrt(alpha0\n+                     + alpha1 * pow(r[t-1] - mu, 2)\n+                     + beta1 * pow(sigma[t-1], 2));\n+}\n+model {\n+  r ~ normal(mu,sigma);\n+}\n+```\n+\n+ボラティリティ回帰の再帰的定義の最初を決めるために、$t = 1$におけるノイズのスケールとして、非負の値を持つ`sigma1`をデータ宣言に含めます。\n+\n+制約はそのままパラメータ宣言でコーディングされています。この宣言は、`alpha1`の値が`beta1`に依存するという制約があるので、この順序どおりにする必要があります。\n+\n+非負値の配列である変換パラメータ(transformed parameter)`sigma`は各時点のスケールの値を格納するのに使われます。これらの値の定義は`transformed parameters`ブロックにあり、回帰もここで定義されるようにしました。切片`alpha0`、1期前の収益と平均との差の2乗に対する傾き`alpha1`、1期前のノイズスケールの2乗に対する傾き`beta1`がここにあります。最後に、Stanでは正規分布には（分散パラメータではなく）スケール（偏差）パラメータが必要なので、回帰全体を`sqrt`関数の中に入れています。\n+\n+`transformed parameters`ブロックに回帰を置くことにより、モデルは、ベクトル化されたサンプリング文1行にまで減りました。`r`と`sigma`の長さは`T`ですので、すべてのデータが直接モデル化されています。\n+\n+### 7.3. 移動平均モデル\n+\n+移動平均モデルは、過去の誤差を将来の結果の予測変数として使います。次数$Q$の移動平均モデルMA($Q$)には、全体的な平均パラメータ$\\mu$と、過去の誤差項についての回帰係数$\\theta_{q}$があります。時点$t$における誤差を$\\epsilon_{t}$として、結果$y_{t}$についてのモデルは次のように定義されます。\n+\n+![$$y_{t} = \\mu + \\theta_{1}\\epsilon_{t-1} + \\dots + \\theta_{Q}\\epsilon_{t-Q} + \\epsilon_{t}$$](fig/fig04.png)\n+\n+結果$y_{t}$についての誤差項$\\epsilon_{t}$は正規分布としてモデル化されています。\n+\n+![$$\\epsilon_{t} \\sim \\mathsf{Normal}(0, \\sigma)$$](fig/fig05.png)\n+\n+正則なベイズモデルでは、$\\mu$, $\\theta$, $\\sigma$にはすべて事前分布を与える必要があります。\n+\n+#### MA(2)の例\n+\n+MA(2)モデルはStanでは以下のようにコーディングできます。\n+\n+```\n+data {\n+  int<lower=3> T;  // 観測値の数\n+  vector[T] y;     // 時点Tにおける観測値\n+}\n+parameters {\n+  real mu;              // 平均\n+  real<lower=0> sigma;  // 誤差のスケール\n+  vector[2] theta;      // ラグの係数\n+}\n+transformed parameters {\n+  vector[T] epsilon;    // 誤差項\n+  epsilon[1] <- y[1] - mu;\n+  epsilon[2] <- y[2] - mu - theta[1] * epsilon[1];\n+  for (t in 3:T)\n+   epsilon[t] <- ( y[t] - mu\n+                   - theta[1] * epsilon[t - 1]\n+                   - theta[2] * epsilon[t - 2] );\n+}\n+model {\n+  mu ~ cauchy(0,2.5);\n+  theta ~ cauchy(0,2.5);\n+  sigma ~ cauchy(0,2.5);\n+  for (t in 3:T)\n+    y[t] ~ normal(mu\n+                  + theta[1] * epsilon[t - 1]\n+                  + theta[2] * epsilon[t - 2],\n+                  sigma);\n+}\n+```\n+\n+誤差項$\\epsilon_{t}$は、観測値とパラメータを使って変換パラメータ(transformed parameter)として定義されています。（尤度を定義する）サンプリング文の定義もこれと同じ定義を使っていますが、$n > Q$の$y_{n}$にのみ適用可能です。この例では、パラメータにはコーシー事前分布（$\\sigma$には半コーシー分布）を与えています。もっとも、ほかの事前分布も同じくらい簡単に使えます。\n+\n+modelブロック中のサンプリング文をベクトル化すると、このモデルはもっと速くできるでしょう。ループの代わりにドット乗算を使って$\\epsilon_{t}$の計算をベクトル化しても高速化できるでしょう。\n+\n+#### ベクトル化したMA($Q$)モデル\n+\n+確率サンプリングをベクトル化した一般的なMA($Q$)モデルは以下のように定義できるでしょう。\n+\n+```\n+data {\n+  int<lower=0> Q;  // 過去のノイズ項の数\n+  int<lower=3> T;  // 観測値の数\n+  vector[T] y;     // 時点tにおける観測値\n+}\n+parameters {\n+  real mu;              // 平均\n+  real<lower=0> sigma;  // 誤差のスケール\n+  vector[Q] theta;      // 誤差の係数, ラグ -t\n+}\n+transformed parameters {\n+  vector[T] epsilon;    // 時点tにおける誤差\n+  for (t in 1:T) {\n+    epsilon[t] <- y[t] - mu;\n+    for (q in 1:min(t - 1, Q))\n+      epsilon[t] <- epsilon[t] - theta[q] * epsilon[t - q];\n+  }\n+}\n+model {\n+  vector[T] eta;\n+  mu ~ cauchy(0, 2.5);\n+  theta ~ cauchy(0, 2.5);\n+  sigma ~ cauchy(0, 2.5);\n+  for (t in 1:T) {\n+    eta[t] <- mu;\n+    for (q in 1:min(t - 1, Q))\n+      eta[t] <- eta[t] + theta[q] * epsilon[t - q];\n+  }\n+  y ~ normal(eta, sigma);\n+}\n+```\n+\n+ここではすべてのデータがモデル化されています。不足する項は単に、誤差項の計算の際に回帰から除かれます。両方のモデルともとても速く収束し、収束した連鎖はよく混ざっています。ベクトル化したモデルの方がちょっとだけ速いのですが、これは繰り返しあたりについてのことで、収束についてではありません。というのも両者は同じモデルだからです。\n+\n+### 7.4. 自己回帰移動平均モデル\n+\n+ARMA（AutoRegressive Moving-Average, 自己回帰移動平均）モデルは、自己回帰モデルと移動平均モデルの予測変数を結合させたものです。履歴が1状態のARMA(1,1)モデルは、Stanでは以下のようにコーディングできます。\n+\n+```\n+data {\n+  int<lower=1> T;           // 観測値の数\n+  real y[T];                // 観測結果\n+}\n+parameters {\n+  real mu;                  // 平均の係数\n+  real phi;                 // 自己回帰の係数\n+  real theta;               // 移動平均の係数\n+  real<lower=0> sigma;      // 誤差のスケール\n+}\n+model {\n+  vector[T] nu;             // 時点tでの予測値\n+  vector[T] err;            // 時点tでの誤差\n+  nu[1] <- mu + phi * mu;   // err[0] == 0と仮定\n+  err[1] <- y[1] - nu[1];\n+  for (t in 2:T) {\n+    nu[t] <- mu + phi * y[t-1] + theta * err[t-1];\n+    err[t] <- y[t] - nu[t];\n+  }\n+  mu ~ normal(0,10);        // 事前分布\n+  phi ~ normal(0,2);\n+  theta ~ normal(0,2);\n+  sigma ~ cauchy(0,5);\n+  err ~ normal(0,sigma);    // 尤度\n+}\n+```\n+\n+データは他の時系列回帰と同様に宣言されており、パラメータはコード中に説明があります。\n+\n+modelブロックでは、局所ベクトル`nu`が予測値を、`err`が誤差を格納しています。これらの計算は、前節で記述した移動平均モデルの誤差と同様です。\n+\n+定常過程にするため、弱情報事前分布を設定しています。尤度は誤差項だけを含み、この例では効率的にベクトル化されています。\n+\n+このようなモデルでは、計算した誤差項を調べるのが必要なことがよくあります。Stanでは、変換パラメータ(transformed parameter)として`err`を宣言することで簡単に対応できるでしょう。その場合も、上のモデルでの定義と同様です。`nu`は局所変数のままでもよいのですが、ここでは`transformed parameters`ブロックに移しましょう。\n+\n+Wayne Foltaは、局所ベクトルを使わないモデルのコーディングを提案してくれました。以下がそれです。\n+\n+```\n+model {\n+  real err;\n+  mu ~ normal(0,10);\n+  phi ~ normal(0,2);\n+  theta ~ normal(0,2);\n+  sigma ~ cauchy(0,5);\n+  err <- y[1] - mu + phi * mu;\n+  err ~ normal(0,sigma);\n+  for (t in 2:T) {\n+    err <- y[t] - (mu + phi * y[t-1] + theta * err);\n+    err ~ normal(0,sigma);\n+  }\n+}\n+```\n+\n+このARMAモデルのアプローチは、Stanではどのように局所変数（この場合は`err`）を再利用できるか示す良い例となっています。Foltaのアプローチは、2つ以上の誤差項を局所変数に格納し、ループ内で再割り当てすることで、高次の移動平均モデルにも拡張できるでしょう。\n+\n+両方のコーディングとも大変高速です。元のコーディングは正規分布をベクトル化できるという利点がありますが、使用メモリがやや多くなります。中間点は、`err`だけをベクトル化することでしょう。\n+\n+#### 識別可能性と定常性\n+\n+MA部分の多項の特徴量（**訳注:'characteristic polynomial'の訳ですが自信なし**）の平方根が単位円の中にあるなら、MAおよびARMAモデルは識別可能ではありません。その場合、以下の制約をつける必要があります。<sup>2</sup>\n+\n+```\n+real<lower = -1, upper = 1> theta;\n+```\n+\n+このモデルから生成される合成データを用いて、上の制約をつけずにモデルを走らせると、[-1,1]の範囲外に(`theta`, `phi`)の最頻値ができることがあります。これは事後分布の多峰性問題となり、またNUTSのtree depthが非常に大きく（10を超えることもままあります）なります。制約をつけることにより、事後分布がより正確になり、tree depthが劇的に減少します。そのため、シミュレーションがかなり速くなります（典型的には1桁を大きく超えます）。\n+\n+さらに、プロセスが本当に非定常なら別ですが、そうは考えられないのなら、定常性を保証するため以下の制約をつける価値があります。\n+\n+```\n+read<lower = -1, upper = 1> phi;\n+```\n+\n+<sup>2</sup>この小節は、Jonathan GilliganのGitHubのコメントを少し編集したものです。https://github.com/stan-dev/stan/issues/1617#issuecomment-160249142 を参照してください。\n+\n+### 7.5. 確率的ボラティリティモデル\n+\n+確率的ボラティリティモデルは、離散時間の潜在確率論モデルに従って、証券購入のオプションのような資産収益のボラティリティ（すなわち分散）を扱います(Kim et al., 1998)。データは、$T$個の等間隔時点における原資産に対する平均修正（すなわち中央化）収益$y_{t}$からなります。Kim et al.は、以下の回帰に似た式を使って典型的な確率ボラティリティモデルを定式化しています。ここで、潜在パラメータ$h_{t}$は対数ボラティリティを、パラメータ$\\mu$は平均対数ボラティリティを、$\\phi$はボラティリティ項の継続性をしめします。変数$\\epsilon_{t}$は時点$t$における資産収益に対するホワイトノイズショック（すなわち乗法的誤差）で、$\\delta_{t}$は時点$t$におけるボラティリティに対するショックを表します。（**訳注:このあたりよく知らないので自信ありません**）\n+\n+![$$\\begin{array}{rl}y_{t} &= \\epsilon_{t}\\exp(h_{t}/2) \\\\ h_{t+1} &= \\mu + \\phi(h_{t}-\\mu)+\\delta_{t}\\sigma \\\\ h_{1} &\\sim \\mathsf{Normal}\\left(\\mu, \\frac{\\sigma}{\\sqrt{1-\\phi^{2}}}\\right) \\\\ \\epsilon_{t} &\\sim \\mathsf{Normal}(0, 1), \\delta_{t} \\sim \\mathsf{Normal}(0, 1)\\end{array}$$](fig/fig06.png)\n+\n+最初の行を変形すると、$\\epsilon_{t} = y_{t}\\exp(-h_{t}/2)$となり、$y_{t}$のサンプリング分布は以下のように書けます。\n+\n+![$$y_{t} \\sim \\mathsf{Normal}(0, \\exp(h_{t}/2))$$](fig/fig07.png)\n+\n+$h_{t+1}$についての再帰式には、$\\delta_{t}$のスケーリングとサンプリングを組み合わせることができて、次のサンプリング分布が得られます。\n+\n+![$$h_{t} \\sim \\mathsf{Normal}(\\mu + \\phi(h_{t} - \\mu), \\sigma)$$](fig/fig08.png)\n+\n+（**訳注:左辺は'$h$_{$t$+1}'が正しい?**）\n+\n+この定式化はそのままコーディングできて、以下のStanモデルになります。\n+\n+```\n+data {\n+  int<lower=0> T;  // # 時点 (等間隔)\n+  vector[T] y;     // 時点tにおける平均修正収益\n+}\n+parameters {\n+  real mu;                     // 平均対数ボラティリティ\n+  real<lower=-1,upper=1> phi;  // ボラティリティの継続性\n+  real<lower=0> sigma;         // ホワイトノイズショックのスケール\n+  vector[T] h;                 // 時点tにおける対数ボラティリティ\n+}\n+model {\n+  phi ~ uniform(-1,1);\n+  sigma ~ cauchy(0,5);\n+  mu ~ cauchy(0,10);\n+  h[1] ~ normal(mu, sigma / sqrt(1 - phi * phi));\n+  for (t in 2:T)\n+    h[t] ~ normal(mu + phi * (h[t - 1] -  mu), sigma);\n+  for (t in 1:T)\n+    y[t] ~ normal(0, exp(h[t] / 2));\n+}\n+```\n+\n+Kim et al.の定式化と比較すると、Stanのモデルではパラメータ$\\phi$, $\\sigma$, $\\mu$に事前分布を与えています。ショック項$\\epsilon_{t}$と$\\delta_{t}$はモデル中には明示的には現れないことに注意してください。とはいえ、generated quantitiesブロックで効率的に計算することは可能でしょう。\n+\n+このような確率的ボラティリティモデルの事後分布で事後分散が大きくなるのは普通のことです。例えば、 $\\mu = -1.02$, $\\phi = 0.95$, $\\sigma = 0.25$として上のモデルで500データ点のシミュレーションを行なうと、95%事後区間は$\\mu$が(-1.23,-0.54)、$\\phi$が(0.82,0.98)、$\\sigma$が(0.16,0.38)となります。\n+\n+このモデルで生成される、秒あたりの有効サンプルを1桁以上高速化するのは比較的単純です。まず、収益$y$についてのサンプリング文は簡単にベクトル化できます。\n+\n+```\n+y ~ normal(0, exp(h / 2));\n+```\n+\n+これにより繰り返しは高速化されますが、有効サンブルサイズは変化しません。根本的なパラメータ化と対数確率関数は変わっていないからです。標準化ボラティリティの再パラメータ化と、それからリスケーリングにより、連鎖の混ざり具合は改善されます。これには、`h`の代わりに、標準化パラメータ`h_std`を宣言する必要があります。\n+\n+```\n+parameters {\n+  ...\n+  vector[T] h_std; // 時点tにおける標準化対数ボラティリティ\n+```\n+\n+この時、元の`h`の値は`transformed parameters`ブロックで定義します。\n+\n+```\n+transformed parameters {\n+  vector[T] h;            // 時点tにおける対数ボラティリティ\n+  h <- h_std * sigma;     // h ~ normal(0,sigma)とした\n+  h[1] <- h[1] / sqrt(1 - phi * phi);  // h[1]をリスケール\n+  h <- h + mu;\n+  for (t in 2:T)\n+    h[t] <- h[t] + phi * (h[t-1] - mu);\n+}\n+```\n+\n+最初の代入では、`h_std`を$\\mathsf{Normal}(0,\\sigma)$という分布になるようにリスケールして、これを一時的に`h`に代入しています。2番目の代入では、`h[1]`の事前分布が`h[2]`から`h[T]`までの事前分布とは異なるように`h[1]`をリスケールしています。その次の代入では`mu`にオフセットをつけており、これにより`h[2]`から`h[T]`までが$\\mathsf{Normal}(\\mu,\\sigma)$という分布になります。この移動は`h[1]`のリスケーリングの後に行なう必要があることに注意してください。最後のループは、`h[2]`から`h[T]`までが`phi`と`mu`と比較して適切にモデル化されるように移動平均に加算します。（**訳注:このあたりもあまり自信ありません**）\n+\n+最後の改良として、`h[1]`のサンプリング文と、`h[2]`から`h[T]`のサンプリングのループを、1行のベクトル化した標準正規分布のサンプリング文に置き換えます。\n+\n+```\n+model { ...\n+  h_std ~ normal(0,1);\n+```\n+\n+元のモデルでは、数百から時には数千回の繰り返しが収束に必要となることがありますが、再パラメータ化したモデルでは数十回の繰り返しで信頼できる収束に至ります。連鎖の混ざり具合も劇的に改善され、繰り返しあたりの有効サンプルサイズも多くなります。最後に、各繰り返しの時間は元のモデルのおおよそ4分の1になります。\n+\n+### 7.6. 隠れマルコフモデル\n+\n+隠れマルコフモデル（HMM: Hidden Markov Model）は、$T$個の出力変数$y_{t}$からなる列を、これに並行する、潜在カテゴリカル状態変数$z_{t} \\in \\{1,\\dots,K\\}$の列を条件として生成します。与えられた$z_{t-1}$について、$z_{t}$が他の変数と条件付き独立であるように、この「隠れ」状態変数はマルコフ連鎖を形成すると仮定します。このマルコフ連鎖は推移行列$\\theta$によりパラメータ化されます。ここで、$\\theta_{k}$はK次元単体（$k \\in \\{1,\\dots,K\\}$です。状態$z_{t-1}$から状態$z_{t}$への推移確率は次式のようになります。\n+\n+![$$z_{t} \\sim \\mathsf{Categorical}(\\theta_{z[t-1]})$$](fig/fig09.png)\n+\n+時点$t$における出力$y_{t}$は潜在状態$z_{t}$に基づいて条件付き独立に生成されます。\n+\n+この節では、出力$y_{t} \\in \\{1,\\dots,V\\}$に単純なカテゴリカルモデルを適用してHMMを記述します。潜在状態$k$についてのカテゴリカル分布はV次元単体$\\phi_{k}$によりパラメータ化されます。時点$t$における出力の観測値$y_{t}$は、時点$t$における隠れ状態のインジケータ$z_{t}$に基づいて生成されます。\n+\n+![$$y_{t} \\sim \\mathsf{Categorical}(\\phi_{z[t]})$$](fig/fig10.png)\n+\n+つまり、混合成分のインジケータが潜在マルコフ連鎖を形成するような離散混合分布モデルをHMMは形成しています。\n+\n+#### 教師付きパラメーター推定\n+\n+隠れ状態が既知の状況では、パラメータ$\\theta$および$\\phi$の当てはめのため、以下のナイーブモデルを使うことができます。<sup>3</sup>\n+\n+```\n+data {\n+  int<lower=1> K;  // num categories\n+  int<lower=1> V;  // num words\n+  int<lower=0> T;  // num instances\n+  int<lower=1,upper=V> w[T]; // words\n+  int<lower=1,upper=K> z[T]; // categories\n+  vector<lower=0>[K] alpha;  // transit prior\n+  vector<lower=0>[V] beta;   // emit prior\n+}\n+parameters {\n+  simplex[K] theta[K];  // transit probs\n+  simplex[V] phi[K];    // emit probs\n+}\n+model {\n+  for (k in 1:K)\n+    theta[k] ~ dirichlet(alpha);\n+  for (k in 1:K)\n+    phi[k] ~ dirichlet(beta);\n+  for (t in 1:T)\n+    w[t] ~ categorical(phi[z[t]]);\n+  for (t in 2:T)\n+    z[t] ~ categorical(theta[z[t - 1]]);\n+    }\n+```\n+\n+$\\theta_{k}$と$\\phi_{k}$には明示的なディリクレ事前分布を与えています。この2文を除くと、有効な単体全体についての一様事前分布が暗黙のうちに使われることでしょう。\n+\n+<sup>3</sup>このプログラムは、Stan例題モデルのリポジトリで入手できます。https://github.com/stan-dev/example-models/tree/master/misc/gaussian-process を参照してください。\n+\n+#### 開始状態と終了状態の確率\n+\n+動くことは動きますが、上のようにHMMを記述しても完全ではありません。開始状態$z_{1}$がモデル化されていないからです（添字は2から$T$までです）。データを長い過程の部分列と考えるなら、$z_{1}$の確率は、マルコフ連鎖の定常状態確率に合わせるべきでしょう。この場合、データには明確な終了がなく、列が$z_{T}$で終了する確率をモデル化する必要はありません。\n+\n+もうひとつ別の概念として、HMMは有限長の列のモデルとして考えることもできます。例えば、自然言語の文には明確な開始の分布（通常は大文字）と、終了の分布（通常は何らかの句読点）とがあります。文の境界をモデル化する最も単純な方法は、新しい潜在状態$K+1$を加え、パラメータのベクトル$\\theta_{K+1}$によりカテゴリカル分布から最初の状態を生成し、状態$K+1$への推移が文の終了時にのみ起こり、それ以外では起こらないように推移を制限することです。\n+\n+#### 十分統計量の計算\n+\n+上に紹介したナイーブなHMM推定モデルは、カテゴリカル分布についてのループを単一の多項分布に置き換えることで劇的に速くすることができます。<sup>4</sup>データは前もって宣言しますが、ここでは`transformed data`ブロックで、推移行列と出力行列を推定する十分統計量を計算することにします。\n+\n+```\n+transformed data {\n+  int<lower=0> trans[K,K];\n+  int<lower=0> emit[K,V];\n+  for (k1 in 1:K)\n+    for (k2 in 1:K)\n+      trans[k1,k2] <- 0;\n+  for (t in 2:T)\n+    trans[z[t - 1], z[t]] <- 1 + trans[z[t - 1], z[t]];\n+  for (k in 1:K)\n+    for (v in 1:V)\n+      emit[k,v] <- 0;\n+  for (t in 1:T)\n+    emit[z[t], w[t]] <- 1 + emit[z[t], w[t]];\n+}\n+```\n+\n+入力についてのループに基づくモデルの尤度成分は以下のように多項分布に置き換わります。\n+\n+```\n+model {\n+  ...\n+  for (k in 1:K)\n+    trans[k] ~ multinomial(theta[k]);\n+  for (k in 1:K)\n+    emit[k] ~ multinomial(phi[k]);\n+}\n+```\n+\n+正規出力確率で連続値のHMMも、同様に十分統計量を計算することで高速化できるでしょう。\n+\n+<sup>4</sup>このモデルはStan例題モデルリポジトリにあります。http://mc-stan.org/documentation を参照してください。\n+\n+#### 解析的事後分布\n+\n+ディリクレ-多項HMMでは、ディリクレ分布が多項分布の共益事前分布なので、事後分布は解析的に計算できます。以下の例<sup>5</sup>では、Stanのモデルがどのように事後分布を解析的に定義できるかを示します。Stan言語ではこれが可能です。というのは、そのデータのもとで、ある割合にまでパラメータの条件付き確率をモデルが定義しさえすればよいからです。これには、（正規化されていない）同時確率か、（正規化されていない）条件付き確率か、あるいはその間の何かを定義することで可能です。（**訳注:ここはよくわかりませんでした。**）\n+\n+このモデルは、前のモデルと同じデータとパラメータを用いますが、`transformed data`ブロックで事後ディリクレパラメータを計算するようにしています。\n+\n+```\n+transformed data {\n+  vector<lower=0>[K] alpha_post[K];\n+  vector<lower=0>[V] beta_post[K];\n+  for (k in 1:K)\n+    alpha_post[k] <- alpha;\n+  for (t in 2:T)\n+    alpha_post[z[t-1],z[t]] <- alpha_post[z[t-1],z[t]] + 1;\n+  for (k in 1:K)\n+    beta_post[k] <- beta;\n+  for (t in 1:T)\n+    beta_post[z[t],w[t]] <- beta_post[z[t],w[t]] + 1;\n+}\n+```\n+\n+事後分布は以下のように解析的に書くことができます。\n+\n+```\n+model {\n+  for (k in 1:K)\n+    theta[k] ~ dirichlet(alpha_post[k]);\n+  for (k in 1:K)\n+    phi[k] ~ dirichlet(beta_post[k]);\n+}\n+```\n+\n+<sup>5</sup>このプログラムはStan例題モデルリポジトリにあります。http://mc-stan.org/documentation を参照してください。\n+\n+#### 半教師付き推定\n+\n+潜在状態が既知であるデータがまったくない完全に教師なしの方法でもHMMは推定ができます。その結果の事後分布は極端に多峰になるのが典型的です。中間の解法は、半教師付き推定を使うことです。これは、教師付きデータと教師なしデータとの組み合わせに基づいています。この推定戦略をStanで実装するには、未知状態列に対する出力列の確率の計算が必要です。これは周辺化の問題で、HMMでは、前向きアルゴリズムと呼ばれる方法で計算されます。\n+\n+Stanでは、前向きアルゴリズムは以下のようにコーディングされます。<sup>6</sup>まず、教師なしデータのためデータ変数を2つ追加で宣言します。\n+\n+```\n+data {\n+  ...\n+  int<lower=1> T_unsup;  // 教師なしアイテムの数\n+  int<lower=1,upper=V> u[T_unsup]; // 教師なしワード\n+  ...\n+```\n+\n+教師付きデータのモデルは変更ありません。教師なしデータは、以下のように前向きアルゴリズムをStanで実装して扱います。\n+\n+```\n+model {\n+  ...\n+  {\n+    real acc[K];\n+    real gamma[T_unsup,K];\n+    for (k in 1:K)\n+      gamma[1,k] <- log(phi[k,u[1]]);\n+    for (t in 2:T_unsup) {\n+      for (k in 1:K) {\n+        for (j in 1:K)\n+          acc[j] <- gamma[t-1,j] + log(theta[j,k]) + log(phi[k,u[t]]);\n+        gamma[t,k] <- log_sum_exp(acc);\n+      }\n+    }\n+    increment_log_prob(log_sum_exp(gamma[T_unsup]));\n+  }\n+```\n+\n+前向きの値`gamma[t,k]`は、時点`t`までの入力`u[1],...,u[t]`と、潜在状態が時点`t`で`k`に等しいことの対数周辺確率であるとして定義されます。このとき、その前の潜在状態は周辺化消去されます。`gamma`の最初の行の初期化は、潜在状態`k`が最初の出力`u[1]`を生成する対数確率に`gamma[1,k]`が等しいとして設定されます。前と同じように、最初の潜在状態の確率自体はモデル化されません。以降の時点`t`のそれぞれについて、時点`t-1`の潜在状態が`j`である確率（**訳注:gammaは対数確率では？**）と、時点`t-1`に状態`t`だったのが時点`t`に状態`k`に推移する対数確率と、出力`u[t]`が状態`k`から生成される対数確率との和として値`acc[j]`が設定されます。`log_sum_exp`演算は単に、状態`j`の各事前分布の、対数スケールでの確率を算術的に安定な方法で掛け合わせるだけです。","path":"part02/chap07/chap07.md","position":584,"original_position":584,"commit_id":"70d282ecf80e3be218536de8d0857e0c9b7cb79a","original_commit_id":"70d282ecf80e3be218536de8d0857e0c9b7cb79a","user":{"login":"MatsuuraKentaro","id":11885625,"avatar_url":"https://avatars.githubusercontent.com/u/11885625?v=3","gravatar_id":"","url":"https://api.github.com/users/MatsuuraKentaro","html_url":"https://github.com/MatsuuraKentaro","followers_url":"https://api.github.com/users/MatsuuraKentaro/followers","following_url":"https://api.github.com/users/MatsuuraKentaro/following{/other_user}","gists_url":"https://api.github.com/users/MatsuuraKentaro/gists{/gist_id}","starred_url":"https://api.github.com/users/MatsuuraKentaro/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MatsuuraKentaro/subscriptions","organizations_url":"https://api.github.com/users/MatsuuraKentaro/orgs","repos_url":"https://api.github.com/users/MatsuuraKentaro/repos","events_url":"https://api.github.com/users/MatsuuraKentaro/events{/privacy}","received_events_url":"https://api.github.com/users/MatsuuraKentaro/received_events","type":"User","site_admin":false},"body":"* `gamma`の最初の行の初期化は、潜在状態`k`が最初の出力`u[1]`を生成する対数確率に`gamma[1,k]`が等しいとして設定されます。→`gamma`の最初の行（`gamma[1,k]`）は、潜在状態`k`が最初の出力`u[1]`を生成する対数確率で初期化されています。","created_at":"2016-05-05T06:26:23Z","updated_at":"2016-05-05T06:26:23Z","html_url":"https://github.com/stan-ja/stan-ja/pull/23#discussion_r62152294","pull_request_url":"https://api.github.com/repos/stan-ja/stan-ja/pulls/23","_links":{"self":{"href":"https://api.github.com/repos/stan-ja/stan-ja/pulls/comments/62152294"},"html":{"href":"https://github.com/stan-ja/stan-ja/pull/23#discussion_r62152294"},"pull_request":{"href":"https://api.github.com/repos/stan-ja/stan-ja/pulls/23"}}},"pull_request":{"url":"https://api.github.com/repos/stan-ja/stan-ja/pulls/23","id":55619453,"html_url":"https://github.com/stan-ja/stan-ja/pull/23","diff_url":"https://github.com/stan-ja/stan-ja/pull/23.diff","patch_url":"https://github.com/stan-ja/stan-ja/pull/23.patch","issue_url":"https://api.github.com/repos/stan-ja/stan-ja/issues/23","number":23,"state":"open","locked":false,"title":"7章を翻訳しました","user":{"login":"ito4303","id":13703977,"avatar_url":"https://avatars.githubusercontent.com/u/13703977?v=3","gravatar_id":"","url":"https://api.github.com/users/ito4303","html_url":"https://github.com/ito4303","followers_url":"https://api.github.com/users/ito4303/followers","following_url":"https://api.github.com/users/ito4303/following{/other_user}","gists_url":"https://api.github.com/users/ito4303/gists{/gist_id}","starred_url":"https://api.github.com/users/ito4303/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ito4303/subscriptions","organizations_url":"https://api.github.com/users/ito4303/orgs","repos_url":"https://api.github.com/users/ito4303/repos","events_url":"https://api.github.com/users/ito4303/events{/privacy}","received_events_url":"https://api.github.com/users/ito4303/received_events","type":"User","site_admin":false},"body":"計量経済と隠れマルコフモデルのあたりは特に自信ないので、コメントをよろしくお願いいたします。","created_at":"2016-01-11T13:04:06Z","updated_at":"2016-05-05T06:26:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"df817dfcc354f6c0971738ec5901a0e5f64d7300","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/stan-ja/stan-ja/pulls/23/commits","review_comments_url":"https://api.github.com/repos/stan-ja/stan-ja/pulls/23/comments","review_comment_url":"https://api.github.com/repos/stan-ja/stan-ja/pulls/comments{/number}","comments_url":"https://api.github.com/repos/stan-ja/stan-ja/issues/23/comments","statuses_url":"https://api.github.com/repos/stan-ja/stan-ja/statuses/70d282ecf80e3be218536de8d0857e0c9b7cb79a","head":{"label":"stan-ja:create/part02/chap07","ref":"create/part02/chap07","sha":"70d282ecf80e3be218536de8d0857e0c9b7cb79a","user":{"login":"stan-ja","id":16357636,"avatar_url":"https://avatars.githubusercontent.com/u/16357636?v=3","gravatar_id":"","url":"https://api.github.com/users/stan-ja","html_url":"https://github.com/stan-ja","followers_url":"https://api.github.com/users/stan-ja/followers","following_url":"https://api.github.com/users/stan-ja/following{/other_user}","gists_url":"https://api.github.com/users/stan-ja/gists{/gist_id}","starred_url":"https://api.github.com/users/stan-ja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stan-ja/subscriptions","organizations_url":"https://api.github.com/users/stan-ja/orgs","repos_url":"https://api.github.com/users/stan-ja/repos","events_url":"https://api.github.com/users/stan-ja/events{/privacy}","received_events_url":"https://api.github.com/users/stan-ja/received_events","type":"Organization","site_admin":false},"repo":{"id":48265007,"name":"stan-ja","full_name":"stan-ja/stan-ja","owner":{"login":"stan-ja","id":16357636,"avatar_url":"https://avatars.githubusercontent.com/u/16357636?v=3","gravatar_id":"","url":"https://api.github.com/users/stan-ja","html_url":"https://github.com/stan-ja","followers_url":"https://api.github.com/users/stan-ja/followers","following_url":"https://api.github.com/users/stan-ja/following{/other_user}","gists_url":"https://api.github.com/users/stan-ja/gists{/gist_id}","starred_url":"https://api.github.com/users/stan-ja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stan-ja/subscriptions","organizations_url":"https://api.github.com/users/stan-ja/orgs","repos_url":"https://api.github.com/users/stan-ja/repos","events_url":"https://api.github.com/users/stan-ja/events{/privacy}","received_events_url":"https://api.github.com/users/stan-ja/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/stan-ja/stan-ja","description":"","fork":false,"url":"https://api.github.com/repos/stan-ja/stan-ja","forks_url":"https://api.github.com/repos/stan-ja/stan-ja/forks","keys_url":"https://api.github.com/repos/stan-ja/stan-ja/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stan-ja/stan-ja/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stan-ja/stan-ja/teams","hooks_url":"https://api.github.com/repos/stan-ja/stan-ja/hooks","issue_events_url":"https://api.github.com/repos/stan-ja/stan-ja/issues/events{/number}","events_url":"https://api.github.com/repos/stan-ja/stan-ja/events","assignees_url":"https://api.github.com/repos/stan-ja/stan-ja/assignees{/user}","branches_url":"https://api.github.com/repos/stan-ja/stan-ja/branches{/branch}","tags_url":"https://api.github.com/repos/stan-ja/stan-ja/tags","blobs_url":"https://api.github.com/repos/stan-ja/stan-ja/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stan-ja/stan-ja/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stan-ja/stan-ja/git/refs{/sha}","trees_url":"https://api.github.com/repos/stan-ja/stan-ja/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stan-ja/stan-ja/statuses/{sha}","languages_url":"https://api.github.com/repos/stan-ja/stan-ja/languages","stargazers_url":"https://api.github.com/repos/stan-ja/stan-ja/stargazers","contributors_url":"https://api.github.com/repos/stan-ja/stan-ja/contributors","subscribers_url":"https://api.github.com/repos/stan-ja/stan-ja/subscribers","subscription_url":"https://api.github.com/repos/stan-ja/stan-ja/subscription","commits_url":"https://api.github.com/repos/stan-ja/stan-ja/commits{/sha}","git_commits_url":"https://api.github.com/repos/stan-ja/stan-ja/git/commits{/sha}","comments_url":"https://api.github.com/repos/stan-ja/stan-ja/comments{/number}","issue_comment_url":"https://api.github.com/repos/stan-ja/stan-ja/issues/comments{/number}","contents_url":"https://api.github.com/repos/stan-ja/stan-ja/contents/{+path}","compare_url":"https://api.github.com/repos/stan-ja/stan-ja/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stan-ja/stan-ja/merges","archive_url":"https://api.github.com/repos/stan-ja/stan-ja/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stan-ja/stan-ja/downloads","issues_url":"https://api.github.com/repos/stan-ja/stan-ja/issues{/number}","pulls_url":"https://api.github.com/repos/stan-ja/stan-ja/pulls{/number}","milestones_url":"https://api.github.com/repos/stan-ja/stan-ja/milestones{/number}","notifications_url":"https://api.github.com/repos/stan-ja/stan-ja/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stan-ja/stan-ja/labels{/name}","releases_url":"https://api.github.com/repos/stan-ja/stan-ja/releases{/id}","deployments_url":"https://api.github.com/repos/stan-ja/stan-ja/deployments","created_at":"2015-12-19T02:08:26Z","updated_at":"2016-02-24T06:05:55Z","pushed_at":"2016-05-03T10:32:46Z","git_url":"git://github.com/stan-ja/stan-ja.git","ssh_url":"git@github.com:stan-ja/stan-ja.git","clone_url":"https://github.com/stan-ja/stan-ja.git","svn_url":"https://github.com/stan-ja/stan-ja","homepage":null,"size":1780,"stargazers_count":9,"watchers_count":9,"language":"Shell","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":16,"forks":1,"open_issues":16,"watchers":9,"default_branch":"master"}},"base":{"label":"stan-ja:master","ref":"master","sha":"216a77cf0d91908bc486cf3c2bea591853dd55a8","user":{"login":"stan-ja","id":16357636,"avatar_url":"https://avatars.githubusercontent.com/u/16357636?v=3","gravatar_id":"","url":"https://api.github.com/users/stan-ja","html_url":"https://github.com/stan-ja","followers_url":"https://api.github.com/users/stan-ja/followers","following_url":"https://api.github.com/users/stan-ja/following{/other_user}","gists_url":"https://api.github.com/users/stan-ja/gists{/gist_id}","starred_url":"https://api.github.com/users/stan-ja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stan-ja/subscriptions","organizations_url":"https://api.github.com/users/stan-ja/orgs","repos_url":"https://api.github.com/users/stan-ja/repos","events_url":"https://api.github.com/users/stan-ja/events{/privacy}","received_events_url":"https://api.github.com/users/stan-ja/received_events","type":"Organization","site_admin":false},"repo":{"id":48265007,"name":"stan-ja","full_name":"stan-ja/stan-ja","owner":{"login":"stan-ja","id":16357636,"avatar_url":"https://avatars.githubusercontent.com/u/16357636?v=3","gravatar_id":"","url":"https://api.github.com/users/stan-ja","html_url":"https://github.com/stan-ja","followers_url":"https://api.github.com/users/stan-ja/followers","following_url":"https://api.github.com/users/stan-ja/following{/other_user}","gists_url":"https://api.github.com/users/stan-ja/gists{/gist_id}","starred_url":"https://api.github.com/users/stan-ja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stan-ja/subscriptions","organizations_url":"https://api.github.com/users/stan-ja/orgs","repos_url":"https://api.github.com/users/stan-ja/repos","events_url":"https://api.github.com/users/stan-ja/events{/privacy}","received_events_url":"https://api.github.com/users/stan-ja/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/stan-ja/stan-ja","description":"","fork":false,"url":"https://api.github.com/repos/stan-ja/stan-ja","forks_url":"https://api.github.com/repos/stan-ja/stan-ja/forks","keys_url":"https://api.github.com/repos/stan-ja/stan-ja/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stan-ja/stan-ja/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stan-ja/stan-ja/teams","hooks_url":"https://api.github.com/repos/stan-ja/stan-ja/hooks","issue_events_url":"https://api.github.com/repos/stan-ja/stan-ja/issues/events{/number}","events_url":"https://api.github.com/repos/stan-ja/stan-ja/events","assignees_url":"https://api.github.com/repos/stan-ja/stan-ja/assignees{/user}","branches_url":"https://api.github.com/repos/stan-ja/stan-ja/branches{/branch}","tags_url":"https://api.github.com/repos/stan-ja/stan-ja/tags","blobs_url":"https://api.github.com/repos/stan-ja/stan-ja/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stan-ja/stan-ja/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stan-ja/stan-ja/git/refs{/sha}","trees_url":"https://api.github.com/repos/stan-ja/stan-ja/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stan-ja/stan-ja/statuses/{sha}","languages_url":"https://api.github.com/repos/stan-ja/stan-ja/languages","stargazers_url":"https://api.github.com/repos/stan-ja/stan-ja/stargazers","contributors_url":"https://api.github.com/repos/stan-ja/stan-ja/contributors","subscribers_url":"https://api.github.com/repos/stan-ja/stan-ja/subscribers","subscription_url":"https://api.github.com/repos/stan-ja/stan-ja/subscription","commits_url":"https://api.github.com/repos/stan-ja/stan-ja/commits{/sha}","git_commits_url":"https://api.github.com/repos/stan-ja/stan-ja/git/commits{/sha}","comments_url":"https://api.github.com/repos/stan-ja/stan-ja/comments{/number}","issue_comment_url":"https://api.github.com/repos/stan-ja/stan-ja/issues/comments{/number}","contents_url":"https://api.github.com/repos/stan-ja/stan-ja/contents/{+path}","compare_url":"https://api.github.com/repos/stan-ja/stan-ja/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stan-ja/stan-ja/merges","archive_url":"https://api.github.com/repos/stan-ja/stan-ja/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stan-ja/stan-ja/downloads","issues_url":"https://api.github.com/repos/stan-ja/stan-ja/issues{/number}","pulls_url":"https://api.github.com/repos/stan-ja/stan-ja/pulls{/number}","milestones_url":"https://api.github.com/repos/stan-ja/stan-ja/milestones{/number}","notifications_url":"https://api.github.com/repos/stan-ja/stan-ja/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stan-ja/stan-ja/labels{/name}","releases_url":"https://api.github.com/repos/stan-ja/stan-ja/releases{/id}","deployments_url":"https://api.github.com/repos/stan-ja/stan-ja/deployments","created_at":"2015-12-19T02:08:26Z","updated_at":"2016-02-24T06:05:55Z","pushed_at":"2016-05-03T10:32:46Z","git_url":"git://github.com/stan-ja/stan-ja.git","ssh_url":"git@github.com:stan-ja/stan-ja.git","clone_url":"https://github.com/stan-ja/stan-ja.git","svn_url":"https://github.com/stan-ja/stan-ja","homepage":null,"size":1780,"stargazers_count":9,"watchers_count":9,"language":"Shell","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":16,"forks":1,"open_issues":16,"watchers":9,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/stan-ja/stan-ja/pulls/23"},"html":{"href":"https://github.com/stan-ja/stan-ja/pull/23"},"issue":{"href":"https://api.github.com/repos/stan-ja/stan-ja/issues/23"},"comments":{"href":"https://api.github.com/repos/stan-ja/stan-ja/issues/23/comments"},"review_comments":{"href":"https://api.github.com/repos/stan-ja/stan-ja/pulls/23/comments"},"review_comment":{"href":"https://api.github.com/repos/stan-ja/stan-ja/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/stan-ja/stan-ja/pulls/23/commits"},"statuses":{"href":"https://api.github.com/repos/stan-ja/stan-ja/statuses/70d282ecf80e3be218536de8d0857e0c9b7cb79a"}}}}