SlideShare a Scribd company logo
1 of 45
Stanチュートリアル

@TeitoNakagawa
2013/10/13
イントロダクション
データ分析最大の問題・・・
そう、それは
モデリング
しかし、それが難しい
モデリングに伴う問題

柔軟なモデリン
グが必要

個体差の
あるデータ

少ない
データ
上記のような制約でモデリングを諦めることも
統計モデリング
銀の弾丸
BUGS/Stan
• BUGS/Stan・・・MCMCを用いたベイズ推定に
よるモデリングを行うためのドメイン固有言語

殺意しか湧かないWinBUGSのGUI
BUGS/Stan
• BUGS/Stan・・・MCMCを用いたベイズ推定に
よるモデリングを行うためのドメイン固有言語

殺意しか湧かないWinBUGSのGUI
MCMCを用いたベイズ推定による
モデリングのイメージ
データ:結果であり、
入手したもの

現実世界

モデル:確率分布で表された世界。
パラメータに基づき、サイコロが
振られて、データが発生する。

ドメイン知識:結果から
得られた仮定

パラメータ:
神のみぞ知る世界、
事象の背後に潜む数値

*イメージです
MCMCを用いたベイズ推定による
モデリングのイメージ
データ:モデルに投入。データ
を発生させるパラメータをモデ
ルで高く評価させる

ベイズ推定

モデル:サイコロを振る(=MCMC)
ことにより、データとドメイン知識を
もっとも説明するパラメータを推定

BUGS/Stan
パラメータ:ベイズ推定
の結果として知りたい事象
ドメイン知識:仮定を制約として
モデルに組み込む。

*イメージです
わからない人はこちらを参照

https://skydrive.live.com/view.aspx?resid=FD448A567D4BC37E!1408&ci
d=fd448a567d4bc37e&app=PowerPoint&authkey=!ALpj-TLdJhVUvPw
BUGSとStanどっちを使えばいいの?
BUGS(WinBUGS*1)
コンパイル不要
技術的に枯れていて、資料
も多い。
非手続き的なのでモデルの
記述量が少ない。
計算は遅い
デバッグ画面があれ。
開発が終了している。

*1:JAGSは利用したことがありません。

Stan
コンパイル後の計算が早い
NUTSなので収束が早い
データ型が豊富
手続き的なので動作が明瞭
デバッグがしやすい
公式ドキュメントの質が高い
変数にドット.を使えないなど、
Rとの親和性が悪い
手続き的なので書くのが難
しい
【参考】香ばしいWinBUGSのTrap画面
【参考】BUGS→Stanのパフォーマンス

890×517のデータを使用、パラメータ数は893のモデル

WinBUGS
Stanx4
【参考】BUGSを使うメリット

http://www.slideshare.net/berobero11/bugs-26159695
Stanチュートリアル
Stanって何?
• StanはHMCをNUTSで実装したサンプラー
– 現在も開発、更新が頻繁に行われている。
– Rのインターフェースがあり、使いやすい

