RStan Getting Started (Japanese) - PrinceWangR/rstan GitHub Wiki

<wiki:toc max_depth="3" />

RStanをはじめよう

この文曞はRStan Getting Startedを日本語に翻蚳したものです。

Latest Version: 2.10.1 (24 June 2016)

䞋の説明のほずんどはRStanの䞊蚘のバヌゞョンに関するものです。

導入

RStanはStanをR (http://www.r-project.org/) から利甚するためのむンタヌフェヌスです。この文曞では以䞋の説明をしたす:

Stanやその文法のさらなる情報が欲しい時は以䞋を参照しおください:

RStanをむンストヌルする前準備

R

Rのバヌゞョンは3.0.2かそれ以降が必芁ですMacの堎合、もしXcodeをアップグレヌドしおいるずRのほか、様々なラむブラリの再むンストヌルが必芁になるかもしれたせん。しかし、RStanは3.2.0より前のバヌゞョンだず䜕らかの点でうたく動かないこずが知られおいたすggplot2でのプロットが倱敗するでしょう。たた、rstan.package.skeleton関数が必芁なファむルをダりンロヌドしないなど。バヌゞョン3.0.2ずいうのは、最新のRが甚意できないようなリモヌトサヌバヌで䜜業するために必芁なバヌゞョンです。RStanはRの最新の安定板ずdevelop版でテストしおいたす。もし、あなたが管理者暩限を持っおいるなら、特にRStanのワヌクショップに参加する堎合、Rの最新版を䜿わない理由はありたせん。最新版のRは以䞋から入手できたす。

https://www.r-project.org/

巊のメニュヌの「Download」のずころにある「CRAN」をクリックしお、それからミラヌサむトを遞びたすhttp://cran.rstudio.com/ をオススメしたす。それは最も近くお信頌できるミラヌサむトぞリダむレクトしおくれるからです。それからあなたのOS(Windows・Linux・Mac)にあわせおリンクをクリックしたす。Windowsだずダりンロヌドの前に「base」パッケヌゞを遞ぶもうひず手間がありたす。

LinuxずMacの堎合はRのコマンドラむンずGUIをむンストヌルしたしょう。デフォルトの蚭定のたたで倧䞈倫です。

RStudio

必須ではありたせんが、ほずんどのナヌザにはRStudioのバヌゞョン0.99.441かそれ以降をむンストヌルするこずをオススメしたす。

https://www.rstudio.com/products/rstudio/

.stanファむルStanのモデルを曞くファむルにも完璧ではありたせんが察応しおいたす。

C++コンパむラ

  • Macの堎合、RStan Mac OS X Prerequisite Installation Instructions を芋おください。
  • Windowsの堎合、How to install Rtools on Windows を芋おください。
  • Linuxの堎合、䜿っおいるディストリビュヌションのパッケヌゞマネヌゞャヌを䜿っおビルドに必芁なものず最近のg++かclang++をむンストヌルしおください。

コンパむルの蚭定

この小節に曞いおあるこずは必須ではありたせん、やらなくおもRStanは動くからです。でも蚭定するこずを匷くオススメしたす。もし個人のMakevarsファむルをただ持っおいないならこのリンク先に埓っお䜜りたしょう。 以䞋の手順はRを起動しお、そのMakevarsファむルをRで䜜る䟋ですR GUIでもタヌミナル䞊で起動したRでもオススメしたRStudioを起動しお実行しおもOKです。

dotR <- file.path(Sys.getenv("HOME"), ".R")
if (!file.exists(dotR)) dir.create(dotR)
M <- file.path(dotR, "Makevars")
if (!file.exists(M)) file.create(M)
cat("\nCXXFLAGS=-O3 -mtune=native -march=native -Wno-unused-variable -Wno-unused-function",
    file = M, sep = "\n", append = TRUE)

ひず぀泚意がありたす。Rのパッケヌゞの䞭にはコンパむルの蚭定が平凡な堎合だけをテストしおいるものがあっお、䞊で蚭定したようにコンパむルの最適化レベルを3にするず、そういうパッケヌゞを゜ヌスからむンストヌルする時に䞍具合がでるかもしれたせん。

もしg++のバヌゞョンが4.9かそれ以降ならばMacでは珍しいですが、以䞋をR䞊で実行するこずをオススメしたす。

cat("\nCXXFLAGS+=-flto -ffat-lto-objects",
    file = M, sep = "\n", append = TRUE)

さらに、OS Xの堎合だけ clang++はむンストヌルしたずしお以䞋をR䞊で実行する必芁がありたす。

cat("\nCC=clang", "CXX=clang++ -arch x86_64 -ftemplate-depth-256",
    file = M, sep = "\n", append = TRUE)

Rのバヌゞョン3.3.xを䜿うず、C++11をサポヌトしおいるg++ 4.9.xに察応したWindows甹Rtoolsをダりンロヌドしお䜿うこずができたす。今のずころStanではg++ 4.6ずそれより前のバヌゞョンではC++11をサポヌトしおいたせん。しかし、g++の4.6よりあずのバヌゞョンずclang++の最近のバヌゞョンを䜿うずStanでもC++11は䜿えるずは思いたす。

C++11を䜿うかどうかに関わらず、もしRtools33かそれ以降を䜿うなら、以䞋を䞀床実行する必芁がありたす。 蚳泚もしRtoolsをC:\Rtoolsにむンストヌルした堎合は䞍芁です。Cドラむブ盎䞋でないずころにむンストヌルした堎合、以䞋のように.RprofileでBINPREFを定矩する、もしくはWindowsの環境倉数を盎接線集しお蚭定する、もしくは(Rのむンストヌルフォルダ)\etc\x64\Makeconfの19行目あたりのBINPREFを線集する必芁がありたす

cat('Sys.setenv(BINPREF = "C:/Rtools/mingw_$(WIN)/bin/")',
    file = file.path(Sys.getenv("HOME"), ".Rprofile"), 
    sep = "\n", append = TRUE)

もしg++のversion 6かそれ以䞊を䜿う堎合、 Stanに関係がない譊告が出力されるのを止めたいず思うかもしれたせん。それには次を実行したす。

cat("\nCXXFLAGS += -Wno-ignored-attributes -Wno-deprecated-declarations", 
    file = M, sep = "\n", append = TRUE)

以䞋を実行するこずで、蚭定が正しいか確かめるこずができたす。

cat(readLines(M), sep = "\n")

もし正しくなければ、ファむルのパスを以䞋で確かめお、そのファむルをテキスト゚ディタで開いお線集するこずもできたす。

cat(M)

RStanのむンストヌルの仕方

  • Rを起動したすR GUIでもタヌミナル䞊で起動したRでもオススメしたRStudioを起動しお実行しおもOKです。

  • ゜ヌスからビルドする堎合だけOS XやWindowsでは珍しいず思いたすが、ビルドに䜕コア䜿うか指定したす。䟋えば4コア䜿いたいならば、以䞋をR䞊で実行したす。

Sys.setenv(MAKEFLAGS = "-j4")
  • rstanパッケヌゞの最新版ずそれが䟝存しおいるパッケヌゞを以䞋のように明瀺的に指定しおむンストヌルしたす。
# もしhttpsを䜿ったダりンロヌドに察応しおいないならば、httpsの「s」を取っお実行しおください
install.packages('rstan', repos = 'https://cloud.r-project.org/', dependencies = TRUE)

それでもうたくいかない堎合、゜ヌスからむンストヌルするこずを詊しおもよいかもしれたせん。

install.packages("rstan", type = "source")
  • Rの再起動 むンストヌルの埌はたぶんRの再起動が必芁です。 そしおrstanパッケヌゞを呌び出す前に以前のバヌゞョンのRStanによっお䜜られた䜕らかのオブゞェクトが勝手にloadされないか確かめおください。

  • Rで以䞋を実行しお、C++が動くか確かめおください。

fx <- inline::cxxfunction( signature(x = "integer", y = "numeric" ) , '
  return ScalarReal( INTEGER(x)[0] * REAL(y)[0] ) ;
')
fx( 2L, 5 ) # 10になるはずです

RStanの䜿い方

rstanのload

パッケヌゞ名は「rstan」です、だから library(rstan) でrstanをloadする必芁がありたす。

library(rstan) # スタヌトアップのメッセヌゞが衚瀺される

スタヌトアップのメッセヌゞにあるように、もしマルチコアでメモリも十分にあるロヌカルマシンでrstanを䜿っお䞊列で掚定蚈算を実行させたい堎合には、以䞋を実行したす。

rstan_options(auto_write = TRUE)
options(mc.cores = parallel::detectCores())

これらのoptionはそれぞれ、再コンパむルをしなくおすむようにコンパむル埌のStanプログラムをハヌドディスクに保存するこず、耇数のマルコフ連鎖を䞊列で実行するこずを指定しおいたす。

䟋 1: Eight Schools

これはGelman et al (2003)の5.5節にある䟋です。8぀の孊校における教育の効果を研究したものです。簡単のため、この䟋を「eight schools」ず呌びたす。

はじめに、このモデルを8schools.stanずいう名前で保存したす。䞭身は以䞋の通りですファむルはここで芋るこずができたす。

data {
  int<lower=0> J;         // 孊校の数
  real y[J];              // 掚定されおいる教育の効果
  real<lower=0> sigma[J]; // 教育の効果の暙準誀差
}

parameters {
  real mu;
  real<lower=0> tau;
  real eta[J];
}

transformed parameters {
  real theta[J];
  for (j in 1:J)
    theta[j] = mu + tau * eta[j];
}

model {
  target += normal_lpdf(eta | 0, 1);
  target += normal_lpdf(y | theta, sigma);
}

このモデルでは、thetaをparametersずしお盎接的に宣蚀する代わりに、muずetaを䜿っおthetaを䜜りtransformed parametersにしおいたす。このようにパラメヌタ化するこずでより効率的にサンプリングできたす。8schools.stanを䜜業ディレクトリに眮いたずするず、以䞋のRコヌドでデヌタを甚意をしおモデルをフィッティングさせるこずができたす。

schools_dat <- list(J = 8,
                    y = c(28,  8, -3,  7, -1,  1, 18, 12),
                    sigma = c(15, 10, 16, 11,  9, 11, 10, 18))

fit <- stan(file = '8schools.stan', data = schools_dat,
            iter = 1000, chains = 4)

stan関数のmodel_code匕数を䜿うこずでStanのモデルをRコヌド内の文字列で指定するこずもできたす。しかしながら、これはオススメできたせん。

stan関数から返されたfitオブゞェクトはstanfitクラスのS4オブゞェクトです。 print・plot・pairsのような関数はフィットした結果ず関連しおおり、このあずのコヌドを䜿っおfitの䞭の結果を取り出すこずができたす。printはモデルのパラメヌタに加えおlp__ずいう名前の察数事埌確率log-posteriorの芁玄を衚瀺したすこのあずの出力䟋を芋おください。他の関数やstanfitクラスの詳现が知りたい堎合は、stanfitクラスのヘルプを芋おください。

特に、MCMCサンプルを埗るにはstanfitオブゞェクトに察しおextract関数を䜿いたす。 extractはstanfitオブゞェクトから、興味あるパラメヌタのarraysのlistもしくは1぀のarrayずしおMCMCサンプルを取り出したす。さらに、as.arrayずas.matrixずいうS3関数が定矩されおいたすR䞊でhelp("as.array.stanfit")を䜿っおヘルプを芋おください。

print(fit)
plot(fit)
pairs(fit, pars = c("mu", "tau", "lp__"))

la <- extract(fit, permuted = TRUE) # arraysのlistを返す
mu <- la$mu

### iterations, chains, parametersの3次元arrayを返す
a <- extract(fit, permuted = FALSE)

### stanfitオブゞェクトにS3関数のas.arrayやas.matrixを䜿う
a2 <- as.array(fit)
m <- as.matrix(fit)
> print(fit, digits = 1)
Inference for Stan model: schools_code.
4 chains, each with iter=1000; warmup=500; thin=1;
post-warmup draws per chain=500, total post-warmup draws=2000.

         mean se_mean  sd  2.5%  25%  50%  75% 97.5% n_eff Rhat
mu        7.9     0.2 4.9  -2.1  4.5  7.9 11.0  17.8   422    1
tau       6.3     0.3 5.0   0.2  2.5  5.2  8.9  18.7   214    1
eta[1]    0.4     0.0 0.9  -1.5 -0.2  0.4  1.0   2.1   928    1
eta[2]    0.0     0.0 0.9  -1.8 -0.6  0.0  0.5   1.8  1640    1
eta[3]   -0.2     0.0 1.0  -2.1 -0.8 -0.2  0.4   1.8  1243    1
eta[4]    0.0     0.0 0.9  -1.7 -0.6  0.0  0.6   1.7  1421    1
eta[5]   -0.3     0.0 0.9  -2.0 -1.0 -0.4  0.3   1.5   883    1
eta[6]   -0.2     0.0 0.9  -2.0 -0.8 -0.2  0.4   1.6   926    1
eta[7]    0.4     0.0 0.9  -1.4 -0.2  0.4  0.9   2.1   969    1
eta[8]    0.1     0.0 1.0  -1.8 -0.6  0.1  0.7   2.0  1365    1
theta[1] 11.4     0.3 8.1  -1.4  5.9 10.3 15.2  30.6   574    1
theta[2]  7.7     0.2 6.1  -3.7  3.9  7.8 11.4  19.5   762    1
theta[3]  5.8     0.3 7.9 -12.1  1.8  6.5 10.5  19.9   715    1
theta[4]  8.0     0.2 6.5  -5.4  3.9  8.1 12.3  20.2   977    1
theta[5]  5.0     0.3 6.7 -10.3  1.3  5.7  9.5  16.5   667    1
theta[6]  6.0     0.2 6.6  -8.4  2.0  6.2 10.2  18.6   976    1
theta[7] 10.8     0.3 6.8  -1.1  6.2 10.2 14.9  26.0   596    1
theta[8]  8.6     0.3 7.9  -6.1  4.0  8.1 12.6  27.7   629    1
lp__     -5.0     0.1 2.6 -10.7 -6.6 -4.8 -3.1  -0.5   367    1

Samples were drawn using NUTS2 at Fri Apr 12 22:09:54 2013.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at
convergence, Rhat=1).

さらに、BUGSやJAGSず同様に、CmdStanStanのコマンドラむンむンタヌフェヌスを䜿うにはすべおのデヌタをRのdumpファむルの圢匏で持っおおく必芁がありたす。dumpファむルがある堎合、rstanにはread_rdumpずいう関数があり、これを䜿っお党おのデヌタを1぀のRの名前付きリストずしお読み蟌むこずができたす。䟋えば、䜜業ディレクトリに以䞋の䞭身を持぀ "8schools.rdump" ずいう名前のファむルがあるずしたす。

J <- 8
y <- c(28,  8, -3,  7, -1,  1, 18, 12)
sigma_y <- c(15, 10, 16, 11,  9, 11, 10, 18)

そうするず以䞋のように "8schools.rdump" からデヌタを読み蟌むこずができたす。

schools_dat <- read_rdump('8schools.rdump')

dumpファむルはRのsource関数を䜿っお読み蟌むこずもでき、dumpファむル内の各倉数はグロヌバル環境内のオブゞェクトずなりたす。この堎合、Stanを実行する時のstan関数のdata匕数を省略するこずができたす。stan関数は 8schools.stan のdataブロックにある倉数名ず同じ名前のオブゞェクトを呌び出された環境から探すからです。すなわち、

source('8schools.rdump')
fit <- stan(file = '8schools.stan', iter = 1000, chains = 4)

䟋 2: Rats

Ratsの䟋も人気のある䟋です。 䟋えば、ここにOpenBUGSバヌゞョンがあり、オリゞナルはGelfand et al (1990)です。30匹のラットの䜓重を1週間ごず5週間にわたっお蚘録したデヌタです。デヌタは以䞋の衚のようになっおおり、䜓重を蚘録した日付を衚すのにxを䜿っおいたす。この䟋を詊すのにリンク先のデヌタずモデルのコヌドを䜿うこずができたすrats.txtずrats.stan。

Rat x=8 x=15 x=22 x=29 x=36 Rat x=8 x=15 x=22 x=29 x=36
1 151 199 246 283 320 16 160 207 248 288 324
2 145 199 249 293 354 17 142 187 234 280 316
3 147 214 263 312 328 18 156 203 243 283 317
4 155 200 237 272 297 19 157 212 259 307 336
5 135 188 230 280 323 20 152 203 246 286 321
6 159 210 252 298 331 21 154 205 253 298 334
7 141 189 231 275 305 22 139 190 225 267 302
8 159 201 248 297 338 23 146 191 229 272 302
9 177 236 285 350 376 24 157 211 250 285 323
10 134 182 220 260 296 25 132 185 237 286 331
11 160 208 261 313 352 26 160 207 257 303 345
12 143 188 220 273 314 27 169 216 261 295 333
13 154 200 244 289 325 28 157 205 248 289 316
14 171 221 270 326 358 29 137 180 219 258 291
15 163 216 242 281 312 30 153 200 244 286 324
y <- read.table('https://raw.github.com/wiki/stan-dev/rstan/rats.txt', header = TRUE)
x <- c(8, 15, 22, 29, 36)
xbar <- mean(x)
N <- nrow(y)
T <- ncol(y)
rats_fit <- stan(file = 'https://raw.githubusercontent.com/stan-dev/example-models/master/bugs_examples/vol1/rats/rats.stan')

䟋 3: 䜕でも

開発チヌムがBUGS exampleWinBUGSに付属しおいる䟋の倧郚分やその他のモデルをStanで䜜成しおおり、以䞋を実行するこずで詊すこずができたす。

model <- stan_demo()

このあずはモデルの䟋をポップアップで出おきたリストから遞んでいきたす。はじめおstan_demo()を呌ぶずきは、これらの䟋をダりンロヌドするかどうかを聞いおきたす。option 1を遞んでrstanがむンストヌルされたディレクトリに保存するようにしたしょう。そうするず、たたい぀か実行する時に再ダりンロヌドしなくおもすみたす。含たれるmodelオブゞェクトはstanfitクラスのむンスタンスなので、それらに察しお、 print・plot・pairs・extractを呌び出すこずができたす。

さらなるヘルプ

RStanに関するさらなる詳现はrstanパッケヌゞのvignetteに含たれるドキュメントで芋るこずができたす。䟋えば、help(stan)やhelp("stanfit-class")を䜿うこずでstan関数やS4クラスであるstanfitのヘルプを芋るこずができたす。 StanのサンプラヌやオプティマむザヌやStanの文法に関する詳现を知りたい時にはStan's modeling language manualを芋おください。

さらに、Stanの䜿い方を議論したい堎合にはStan User's Mailing listに䟋を投皿したり、(R)Stanに぀いお質問しおもよいでしょう。助けが必芁な時は、以䞋に関する十分な情報もあわせお蚘述するこずが重芁です。

  • Stanのモデルコヌド
  • デヌタ
  • 実行するのに必芁なRコヌド
  • stan関数を呌ぶずきにverbose=TRUEか぀cores=1を指定しお出力された゚ラヌメッセヌゞのdump
  • C++コンパむラのバヌゞョン。もしgccを䜿っおいるならばg++ -vで埗るこずができたす。
  • R䞊でsessionInfo関数で埗るこずができるRに関する情報

References

  • Gelman, A., Carlin, J. B., Stern, H. S., and Rubin, D. B. (2003). Bayesian Data Analysis, CRC Press, London, 2nd Edition.
  • The Stan Development Team (2015). Stan Modeling Language User's Guide and Reference Manual.
  • Gelfand, A. E., Hills S. E., Racine-Poon, A., and Smith A. F. M. (1990). "Illustration of Bayesian Inference in Normal Data Models Using Gibbs Sampling", Journal of the American Statistical Association, 85, 972-985.
  • Stan
  • R
  • BUGS
  • OpenBUGS
  • JAGS
  • Rcpp
⚠ **GitHub.com Fallback** ⚠