8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Google colaboratory上でのStanの使い方

Last updated at Posted at 2021-12-10

#はじめに
千葉大学/Nospareの米倉です.今回はGoogle colaboratory(Colab)上でのStanの使い方を解説しようと思います.ほぼ備忘録ですので,細かい誤りや非効率な部分が多分含まれます.ご了承下さい.またStanの詳しい使い方の説明ではありません.

#なんでColab上でStanを動かしたいか
Stanとは,ベイズ推定を簡単に行うための確率言語のことで,多くの方が使用していると思います.R上で動かすものをRstan,Python上で動かすものをPystanと特にいいます.Stan自体は非常に便利なのですが,使えるようにするまでのセットアップが結構めんどくさいです.例えばC++のコンパイラーをインストールしたりしなくてはいけません.またWindowsを用いていると,例えばRがonedriveを何故か参照して,日本語名ファイルを認識できないため,エラーが発生します.人によっては些細な問題点だと思いますが,教員からすると生徒のPC環境一個一個を把握している暇はないので,こういった問題は避けたいのが本音です.

素晴らしいことに,ColabにはデフォルトでPystanが使えるようになっており,自分で環境設定をする必要がありません.有難うございます.Google.

#Stanファイルの作成
まずは何らかのエディターでstanファイルを作成します.残念ながらColab上でStanファイルそのものを作成するのは適していないので,僕はRstudioを用いて作成しています.ここがちょっと二度手間と言うか残念な点ではあり,Rstanを自分で設定できる人はColabを使う必要がないと思う点です.今回は以下の様な単回帰モデル+無情報事前分布を考え,reg.stanとして保存しました.

data{
  int N;
  real Y[N];
  real X[N];
}

parameters{
  real beta_0;
  real beta_1;
  real<lower=0> sigma;
}

model{
  for (i in 1:N){
    Y[i] ~ normal(beta_0+beta_1*X[i],sigma);
  }
}

#必要なライブラリーのインポート
まずはPystanや,作図・データフレーム用のライブラリーをColab上でインポートします.

#pystanのインストール
import pystan 

# 作図用ライブラリ 
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns

#結果の可視化用ライブラリ
!pip install arviz
import arviz

#データフレーム用のライブラリ
import pandas as pd

これで準備は完了です.arvizはMCMCのアウトプットを可視化する際に必要となるライブラリーですが,これは現状pipしないといけないようです.

#データとstanファイルのアップロード
次にデータとStanファイルをアップロードします.データは松浦さんのギットハブより,data-salary.txtというデータを取得しました.アップロードできていると,以下の画像のようになると思います.
image.png

#データの可視化
ここでは上手くデータがセット出来てるか否かを確認するために,seabornのjointplotで,ヒストグラム付きの散布図をプロットしています.

d = pd.read_csv('data-salary.txt')
df = pd.DataFrame(d)
x = df.iloc[:, 0] #年齢
y = df.iloc[:, 1] #年収
n = len(x) #サンプルサイズの取得
# サンプルデータの可視化
sns.jointplot(x = x, y = y) 

image.png

#Stanファイルのコンパイル
次にreg.stanという名前のStanファイルをコンパイルします.ここが一番時間がかかり,2-3分ほどかかるときもあります.

sm = pystan.StanModel(file = '/content/reg.stan')

正常にコンパイルできると,
image.png
みたいなメッセージが出るはずです.

#推定の実行
次にいよいよベイズ推定を行います.シードの指定,MCMCの回数,バーンインの期間,推定回数を行うかなどを指定し,dictionary形式でStanにデータを渡します.

fit = sm.sampling(
    data = dict(
        N = n,
        Y = y,
        X = x
        ),
    seed = 1234,
    iter = 5000,
    warmup = 1000,
    chains = 4)

推定自体はこの例ですと2秒ほどで終わり,あまり時間はかかりません.

#MCMCのアウトプットの可視化
arviz等を使ってMCMCの結果を可視化します.arviz(fit)で推定したパラメータの事後分布とMCMCのトレースプロットが,chainsで指定した回数分だけプロットされます.またprint(fit)で要約統計量がアウトプットされます

arviz.plot_trace(fit)
print(fit)

image.png

#おわりに
株式会社Nospareでは統計学の様々な分野を専門とする研究者が所属しております.統計アドバイザリーやビジネスデータの分析につきましては株式会社Nospare までお問い合わせください.

株式会社Nospare

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?