• とにかく早い
– NUTS(HMC)を使用しているため、収束が早い
– C++→実行ファイルに変換、計算が早い
Stanのサンプルコード
– BUGSと似ているがより手続き的
# http://www.mrc-bsu.cam.ac.uk/bugs/winbugs/Vol1.pdf
# Page 3: Rats
data {
int<lower=0> N;
int<lower=0> T;
real x[T];
real y[N,T];
real xbar;
}
...
model {
mu_alpha ~ normal(0, 100);
mu_beta ~ normal(0, 100);
sigmasq_y ~ inv_gamma(0.001, 0.001);
From https://github.com/stan-dev/stan/tree/master/src/models/bugs_examples/vol1/rats
Stanチュートリアル
1.
2.
3.
4.

インストールします。
データを用意します。
Stanファイルを記述します。
RからStanを実行します。
Stanチュートリアル
1.
2.
3.
4.

インストールします。
データを用意します。
Stanファイルを記述します。
RからStanを実行します。
インストール方法(Windows).
1. Rtoolsをインストール・・・次へ、次へをクリッ
クすると入ります。
2. RCppとinlineをインストール・・・PATHの順番
を必ず、RtoolsのPATHが先頭に来るようにし
ましょう。
3. Rstanをインストール・・・Rのインストールコー
ド実行すると、インストールされ
ます。CRANには存在しないので
注意。
参考:Windows8にrstanをインストールする。
http://d.hatena.ne.jp/EulerDijkstra/20130825/1377445438
Stanチュートリアル
1.
2.
3.
4.

インストールします。
データを用意します。
Stanファイルを記述します。
RからStanを実行します。
ラットデータ
• WinBUGS example volume Iに
入っているサンプルデータ
(http://www.mrc-bsu.cam.ac.uk/bugs/winbugs/Vol1.pdf)

•
•
•
•

Gelfand et al (1990)
週別の生後間もないラットの体重のモデル
行:個別のラット(N=30)
列:体重計測日(M=5)

From http://www.mrc-bsu.cam.ac.uk/bugs/winbugs/Vol1.pdf
データを用意します。
rats.data.R
N <-30
T <-5
y <-structure(c(151, 145, 147, 155, 135, 159, 141, 159, 177, 134,
160, 143, 154, 171, 163, 160, 142, 156, 157, 152, 154, 139, 146,
157, 132, 160, 169, 157, 137, 153, 199, 199, 214, 200, 188, 210,
189, 201, 236, 182, 208, 188, 200, 221, 216, 207, 187, 203, 212,
203, 205, 190, 191, 211, 185, 207, 216, 205, 180, 200, 246, 249,
263, 237, 230, 252, 231, 248, 285, 220, 261, 220, 244, 270, 242,
248, 234, 243, 259, 246, 253, 225, 229, 250, 237, 257, 261, 248,
219, 244, 283, 293, 312, 272, 280, 298, 275, 297, 350, 260, 313,
273, 289, 326, 281, 288, 280, 283, 307, 286, 298, 267, 272, 285,
286, 303, 295, 289, 258, 286, 320, 354, 328, 297, 323, 331, 305,
338, 376, 296, 352, 314, 325, 358, 312, 324, 316, 317, 336, 321,
334, 302, 302, 323, 331, 345, 333, 316, 291, 324), .Dim = c(30,
5))
x <- c(8.0, 15.0, 22.0, 29.0, 36.0)
ファイルの場所
xbar <-22.0

<Rのライブラリーインストール先>rstan¥include¥
stansrc¥models¥bugs_examples¥vol1¥rats
Stanチュートリアル
1.
2.
3.
4.

インストールします。
データを用意します。
Stanファイルを記述します。
RからStanを実行します。
ラットモデル
•

個体差と時間による成長を取り入れた階層ベイズモ
デル
Yij : 個体iのj日目の観測データ

x j :日数 xbar :日数中央値( 22 )
日
知りたいの
はこれ!

 i : 個体iの切片  i : 個体iの日数係数
 : 全個体共通のバラツキ

From http://www.mrc-bsu.cam.ac.uk/bugs/winbugs/Vol1.pdf
Stanプログラムはブロックからなる
• Stanの骨子となるプログラム
• modelブロック以外はオプショナル

この順は
固定

data {
model {
... declarations ...
... declarations ... statements ...
}
}
transformed data {
generated quantities {
... declarations ... statements ...... declarations ... statements ...
}
}
parameters {
... declarations ...
}
transformed parameters {
... declarations ... statements ...
}
Stan Program has specific blocks.
data

• 入力データの宣言、デー
タは最初にロードされる

transformed
data

• データに対してStan側で
変換を行う

parameters

• 結果として出力するパラ
メータを宣言する。
dataブロック
先ほどのデータファイルの変数名と一致している。

N=個体数、T=日付の数
X=日数、Y=観測値
Xbar=日数の中央値
ベクトルではなく、配列
parametersブロック
個体差の配列を宣言
alpha=出生体重
beta=日数の効果
個体差の配列を宣言

各パラメー
タの分散
Stan Program has specific blocks.
Transformed

• パラメータを変換する

Parameters
Model

Generated
Quantities

• モデル記述部、必須

• 全ての変数を参照可能。1
サンプルにつき実行される。
transfromed parametersブロック
transformed parameters {
分散を標準偏差
real<lower=0> sigma_y; // sigma in original…
に変換
real<lower=0> sigma_alpha;
real<lower=0> sigma_beta;
sigma_y <- sqrt(sigmasq_y);
sigma_alpha <- sqrt(sigmasq_alpha);
sigma_beta <- sqrt(sigmasq_beta);
}
modelブロック
model {
超パラメータを
mu_alpha ~ normal(0, 100);
サンプリング
mu_beta ~ normal(0, 100);
sigmasq_y ~ inv_gamma(0.001, 0.001);
sigmasq_alpha ~ inv_gamma(0.001, 0.001);
sigmasq_beta ~ inv_gamma(0.001, 0.001);
alpha ~ normal(mu_alpha, sigma_alpha); // vectorized
超パラメータを
beta~ normal(mu_beta, sigma_beta); // vectorized
用いてパラメータ
for (n in 1:N)
をサンプリング
for (t in 1:T)
y[n,t] ~ normal(alpha[n] + beta[n] * (x[t] - xbar), sigma_y);
}
個体差を含む体重に誤差を加えてサンプリング
Stanチュートリアル
1.
2.
3.
4.

インストールします。
データを用意します。
Stanファイルを記述します。
RからStanを実行します。
RStan
• Rstan・・・RのStanインターフェース
– C++への変換、コンパイルから、実行までを担当
– 結果はstanfit関数に格納
– 可視化の関数あり
Rstanまわりの構造

stan ()

stan ()

Stan code
stanc()

C++ code

plot()

exe

stan_model()

S4:stanfit
sampling()

traceplot()
extract()
Rでの実行
#set to dir which contains source file
STAN_HOME<-<STAN_HOME>
dirpath<-paste0(STAN_HOME, path_to_dir)
#load data to list:dat
データはリス
source(paste0(dirpath, "/rats.data.R"))
ト形式でStan
dat<-list(y=y, x=x, xbar=xbar, N=N, T=T)
に渡せる。
#fit1:to simulate the model as one liner
fit1 <- stan(file = paste0(dirpath, "/rats.stan"), data = dat,
iter = 1000, chains = 4)
apply(extract(fit1)$alpha,2, median)

Stanfitクラス、Stanでの実行結果が返される
plot(stanfit)
パラメータ別に値を確認
可能

Rhatは色で確認
traceplot(stanfit)
それぞれのチェインのふ
るまいを確認可能
前回のモデルを利用
Once a model is fitted, we can use the fitted
result as an input to fit the model with other
data or settings. This would save us time of
compiling the C++ code for the model
https://code.google.com/p/stan/wiki/RStanGettingStarted

#fit again using the previous fit result
fit3<-stan(fit=fit1, data = dat, iter = 400, chains = 4)
Rからの並列計算
#parallel processing of
library(doSNOW)
library(foreach)
cl<-makeCluster(4)
registerDoSNOW(cl)

doSNOWとforeachを使用
4パラで計算

#parallel processing each chain of stan
sflist1<-foreach(i=1:10,.packages='rstan') %dopar% {
stan(fit = fit1, data=dat, chains = 1, chain_id = i, refresh = -1)
}
#merging the chains
f3<-sflist2stanfit(sflist1)

foreachで並列処理、
Stanfitクラスのリストを取得する。

Sflist2stanfitでリストをマージする。
結果
EOF

More Related Content

Viewers also liked

第2回 R言語で始めよう、データサイエンス(ハンズオン勉強会) 〜相関分析による需要予測編〜
第2回 R言語で始めよう、データサイエンス(ハンズオン勉強会) 〜相関分析による需要予測編〜第2回 R言語で始めよう、データサイエンス(ハンズオン勉強会) 〜相関分析による需要予測編〜
第2回 R言語で始めよう、データサイエンス(ハンズオン勉強会) 〜相関分析による需要予測編〜Yasuyuki Sugai
 
R stan導入公開版
R stan導入公開版R stan導入公開版
R stan導入公開版考司 小杉
 
マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)
マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)
マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)Yoshitake Takebayashi
 
エクセルで統計分析 統計プログラムHADについて
エクセルで統計分析 統計プログラムHADについてエクセルで統計分析 統計プログラムHADについて
エクセルで統計分析 統計プログラムHADについてHiroshi Shimizu
 
Rによるデータ分析手順入門
Rによるデータ分析手順入門Rによるデータ分析手順入門
Rによるデータ分析手順入門Michitaro Okano
 
ウィナーフィルタと適応フィルタ
ウィナーフィルタと適応フィルタウィナーフィルタと適応フィルタ
ウィナーフィルタと適応フィルタToshihisa Tanaka
 
第1008回 ドキッ!分析屋だらけの、大ザーユー会 - ブログの類似記事を表示させてみる
第1008回 ドキッ!分析屋だらけの、大ザーユー会 - ブログの類似記事を表示させてみる第1008回 ドキッ!分析屋だらけの、大ザーユー会 - ブログの類似記事を表示させてみる
第1008回 ドキッ!分析屋だらけの、大ザーユー会 - ブログの類似記事を表示させてみるAtsushi Hayakawa
 
10分で分かるr言語入門ver2.4
10分で分かるr言語入門ver2.410分で分かるr言語入門ver2.4
10分で分かるr言語入門ver2.4Nobuaki Oshiro
 
Intoroduction of Bad Data Handbook
Intoroduction of Bad Data HandbookIntoroduction of Bad Data Handbook
Intoroduction of Bad Data HandbookAtsushi Hayakawa
 
Tokyo.R女子部#2「RMeCabを使おう」
Tokyo.R女子部#2「RMeCabを使おう」Tokyo.R女子部#2「RMeCabを使おう」
Tokyo.R女子部#2「RMeCabを使おう」Sachiko Hirata
 
Google's r style guideのすゝめ
Google's r style guideのすゝめGoogle's r style guideのすゝめ
Google's r style guideのすゝめTakashi Kitano
 
MLaPP 9章 「一般化線形モデルと指数型分布族」
MLaPP 9章 「一般化線形モデルと指数型分布族」MLaPP 9章 「一般化線形モデルと指数型分布族」
MLaPP 9章 「一般化線形モデルと指数型分布族」moterech
 
Stan で欠測データの相関係数を推定してみた
Stan で欠測データの相関係数を推定してみたStan で欠測データの相関係数を推定してみた
Stan で欠測データの相関係数を推定してみたhoxo_m
 
チェビシェフの不等式
チェビシェフの不等式チェビシェフの不等式
チェビシェフの不等式hoxo_m
 
BUGSを使うメリット
BUGSを使うメリットBUGSを使うメリット
BUGSを使うメリット. .
 
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月VirtualTech Japan Inc.
 
はじめてのパターン認識読書会 第四回 前半
はじめてのパターン認識読書会 第四回 前半はじめてのパターン認識読書会 第四回 前半
はじめてのパターン認識読書会 第四回 前半Atsushi Hayakawa
 
Tech Lab Paak講演会 20150601
Tech Lab Paak講演会 20150601Tech Lab Paak講演会 20150601
Tech Lab Paak講演会 20150601Takashi J OZAKI
 

Viewers also liked (20)

Introduction of stan
Introduction of stanIntroduction of stan
Introduction of stan
 
第2回 R言語で始めよう、データサイエンス(ハンズオン勉強会) 〜相関分析による需要予測編〜
第2回 R言語で始めよう、データサイエンス(ハンズオン勉強会) 〜相関分析による需要予測編〜第2回 R言語で始めよう、データサイエンス(ハンズオン勉強会) 〜相関分析による需要予測編〜
第2回 R言語で始めよう、データサイエンス(ハンズオン勉強会) 〜相関分析による需要予測編〜
 
R stan導入公開版
R stan導入公開版R stan導入公開版
R stan導入公開版
 
マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)
マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)
マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)
 
エクセルで統計分析 統計プログラムHADについて
エクセルで統計分析 統計プログラムHADについてエクセルで統計分析 統計プログラムHADについて
エクセルで統計分析 統計プログラムHADについて
 
Rによるデータ分析手順入門
Rによるデータ分析手順入門Rによるデータ分析手順入門
Rによるデータ分析手順入門
 
ウィナーフィルタと適応フィルタ
ウィナーフィルタと適応フィルタウィナーフィルタと適応フィルタ
ウィナーフィルタと適応フィルタ
 
第1008回 ドキッ!分析屋だらけの、大ザーユー会 - ブログの類似記事を表示させてみる
第1008回 ドキッ!分析屋だらけの、大ザーユー会 - ブログの類似記事を表示させてみる第1008回 ドキッ!分析屋だらけの、大ザーユー会 - ブログの類似記事を表示させてみる
第1008回 ドキッ!分析屋だらけの、大ザーユー会 - ブログの類似記事を表示させてみる
 
10分で分かるr言語入門ver2.4
10分で分かるr言語入門ver2.410分で分かるr言語入門ver2.4
10分で分かるr言語入門ver2.4
 
Intoroduction of Bad Data Handbook
Intoroduction of Bad Data HandbookIntoroduction of Bad Data Handbook
Intoroduction of Bad Data Handbook
 
Tokyo.R女子部#2「RMeCabを使おう」
Tokyo.R女子部#2「RMeCabを使おう」Tokyo.R女子部#2「RMeCabを使おう」
Tokyo.R女子部#2「RMeCabを使おう」
 
Google's r style guideのすゝめ
Google's r style guideのすゝめGoogle's r style guideのすゝめ
Google's r style guideのすゝめ
 
Prml 2.3
Prml 2.3Prml 2.3
Prml 2.3
 
MLaPP 9章 「一般化線形モデルと指数型分布族」
MLaPP 9章 「一般化線形モデルと指数型分布族」MLaPP 9章 「一般化線形モデルと指数型分布族」
MLaPP 9章 「一般化線形モデルと指数型分布族」
 
Stan で欠測データの相関係数を推定してみた
Stan で欠測データの相関係数を推定してみたStan で欠測データの相関係数を推定してみた
Stan で欠測データの相関係数を推定してみた
 
チェビシェフの不等式
チェビシェフの不等式チェビシェフの不等式
チェビシェフの不等式
 
BUGSを使うメリット
BUGSを使うメリットBUGSを使うメリット
BUGSを使うメリット
 
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
 
はじめてのパターン認識読書会 第四回 前半
はじめてのパターン認識読書会 第四回 前半はじめてのパターン認識読書会 第四回 前半
はじめてのパターン認識読書会 第四回 前半
 
Tech Lab Paak講演会 20150601
Tech Lab Paak講演会 20150601Tech Lab Paak講演会 20150601
Tech Lab Paak講演会 20150601
 

Similar to StanTutorial

Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編) daiki hojo
 
機械学習を使った時系列売上予測
機械学習を使った時系列売上予測機械学習を使った時系列売上予測
機械学習を使った時系列売上予測DataRobotJP
 
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案Kamiya Toshihiro
 
第8回 大規模データを用いたデータフレーム操作実習(2)
第8回 大規模データを用いたデータフレーム操作実習(2)第8回 大規模データを用いたデータフレーム操作実習(2)
第8回 大規模データを用いたデータフレーム操作実習(2)Wataru Shito
 
JAWSUG 20191028 (modified)
JAWSUG 20191028 (modified)JAWSUG 20191028 (modified)
JAWSUG 20191028 (modified)陽平 山口
 
Talendデータ・ファブリック・ソリューションの概要
Talendデータ・ファブリック・ソリューションの概要Talendデータ・ファブリック・ソリューションの概要
Talendデータ・ファブリック・ソリューションの概要QlikPresalesJapan
 
エンジニアのための機械学習の基礎
エンジニアのための機械学習の基礎エンジニアのための機械学習の基礎
エンジニアのための機械学習の基礎Daiyu Hatakeyama
 

Similar to StanTutorial (7)

Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編)
 
機械学習を使った時系列売上予測
機械学習を使った時系列売上予測機械学習を使った時系列売上予測
機械学習を使った時系列売上予測
 
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
 
第8回 大規模データを用いたデータフレーム操作実習(2)
第8回 大規模データを用いたデータフレーム操作実習(2)第8回 大規模データを用いたデータフレーム操作実習(2)
第8回 大規模データを用いたデータフレーム操作実習(2)
 
JAWSUG 20191028 (modified)
JAWSUG 20191028 (modified)JAWSUG 20191028 (modified)
JAWSUG 20191028 (modified)
 
Talendデータ・ファブリック・ソリューションの概要
Talendデータ・ファブリック・ソリューションの概要Talendデータ・ファブリック・ソリューションの概要
Talendデータ・ファブリック・ソリューションの概要
 
エンジニアのための機械学習の基礎
エンジニアのための機械学習の基礎エンジニアのための機械学習の基礎
エンジニアのための機械学習の基礎
 

StanTutorial