├── .gitignore ├── README.md ├── exec ├── 10-1-4-matrix.py ├── 10-1-4.py ├── 10-1-5.py ├── 10-1.py ├── 10-2-1.py ├── 10-2-2.py ├── 10-2-3.py ├── 10-2-4.py ├── 10-3-1.py ├── 10-3-2.py ├── 11-1-2.py ├── 11-1.py ├── 11-2-2.py ├── 11-2.py ├── 11-3.py ├── 11-4.py ├── 11-exec-1.py ├── 11-exec-2.py ├── 11-exec-3.py ├── 11-exec-5.py ├── 11-exec-6.py ├── 12-1-2.py ├── 12-1.py ├── 12-2.py ├── 12-3.py ├── 12-6.py ├── 12-7.py ├── 12-8.py ├── 12-exec-1.py ├── 12-exec-2.py ├── 12-exec-3.py ├── 12-exec-4.py ├── 4-4-stan.py ├── 4-4.py ├── 4-5.py ├── 4-exec.py ├── 5-1.py ├── 5-2.py ├── 5-3-exec-4.py ├── 5-3.py ├── 5-4.py ├── 5-exec-5-6.py ├── 5-exec-5-7.py ├── 6-1-exec.py ├── 6-1.py ├── 7-1.py ├── 7-2-log.py ├── 7-3-aircon.py ├── 7-3-conc.py ├── 7-4.py ├── 7-5.py ├── 7-6.py ├── 7-7.py ├── 7-8.py ├── 7-9.py ├── 8-1-eq.py ├── 8-1-group.py ├── 8-1-hie.py ├── 8-1.py ├── 8-2.py ├── 8-3.py ├── 8-4.py ├── 8-exec-4.py ├── 8-exec-6.py ├── 8-exec-7.py ├── 9-2-1.py ├── 9-2-2.py ├── 9-2-3.py ├── 9-3-1.py ├── 9-3-2.py ├── 9-4-1.py ├── 9-5.py ├── 9-exec-1.py ├── 9-exec-2.py ├── 9-exec-3.py ├── 9-exec-4.py ├── 9-exec-5.py ├── README.md ├── analysis_data.py ├── d1.csv ├── data-2Dmesh-design.txt ├── data-2Dmesh.txt ├── data-50m.txt ├── data-ZIP.txt ├── data-aircon.txt ├── data-attendance-1.txt ├── data-attendance-2.txt ├── data-attendance-3.txt ├── data-attendance-4-1.txt ├── data-attendance-4-2.txt ├── data-attendance-5.txt ├── data-category.txt ├── data-changepoint.txt ├── data-coin.txt ├── data-conc-2-NA-long.txt ├── data-conc-2-NA-wide.txt ├── data-conc-2.txt ├── data-conc.txt ├── data-dice.txt ├── data-kubo11a.txt ├── data-lda.txt ├── data-map-JIS.txt ├── data-map-neighbor.txt ├── data-map-temperature.txt ├── data-mix1.txt ├── data-mix2.txt ├── data-mvn.txt ├── data-outlier.txt ├── data-poisson-binomial.txt ├── data-protein.txt ├── data-rental.txt ├── data-salary-2.txt ├── data-salary-3.txt ├── data-salary.txt ├── data-shogi-player-name.txt ├── data-shogi-player.txt ├── data-ss1.txt ├── data-ss2.txt ├── data-usagitokame.txt ├── data3a.csv ├── data4a.csv ├── data7a.csv ├── data_20131226.txt ├── mcmc_tools.py └── requirements.txt ├── images ├── 12-exec-3-noise-0.1.png ├── 12-exec-3-noise-0.2.png ├── 12-exec-3-noise-0.3.png ├── 12-exec-3-noise-0.4.png ├── 12-exec-3-noise-0.5.png ├── 12-exec-4-noise-0.5-yy-0.1.png ├── 12-exec-4-noise-0.5-yy-0.2.png ├── 12-exec-4-noise-0.5-yy-0.3.png ├── 12-exec-4-noise-0.5-yy-0.4.png ├── 12-exec-4-noise-0.5-yy-0.5.png ├── 12-exec-4-noise-0.5-yy-0.6.png └── 12-exec-4-noise-0.5-yy-0.7.png └── model ├── 4-exec-2.stan ├── 4-exec.stan ├── 5-exec-5-6.stan ├── 5-exec-5-7.stan ├── model-8-exec-4.stan ├── model-8-exec-6.stan ├── model-8-exec-7.stan ├── model-9-exec-1.stan ├── model-9-exec-2.stan ├── model-9-exec-3.stan ├── model-9-exec-4.stan ├── model-9-exec-5.stan ├── model10-1-4.stan ├── model10-1-5.stan ├── model10-14-matrix.stan ├── model10-2-2.stan ├── model10-2-3.stan ├── model10-2-4-b.stan ├── model10-2-4-c.stan ├── model10-2-4.stan ├── model10-3-1-b.stan ├── model10-3-1.stan ├── model10-3-2.stan ├── model11-1-2.stan ├── model11-1-2b.stan ├── model11-1.stan ├── model11-2-2.stan ├── model11-2-2b.stan ├── model11-2.stan ├── model11-3.stan ├── model11-4.stan ├── model11-exec-1.stan ├── model11-exec-2.stan ├── model11-exec-3.stan ├── model11-exec-3b.stan ├── model11-exec-5.stan ├── model11-exec-6.stan ├── model12-1-2.stan ├── model12-1.stan ├── model12-2.stan ├── model12-3-re.stan ├── model12-3.stan ├── model12-6.stan ├── model12-7.stan ├── model12-8.stan ├── model12-exec-2.stan ├── model12-exec-3.stan ├── model12-exec-4.stan ├── model4-4.stan ├── model4-5.stan ├── model5-3.stan ├── model5-4.stan ├── model5-5-exec-4.stan ├── model5-5.stan ├── model5-6.stan ├── model7-1.stan ├── model7-2-log.stan ├── model7-3-aircon.stan ├── model7-3-conc.stan ├── model7-5.stan ├── model7-7.stan ├── model7-8.stan ├── model7-9.stan ├── model8-1-eq.stan ├── model8-1-group.stan ├── model8-1-hie.stan ├── model8-1.stan ├── model8-2-sd.stan ├── model8-2.stan ├── model8-3-log-b.stan ├── model8-3-log.stan ├── model8-3.stan ├── model8-4-org.stan ├── model8-4.stan ├── model9-2-1.stan ├── model9-2-2.stan ├── model9-2-3.stan ├── model9-3-1-vec.stan ├── model9-3-1.stan ├── model9-3-2.stan ├── model9-4-1-b.stan ├── model9-4-1.stan └── model9-5.stan /.gitignore: -------------------------------------------------------------------------------- 1 | *.pkl 2 | *.png 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python-r-stan-bayesian-model-2 2 | 3 | python-r-stan-bayesian-model-2 is a Python implementation of a book about bayeian modeling in Japanese. 4 | 5 | このリポジトリは日本語で書かれたベイジアンモデリングの本をPythonで実装したものです。 6 | 7 | ## Book 8 | 『StanとRでベイズ統計モデリング』 9 | 10 | ## Source 11 | 12 | - exec: python code each chap and requirement library. 13 | - model: modeling file in Stan. 14 | - images: some images about exercises at chap.12. 15 | 16 | # Original R codes by author of the book. 17 | https://github.com/MatsuuraKentaro/RStanBook 18 | 19 | --- 20 | Copyright (c) 2020 Masahiro Imai Released under the MIT license 21 | -------------------------------------------------------------------------------- /exec/10-1-4-matrix.py: -------------------------------------------------------------------------------- 1 | # 多項ロジスティック回帰(識別可能性に関する例) 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | import mcmc_tools 7 | from scipy.stats import norm 8 | from sklearn.linear_model import LinearRegression 9 | import time 10 | 11 | # 商品購買 12 | # Age: 年齢 13 | # Sex: 性別 14 | # Income: 収入 15 | # Y: 購買商品ID 16 | category = pandas.read_csv('data-category.txt') 17 | print(category.head()) 18 | print(category.describe()) 19 | 20 | Y = category['Y'] 21 | X = category[['Age', 'Sex', 'Income']].copy() 22 | 23 | f_age_stand = lambda x: x/100 24 | f_income_stand = lambda x: x/1000 25 | 26 | X['Age'] = X['Age'].map(f_age_stand) 27 | X['Income'] = X['Income'].map(f_income_stand) 28 | 29 | print(X) 30 | 31 | X.insert(0, 'b', 1) 32 | 33 | print(X) 34 | 35 | K = Y.nunique() 36 | N = len(Y) 37 | D = len(X.columns) 38 | 39 | 40 | stan_data = { 41 | 'N': N, 42 | 'K': K, 43 | 'D': D, 44 | 'X': X, 45 | 'Y': Y 46 | } 47 | 48 | # モデリングの工夫 49 | # クラスKのカテゴリカル分布を使う場合、 50 | # 次元がKのベクトルをデータい掛け合わせて線形結合をつくり(同様に次元Kのベクトル)、 51 | # softmax関数への入力とするが、直感的な説明だと各ベクトルの次元の強さだと捉えることができる。 52 | # しかしこのベクトルは空間内で並行移動(原点を移動)させても同じ作用をもつので、 53 | # 識別が不可能になる。 54 | # そのため、あるカテゴリーを選択する強さを定数で固定する。定数ならなんでも良いが、 55 | # 0に固定するのがシンプルでわかりやすい。 56 | # 固定する前は事後確率が安定せずサンプリングがうまく行かないが、固定すると進む。 57 | 58 | # コンパイル 59 | filename = '../model/model10-14-matrix' 60 | start = time.time() 61 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 62 | elapsed_time = time.time() - start 63 | print("elapsed_time:{0}".format(elapsed_time) + "[sec]") 64 | 65 | 66 | -------------------------------------------------------------------------------- /exec/10-1-4.py: -------------------------------------------------------------------------------- 1 | # 多項ロジスティック回帰 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | import mcmc_tools 7 | from scipy.stats import norm 8 | from sklearn.linear_model import LinearRegression 9 | import time 10 | 11 | # 商品購買 12 | # Age: 年齢 13 | # Sex: 性別 14 | # Income: 収入 15 | # Y: 購買商品ID 16 | category = pandas.read_csv('data-category.txt') 17 | print(category.head()) 18 | print(category.describe()) 19 | 20 | # 変数のスケーリングはかなり重要 21 | # スケーリングしないと収束しないパターン。 22 | # ベイズモデリングでは、サンプリングの効率を考えて、できるだけデータを原点周辺にもってくることが大切。 23 | Y = category['Y'] 24 | Age = category['Age']/100 25 | Sex = category['Sex'] 26 | Income = category['Income']/1000 27 | 28 | K = Y.nunique() 29 | N = len(Y) 30 | 31 | stan_data = { 32 | 'N': N, 33 | 'K': K, 34 | 'Age': Age, 35 | 'Sex': Sex, 36 | 'Income': Income, 37 | 'Y': Y 38 | } 39 | 40 | # モデリングの工夫 41 | # クラスKのカテゴリカル分布を使う場合、 42 | # 次元がKのベクトルをデータい掛け合わせて線形結合をつくり(同様に次元Kのベクトル)、 43 | # softmax関数への入力とするが、直感的な説明だと各ベクトルの次元の強さだと捉えることができる。 44 | # しかしこのベクトルは空間内で並行移動(原点を移動)させても同じ作用をもつので、 45 | # 識別が不可能になる。 46 | # そのため、あるカテゴリーを選択する強さを定数で固定する。定数ならなんでも良いが、 47 | # 0に固定するのがシンプルでわかりやすい。 48 | # 固定する前は事後確率が安定せずサンプリングがうまく行かないが、固定すると進む。 49 | 50 | # コンパイル 51 | filename = '../model/model10-1-4' 52 | start = time.time() 53 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 54 | elapsed_time = time.time() - start 55 | print("elapsed_time:{0}".format(elapsed_time) + "[sec]") 56 | 57 | 58 | -------------------------------------------------------------------------------- /exec/10-1-5.py: -------------------------------------------------------------------------------- 1 | # ウサギとカメ(識別可能性に関する例) 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | import mcmc_tools 7 | from scipy.stats import norm 8 | from sklearn.linear_model import LinearRegression 9 | import time 10 | 11 | # usagitokame 12 | # Lower: 1カメ、2ウサギ 13 | # Winner: 1カメ、2ウサギ 14 | usagitokame = pandas.read_csv('data-usagitokame.txt') 15 | print(usagitokame.head()) 16 | print(usagitokame.describe()) 17 | 18 | # モデリング 19 | # ここでは、ウサギとカメの強さをモデリングしてみる。 20 | # それぞれの強さは、各動物の平均と標準偏差からサンプリングされると考える。 21 | # データが少ないため、標準偏差=ばらつき=勝負ごとのムラ をウサギとカメの共通とする。 22 | 23 | # ここでは勝ち負け予想に強さ(Performance)を導入している。 24 | # 少し考え方に慣れるまで繰り返しサンプリングを頭の中でシミレーションしてみたほうが良い。 25 | # performanceは1<2であるので、これはusagitokameのDataFrameをそのままロードしたものと考えられる。 26 | # ここで、performance1が1である場合、データはmu1からサンプリングされる。performance2が1である場合も、 27 | # データはmu1からサンプリングされる。mu1からサンプリングされるデータは勝つことも負けることもあるが、 28 | # usagitokameのDataFrameで示された結果、performance1 10-1-4.py 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /exec/10-2-1.py: -------------------------------------------------------------------------------- 1 | # 弱情報事前分布 2 | # モデルが複雑なのにデータが少ない場合に収束しないことがある。 3 | # 対策としては、シンプルなモデルから徐々に構築していくのが良いが、解析の目的を達成するために 4 | # 複雑なモデルを使用する必要がある場合、パラメータの制約やデータへの制約を与えると良い。 5 | 6 | # 弱情報事前分布の例1 7 | # (-inf, inf) の範囲のパラメータには、分散が非常に大きな正規分布を通常使うが、 8 | # パラメータが[a, b]の範囲に収まっていることがわかっている場合、 9 | # 一様分布だと境界が切断される可能性があるため、平均(a+b)/2、標準偏差(b-a)/2 の正規分布を使うと良いらしい。 10 | 11 | # 弱情報事前分布の例2 12 | # 回帰係数 13 | # 絶対値の大きな回帰係数を回避するため、回帰係数の大きさにペナルティを与える方法がある。 14 | # 深層学習でも大きなパラメータにペナルティを課す正則化があるが、これは正規分布を事前情報分布として考える場合に相当する。 15 | # ベイズモデルでは、Studentのt分布を事前分布として使う方法を推奨している。 16 | 17 | # 弱情報事前分布の例3 18 | # 正の値をもつパラメータ 19 | # 背景知識からは考えられないような大きな値になってしまうような場合、弱情報事前分布を使う。 20 | # ガンマ分布と半t分布の話。0に近いパラメータの場合は半t分布の方が安定する、ということ。 21 | # Stanでの実装はlower=0で完了。 22 | 23 | # 弱情報事前分布の例4 24 | # 階層モデルの事前分布 25 | # 具体例) 10-2-2.py 26 | 27 | # その他の正の事前情報 28 | # 半t分布、半正規分布、指数分布、ガンマ分布 29 | # 具体例) 10-2-3.py 30 | # 将棋のプロ棋士の勝敗データを使って、騎士の強さと勝負ムラを推定する。 31 | # ウサギとカメの応用編かな。 32 | 33 | # 確率など[0, 1]の範囲のパラメータ 34 | # サイコロ、授業の出席、来店などの確率を用いたモデリングでは、 35 | # 一様に等しく事象が起こる確率などは、ディリクレ分布を設定する選択肢もある。 36 | # 選択肢が2つの場合はベータ分布を使う。 37 | # 考え方としては、ベータ分布の多変量版がディリクレ分布ということになる。 38 | 39 | # 分散共分散行列 40 | # 具体例) 10-2-4.py 41 | 42 | -------------------------------------------------------------------------------- /exec/10-2-3.py: -------------------------------------------------------------------------------- 1 | # プロ棋士の強さと勝負ムラ 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | import mcmc_tools 7 | from scipy.stats import norm 8 | from sklearn.linear_model import LinearRegression 9 | import time 10 | 11 | # data-shogi-player 12 | # 166 人、6231 試合 13 | # Lower: 棋士ID(1〜166) 14 | # Winner: 棋士ID(1〜166) 15 | shogi_player = pandas.read_csv('data-shogi-player.txt') 16 | print(shogi_player.head()) 17 | print(shogi_player.describe()) 18 | 19 | LW = shogi_player[['Loser', 'Winner']] 20 | G = len(LW) 21 | 22 | shogi_player_name = pandas.read_table('data-shogi-player-name.txt') 23 | print(shogi_player_name.head()) 24 | print(shogi_player_name.describe()) 25 | 26 | N = shogi_player_name['nid'].nunique() 27 | 28 | stan_data = { 29 | 'G': G, 30 | 'N': N, 31 | 'LW': LW 32 | } 33 | 34 | # モデリング 35 | filename = '../model/model10-2-3' 36 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 37 | mcmc_sample = mcmc_result.extract() 38 | 39 | # ランキングの作成 40 | mu_values = mcmc_sample['mu'].T 41 | mu_median = np.median(mu_values, axis=1) 42 | print(mu_median) 43 | 44 | mu_median_df = pandas.DataFrame(mu_median.T, columns=['performance']) 45 | print(mu_median_df) 46 | 47 | shogi_player_mu_median = pandas.concat([shogi_player_name, mu_median_df], axis=1) 48 | 49 | print(shogi_player_mu_median.nlargest(5, 'performance')) 50 | 51 | # 以下のようなランキングが出力される(performanceで数値化される) 52 | # kid kname nid performance 53 | # 46 175 羽生善治 47 1.862576 54 | # 104 235 渡辺明 105 1.600026 55 | # 133 264 豊島将之 134 1.352212 56 | # 77 208 行方尚史 78 1.301943 57 | # 64 195 郷田真隆 65 1.272320 58 | # また、勝負ムラのパラメータを観察すれば、ムラの小さな棋士と大きな棋士をリスト化することもできる。 -------------------------------------------------------------------------------- /exec/10-2-4.py: -------------------------------------------------------------------------------- 1 | # 階層モデルを似変量正規分布で拡張する例に弱情報事前分布を組み込む 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | import mcmc_tools 7 | from scipy.stats import norm 8 | import random 9 | 10 | # 年収ファイル2 11 | # X: 年齢、実際からマイナス23(新卒の年齢を23とし、所属年数として扱うため) 12 | # Y: 年収 13 | # KID: 勤務している会社のID(1~4)大手4社 14 | 15 | salary2 = pandas.read_csv('data-salary-2.txt') 16 | print(salary2.head()) 17 | print(salary2.describe()) 18 | 19 | # このデータに以下の背景知識を弱情報事前分布として組み込む。 20 | Y = salary2['Y'] 21 | N = len(Y) 22 | 23 | X = salary2['X'] 24 | KID = salary2['KID'] 25 | N_group = salary2['KID'].nunique() 26 | 27 | stan_data = { 28 | 'Y': Y, 29 | 'N': N, 30 | 'X': X, 31 | 'KID': KID, 32 | 'N_group': N_group 33 | } 34 | 35 | # # コンパイル 36 | # filename = 'model10-2-4' 37 | # mcmc_result_b = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 38 | # mcmc_sample = mcmc_result_b.extract() 39 | # 40 | # 41 | # # コンパイル 42 | # # パラメータを再構成して制約を与えたパターン 43 | # # ただし、この方法はパラメータが増えた場合に制約を設定しにくい。 44 | # filename = 'model10-2-4-b' 45 | # mcmc_result_b = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 46 | # mcmc_sample_b = mcmc_result_b.extract() 47 | 48 | # コンパイル 49 | # LKJ相関分布を使う方法 50 | # 知らないと適用が難しいが、変数間の相関を事前分布として設定するのによく使われるとのこと。 51 | filename = '../model/model10-2-4-c' 52 | stan_data_c = { 53 | 'Y': Y, 54 | 'N': N, 55 | 'X': X, 56 | 'KID': KID, 57 | 'N_group': N_group, 58 | 'Nu': 2 59 | } 60 | mcmc_result_c = mcmc_tools.sampling(filename, stan_data_c, n_jobs=4, seed=123) 61 | mcmc_sample_c = mcmc_result_c.extract() 62 | # このモデリングでは、相関行列と分散共分散行列を求める方法も示している。 63 | # a と b の関係を得ることができる。 -------------------------------------------------------------------------------- /exec/10-3-1.py: -------------------------------------------------------------------------------- 1 | # 再パラメータ化 reparameterization 2 | # 目的: サンプリングの効率化 3 | # データのスケーリングもreparameterizationの一種 4 | # 最初は極端な例、"Nealの漏斗"を見てみる。 5 | 6 | import numpy as np 7 | import seaborn as sns 8 | import pandas 9 | import matplotlib.pyplot as plt 10 | import mcmc_tools 11 | import scipy.stats as stats 12 | from scipy.stats import norm 13 | import random 14 | 15 | 16 | # Nealの漏斗 17 | # データが無く、事前分布がそのまま事後分布になる。 18 | # 対数事後分布がいびつだとうまくサンプリングできない、ということの例なのだが、なかなか理解難しいな。 19 | # 対数事後分布の値によってサンプリングするわけなので、影響があるのは理解できる。 20 | # 対策 21 | # 分布からスケールを切り離す。 22 | stan_data = {} 23 | filename = '../model/model10-3-1' 24 | mcmc_result_b = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 25 | mcmc_sample = mcmc_result_b.extract() 26 | 27 | # 2次元メッシュの書き方を復習 28 | X, Y = np.mgrid[-5:6, -5:6] 29 | print(X.shape) 30 | print(X) 31 | print(Y.shape) 32 | print(Y) 33 | 34 | # print(X.ravel()) 35 | pts = np.c_[X.ravel(), Y.ravel()] 36 | # print(pts[:,0]) 37 | 38 | data = X+2*Y 39 | # print(data.shape) 40 | # print(data) 41 | 42 | plt.contourf(X, Y, data) 43 | plt.show() 44 | 45 | # サンプリングの結果を使って2次元メッシュを作成する 46 | xx, yy = np.mgrid[-5:5:30j, -5:5:30j] 47 | x = xx.ravel() 48 | y = yy.ravel() 49 | # メッシュの座標をすべて軸ごとに1つの配列にいれたものを用意 50 | print(x) 51 | # 座標ごとに対数事後確率を計算 52 | lp = np.log(stats.norm.pdf(yy, loc=0, scale=3)) + np.log(stats.norm.pdf(xx, loc=0, scale=np.exp(yy/2))) 53 | lp[lp < -15] = -15 54 | plt.contourf(xx, yy, lp, vmin=-15, vmax=0) 55 | plt.scatter(mcmc_sample['r'][:, 0], mcmc_sample['a'], s=1, c='k') 56 | plt.xlim(-5, 5) 57 | plt.ylim(-5, 5) 58 | plt.show() 59 | plt.close() 60 | 61 | # 再パラメータ化したもの 62 | # これは、もとのパラメータを独立な正規分布からサンプリングして、サンプリング時に計算される 63 | # 対数事後分布の大きさによってサンプリングが偏らないようにできるというもの 64 | filename = '../model/model10-3-1-b' 65 | mcmc_result_b = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 66 | mcmc_sample_b = mcmc_result_b.extract() 67 | 68 | lp = np.log(stats.norm.pdf(yy, loc=0, scale=3)) + np.log(stats.norm.pdf(xx, loc=0, scale=np.exp(yy/2))) 69 | lp[lp < -15] = -15 70 | plt.contourf(xx, yy, lp, vmin=-15, vmax=0) 71 | plt.scatter(mcmc_sample_b['r'][:, 0], mcmc_sample_b['a'], s=1, c='k') 72 | plt.xlim(-5, 5) 73 | plt.ylim(-5, 5) 74 | plt.show() 75 | -------------------------------------------------------------------------------- /exec/10-3-2.py: -------------------------------------------------------------------------------- 1 | # 階層モデルにおける再パラメータ化 2 | # ここでは年収予測階層モデルを再パラメータ化する。 3 | # model8-1-eqのベクトル化 4 | # ここでは、8-1-hieと等価なモデルををパラメータを削減して構築する。 5 | import numpy as np 6 | import seaborn as sns 7 | import pandas 8 | import matplotlib.pyplot as plt 9 | import mcmc_tools 10 | from scipy.stats import norm 11 | import random 12 | 13 | # 年収ファイル2 14 | # X: 年齢、実際からマイナス23(新卒の年齢を23とし、所属年数として扱うため) 15 | # Y: 年収 16 | # KID: 勤務している会社のID(1~4)大手4社 17 | 18 | salary2 = pandas.read_csv('data-salary-2.txt') 19 | print(salary2.head()) 20 | print(salary2.describe()) 21 | 22 | # モデリング 23 | # Yを推定するためのパラメータaとbが、全体平均を平均とした正規分布 24 | Y = salary2['Y'] 25 | X = salary2['X'] 26 | N = len(Y) 27 | N_group = 4 28 | KID = salary2['KID'] 29 | 30 | stan_data = { 31 | 'Y': Y, 32 | 'X': X, 33 | 'N': N, 34 | 'N_group': N_group, 35 | 'KID': KID 36 | } 37 | 38 | # コンパイル 39 | filename = '../model/model10-3-2' 40 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 41 | mcmc_sample = mcmc_result.extract() 42 | # モデルは等価なので、性能的な違いは有意には出ないが、パラメータが少なくなった分、 43 | # サンプリングにかかる時間が短くなる。 44 | # しかし、モデルによっては逆に時間がかかることもあるらしいので注意。 45 | 46 | a_hie = mcmc_sample['a'] 47 | pd_hie = pandas.DataFrame(a_hie) 48 | pd_hie.plot.box() 49 | plt.show() 50 | 51 | 52 | -------------------------------------------------------------------------------- /exec/11-1-2.py: -------------------------------------------------------------------------------- 1 | # ポアソン分布に従う離散パラメータ 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | import mcmc_tools 7 | from scipy.stats import norm 8 | from scipy.stats import binom 9 | import random 10 | 11 | # ポアソン分布に従う枚数だけコインを投げた実験結果 12 | # Y: 表が出たコインの枚数 13 | poisson_binomial = pandas.read_csv('data-poisson-binomial.txt') 14 | print(poisson_binomial.head()) 15 | print(poisson_binomial.describe()) 16 | 17 | # 周辺化の積分範囲を決定するため、二項分布の確率を確認する。 18 | b = binom.pmf(range(40),40,0.5) 19 | plt.plot(range(40), b, 'o') 20 | plt.xlabel('number of head', fontsize=15) 21 | plt.ylabel('probability', fontsize=15) 22 | plt.show() 23 | plt.close() 24 | # 40まで計算すると、10枚程度が表になる確率はとても小さいことがわかる。 25 | 26 | b = binom.pmf(range(20),20,0.5) 27 | plt.plot(range(20), b, 'o') 28 | plt.xlabel('number of head', fontsize=15) 29 | plt.ylabel('probability', fontsize=15) 30 | plt.show() 31 | # 20までにすると、10枚の確率が17.5%と最も高く、9枚もその周辺で10%以上である。 32 | 33 | Y = poisson_binomial['Y'] 34 | N = len(Y) 35 | 36 | stan_data = { 37 | 'Y': Y, 38 | 'N': N 39 | } 40 | 41 | 42 | # コンパイル 43 | filename = '../model/model11-1-2' 44 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 45 | mcmc_sample = mcmc_result.extract() 46 | 47 | # これによってlambdaの平均、中央値、95%信頼区間などを得ることができる。 48 | # しかし、この計算方法は周辺化の計算に大きなコストがかかるため、n=40のような小さい値を覗いて現実液には 49 | # 計算が終わらない可能性が高い。 50 | # その場合、周辺化を簡潔にする公式があるかどうか確認して、あれば使うと良い。 51 | 52 | # コンパイル 53 | filename_b = '../model/model11-1-2b' 54 | mcmc_result_b = mcmc_tools.sampling(filename_b, stan_data, n_jobs=4, seed=123) 55 | mcmc_sample_b = mcmc_result_b.extract() 56 | # ポアソン分布の周辺化は非常にシンプルな式で計算が可能。 -------------------------------------------------------------------------------- /exec/11-1.py: -------------------------------------------------------------------------------- 1 | # 離散値をとるパラメータを使う 2 | # 場合の数を数え上げて、離散パラメータを消去した(周辺化消去)形で対数尤度を表現する 3 | # target記法 4 | # log_sum_exp関数 5 | 6 | # コインのパターン 7 | import numpy as np 8 | import seaborn as sns 9 | import pandas 10 | import matplotlib.pyplot as plt 11 | import mcmc_tools 12 | from scipy.stats import norm 13 | import random 14 | 15 | # 喫煙率調査ファイル 16 | # Y: 0非喫煙、1喫煙 17 | coin = pandas.read_csv('data-coin.txt') 18 | print(coin.head()) 19 | print(coin.describe()) 20 | 21 | Y = coin['Y'] 22 | N = len(Y) 23 | 24 | stan_data = { 25 | 'N': N, 26 | 'Y': Y 27 | } 28 | 29 | # コンパイル 30 | filename = '../model/model11-1' 31 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 32 | mcmc_sample = mcmc_result.extract() 33 | 34 | # mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat 35 | # q 0.21 3.5e-3 0.09 0.03 0.14 0.21 0.26 0.38 649 1.0 36 | # lp__ -69.7 0.04 0.91 -72.44 -69.86 -69.32 -69.13 -69.08 564 1.0 -------------------------------------------------------------------------------- /exec/11-2-2.py: -------------------------------------------------------------------------------- 1 | # K個の正規混合分布 2 | import importlib 3 | from typing import Dict 4 | 5 | # Onw library 6 | import mcmc_tools 7 | 8 | lib = importlib.import_module("11-2") 9 | 10 | 11 | class MembersK(lib.Members): 12 | def create_stan_data(self) -> Dict[str, str]: 13 | Y = self.mix1['Y'] 14 | N = len(Y) 15 | 16 | stan_data = { 17 | 'Y': Y, 18 | 'N': N, 19 | 'K': 5 20 | } 21 | return stan_data 22 | 23 | def fit(self, stan_data: Dict[str, str], init: Dict): 24 | mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123) 25 | mcmc_sample = mcmc_result.extract() 26 | return mcmc_sample 27 | 28 | 29 | if __name__ == '__main__': 30 | m = MembersK('data-mix2.txt', '../model/model11-2-2') 31 | m.describe() 32 | 33 | # いくつかの正規分布が混合していると考えられる 34 | m.hist() 35 | 36 | d = m.create_stan_data() 37 | 38 | # K混合正規分布は 39 | m.fit(d, {}) 40 | 41 | # 同じことを、functionsブロックというstanの関数を独自定義できる機能を使って書き換える 42 | mb = MembersK('data-mix2.txt', '../model/model11-2-2b') 43 | db = mb.create_stan_data() 44 | m.fit(db, {}) 45 | # 同様の結果であることを確認する。 46 | -------------------------------------------------------------------------------- /exec/11-2.py: -------------------------------------------------------------------------------- 1 | # 混合正規分布 2 | # 社員の能力測定の結果を利用 3 | import numpy as np 4 | import seaborn as sns 5 | import pandas 6 | import matplotlib.pyplot as plt 7 | import mcmc_tools 8 | from scipy.stats import norm 9 | from scipy.stats import binom 10 | import random 11 | from typing import Dict 12 | 13 | 14 | class Members(): 15 | def __init__(self, file: str, model_file: str): 16 | self.file = file 17 | self.mix1 = pandas.read_csv(file) 18 | self.model_file = model_file 19 | 20 | def describe(self): 21 | print(self.mix1.head()) 22 | print(self.mix1.describe()) 23 | 24 | def hist(self): 25 | ax = self.mix1.plot.hist(bins=30, alpha=0.5, legend=True) 26 | self.mix1.plot.kde(legend=True, alpha=0.5, secondary_y=True, ax=ax) 27 | plt.show() 28 | 29 | def create_stan_data(self) -> Dict[str, str]: 30 | Y = self.mix1['Y'] 31 | N = len(Y) 32 | 33 | stan_data = { 34 | 'Y': Y, 35 | 'N': N 36 | } 37 | return stan_data 38 | 39 | def fit(self, stan_data: Dict[str, str], init: Dict) -> pandas.DataFrame: 40 | mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123,init=init) 41 | mcmc_sample = mcmc_result.extract() 42 | return mcmc_sample 43 | 44 | 45 | if __name__ == '__main__': 46 | # 社員の能力測定の結果 47 | m = Members('data-mix1.txt', '../model/model11-2') 48 | m.describe() 49 | 50 | # 可視化、混合正規分布であることを確認 51 | m.hist() 52 | 53 | data = m.create_stan_data() 54 | print(data) 55 | 56 | # 混合正規分布など複雑なモデルは初期値を与えないと収束しないことが多い。 57 | # このモデルもそう。 58 | init = lambda: dict( 59 | a=0.5, 60 | mu=(0, 5), 61 | sigma=(1, 1) 62 | ) 63 | m.fit(data, init) 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /exec/11-3.py: -------------------------------------------------------------------------------- 1 | # ゼロ過剰ポアソン分布 2 | from typing import List 3 | 4 | import pandas 5 | import analysis_data as ad 6 | from sklearn.linear_model import LinearRegression 7 | from scipy.stats import spearmanr 8 | import numpy as np 9 | 10 | import mcmc_tools 11 | 12 | 13 | class ZIP(ad.AnalysisData): 14 | def standardize(self): 15 | self.data['Age'] = self.data['Age']/10 16 | 17 | def create_stan_data(self): 18 | Y = self.data['Y'] 19 | N = len(Y) 20 | X = self.data[['Sex', 'Sake', 'Age']].copy() 21 | X.insert(0, 'b', 1) 22 | D = len(X.columns) 23 | 24 | return { 25 | 'Y': Y, 26 | 'N': N, 27 | 'X': X, 28 | 'D': D 29 | } 30 | 31 | def fit(self, stan_data): 32 | mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123) 33 | return mcmc_result.extract() 34 | 35 | 36 | def get_data(self, keys: List): 37 | return self.data[keys] 38 | 39 | 40 | if __name__ == '__main__': 41 | # data-ZIP 42 | # Sex: 0男性、1女性 43 | # Sake: 0酒をない、1酒をのむ 44 | # Age: 年齢 45 | # Y: 来店関数 46 | z = ZIP('data-ZIP.txt', '../model/model11-3') 47 | z.describe() 48 | 49 | # z.observe('Sex') 50 | # 年齢が高いほうが来店回数が多そうだが、全年齢そうに渡って来店していない層がいる。 51 | # 説明する変数がないだろうか? 52 | # 来店回数が多いのは男性の割合が多い。 53 | 54 | # z.observe('Sake') 55 | # 酒を飲まない層が一度も来店しない可能性が高いのではないか?という仮設がもてる。 56 | # 女性のほうが酒を飲まない割合が高い 57 | 58 | # モデリング 59 | # 男性、女性とも年齢層に大きな差はないので、年齢とYには相関がありそう。 60 | # ただし、全年齢層においてYが小さいサンプルが存在するので、 61 | # 酒を飲む飲まないとYにも相関がありそう。 62 | # 男性のほうが酒をのむ割合が高いので、Yも男性が多くなっているという仮設が成り立ち、 63 | # 性別とYの直接の関係は薄いと考える。 64 | 65 | # 最初に重回帰分析を当てはめる 66 | Y = z.get_data(['Y']) 67 | X = z.get_data(['Sex', 'Sake', 'Age']) 68 | 69 | lr = LinearRegression() 70 | lr.fit(X, Y) 71 | 72 | # 順位相関係数 73 | print(pandas.DataFrame({"Name": X.columns, 74 | "Coefficients": lr.coef_[0]})) 75 | 76 | # 解析の目的 77 | # リピーターになりそうな人を知りたい 78 | # 説明変数がリポーターになるかにどれほど影響しているかを知りたい 79 | # 来店客数の分布をみると、0に数字が集中していることと、それ意向は山型の分布 80 | # つまり、2つの分布から生成されていると考える。 81 | # 具体的には、 82 | # とにかく1回足を運んで来店することと、複数回来店することは別の分布だと考える。 83 | # 1回来店する確率: q(ベルヌーイ分布) 84 | # リピーターの来店回数: 平均lambdaのポアソン分布 85 | 86 | # q はロジスティック回帰(線形回帰の確率予測版) 87 | # lambda にはポアソン回帰 88 | 89 | # qとlambdaそれぞれに対して、説明変数と線形結合係数との積を用意する。 90 | data = z.create_stan_data() 91 | 92 | # Ageの標準化なし 93 | ms = z.fit(data) 94 | 95 | # Ageの標準化あり(Ageに関連する項目が10倍の重みで出る) 96 | # z.standardize() 97 | # data_s = z.create_stan_data() 98 | # ms_s = z.fit(data_s) 99 | 100 | # qとlamda順位相関 101 | q = ms['q'] 102 | l = ms['lambda'] 103 | 104 | q_m = np.median(q, axis=0) 105 | l_m = np.median(l, axis=0) 106 | 107 | correlation, pvalue = spearmanr(q_m, l_m) 108 | print(correlation) 109 | print(pvalue) 110 | 111 | # 負の相関があり、p値が十分小さい。 -------------------------------------------------------------------------------- /exec/11-exec-1.py: -------------------------------------------------------------------------------- 1 | # target記法を使った方法に書き直す方法 2 | # model9-2-2.stan 3 | 4 | import numpy as np 5 | import seaborn as sns 6 | import pandas 7 | import matplotlib.pyplot as plt 8 | import mcmc_tools 9 | from scipy.stats import norm 10 | import random 11 | 12 | # 年収ファイル2 13 | # X: 年齢、実際からマイナス23(新卒の年齢を23とし、所属年数として扱うため) 14 | # Y: 年収 15 | # KID: 勤務している会社のID(1~4)大手4社 16 | 17 | salary2 = pandas.read_csv('data-salary-2.txt') 18 | print(salary2.head()) 19 | print(salary2.describe()) 20 | 21 | # モデリング 22 | # Yを推定するためのパラメータaとbが、全体平均を平均とした正規分布 23 | Y = salary2['Y'] 24 | X = salary2['X'] 25 | N = len(Y) 26 | N_group = 4 27 | KID = salary2['KID'] 28 | 29 | stan_data = { 30 | 'Y': Y, 31 | 'X': X, 32 | 'N': N, 33 | 'N_group': N_group, 34 | 'KID': KID 35 | } 36 | 37 | # コンパイル 38 | filename = '../model/model11-exec-1' 39 | # ~からtarget記法に変更 40 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 41 | mcmc_sample = mcmc_result.extract() 42 | # モデルは等価なので、性能的な違いは有意には出ないが、パラメータが少なくなった分、 43 | # サンプリングにかかる時間が短くなる。 44 | # しかし、モデルによっては逆に時間がかかることもあるらしいので注意。 45 | 46 | a_hie = mcmc_sample['a'] 47 | pd_hie = pandas.DataFrame(a_hie) 48 | pd_hie.plot.box() 49 | plt.show() 50 | -------------------------------------------------------------------------------- /exec/11-exec-2.py: -------------------------------------------------------------------------------- 1 | # 離散値をとるパラメータを使う 2 | # data-coin.txtのサンプルを使って、サイコロの目が1になったときに 3 | # 正直に答えたものとする。 4 | 5 | # コインのパターン 6 | import numpy as np 7 | import seaborn as sns 8 | import pandas 9 | import matplotlib.pyplot as plt 10 | import mcmc_tools 11 | from scipy.stats import norm 12 | import random 13 | 14 | # 喫煙率調査ファイル 15 | # Y: 0非喫煙、1喫煙 16 | coin = pandas.read_csv('data-coin.txt') 17 | # 18 | 19 | print(coin.head()) 20 | print(coin.describe()) 21 | 22 | Y = coin['Y'] 23 | N = len(Y) 24 | 25 | stan_data = { 26 | 'N': N, 27 | 'Y': Y 28 | } 29 | 30 | # コンパイル 31 | filename = '../model/model11-exec-2' 32 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 33 | mcmc_sample = mcmc_result.extract() 34 | 35 | # qの中央値と95%信頼区間 36 | # qの平均は0.03(3%) 37 | # 1 %~12 %が95%信頼区間 38 | 39 | -------------------------------------------------------------------------------- /exec/11-exec-3.py: -------------------------------------------------------------------------------- 1 | # 離散値をとるパラメータを使う 2 | # data-coin.txtのサンプルを使って、コインを2枚投げた後とする。 3 | 4 | # コインのパターン 5 | import numpy as np 6 | import seaborn as sns 7 | import pandas 8 | import matplotlib.pyplot as plt 9 | import mcmc_tools 10 | from scipy.stats import norm 11 | import random 12 | 13 | # 喫煙率調査ファイル 14 | # Y: 0非喫煙、1喫煙 15 | coin = pandas.read_csv('data-coin.txt') 16 | # 17 | 18 | print(coin.head()) 19 | print(coin.describe()) 20 | 21 | Y = coin['Y'] 22 | N = len(Y) 23 | 24 | stan_data = { 25 | 'N': N, 26 | 'Y': Y 27 | } 28 | 29 | # コンパイル 30 | # A)3 31 | filename = '../model/model11-exec-3' 32 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 33 | mcmc_sample = mcmc_result.extract() 34 | # qの中央値と95%信頼区間 35 | # qの平均は0.04(4%) 36 | # 1 %~13 %が95%信頼区間 37 | 38 | 39 | filename = '../model/model11-exec-3b' 40 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 41 | mcmc_sample = mcmc_result.extract() 42 | # qの平均は0.13(13%) 43 | # 6%〜33%が95%信頼区間 44 | # p_coinの平均は88% 45 | # 68%~99%が95%信頼区間 -------------------------------------------------------------------------------- /exec/11-exec-5.py: -------------------------------------------------------------------------------- 1 | # 離散値をとるパラメータを使う 2 | # 場合の数を数え上げて、離散パラメータを消去した(周辺化消去)形で対数尤度を表現する 3 | # functionsブロックに変更 4 | 5 | # コインのパターン 6 | import numpy as np 7 | import seaborn as sns 8 | import pandas 9 | import matplotlib.pyplot as plt 10 | import mcmc_tools 11 | from scipy.stats import norm 12 | import random 13 | 14 | # 喫煙率調査ファイル 15 | # Y: 0非喫煙、1喫煙 16 | coin = pandas.read_csv('data-coin.txt') 17 | print(coin.head()) 18 | print(coin.describe()) 19 | 20 | Y = coin['Y'] 21 | N = len(Y) 22 | 23 | stan_data = { 24 | 'N': N, 25 | 'Y': Y 26 | } 27 | 28 | # コンパイル 29 | filename = '../model/model11-exec-5' 30 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 31 | mcmc_sample = mcmc_result.extract() 32 | 33 | # mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat 34 | # q 0.21 3.5e-3 0.09 0.03 0.14 0.21 0.26 0.38 649 1.0 35 | # lp__ -69.7 0.04 0.91 -72.44 -69.86 -69.32 -69.13 -69.08 564 1.0 -------------------------------------------------------------------------------- /exec/12-1-2.py: -------------------------------------------------------------------------------- 1 | # Own Library 2 | import mcmc_tools 3 | import analysis_data as ad 4 | 5 | import seaborn as sns 6 | import matplotlib.pyplot as plt 7 | 8 | 9 | class SPM(ad.AnalysisData): 10 | def observe_ts(self): 11 | sns.lineplot(x=self.data['X'], y=self.data['Y']) 12 | plt.show() 13 | plt.close() 14 | 15 | def create_data(self): 16 | X = self.data['X'] 17 | Y = self.data['Y'] 18 | N = len(Y) 19 | N_pred = 3 20 | 21 | return { 22 | 'X': X, 23 | 'Y': Y, 24 | 'N': N, 25 | 'N_pred': N_pred 26 | } 27 | 28 | def fit(self, stan_data): 29 | mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123) 30 | return mcmc_result.extract() 31 | 32 | def create_figure(self, mcmc_sample): 33 | pred_dates = [i for i in range(len(self.data['Y']) + 3)] 34 | # pred_dates = np.linspace(0, len(self.data['Y']) + 3, 100) 35 | mcmc_tools.plot_ssm(mcmc_sample, pred_dates, '2nd diff local level' 36 | 'model', 'Y', 'mu_pred') 37 | 38 | 39 | if __name__ == '__main__': 40 | spm = SPM('data-ss1.txt', '../model/model12-1-2') 41 | spm.describe() 42 | 43 | spm.observe_ts() 44 | 45 | stan_data = spm.create_data() 46 | mcmc_sample = spm.fit(stan_data) 47 | spm.create_figure(mcmc_sample) 48 | 49 | -------------------------------------------------------------------------------- /exec/12-1.py: -------------------------------------------------------------------------------- 1 | # Own Library 2 | import mcmc_tools 3 | import analysis_data as ad 4 | 5 | import seaborn as sns 6 | import matplotlib.pyplot as plt 7 | import numpy as np 8 | 9 | 10 | class SPM(ad.AnalysisData): 11 | def observe_ts(self): 12 | sns.lineplot(x=self.data['X'], y=self.data['Y']) 13 | plt.show() 14 | plt.close() 15 | 16 | def create_data(self): 17 | X = self.data['X'] 18 | Y = self.data['Y'] 19 | N = len(Y) 20 | N_pred = 3 21 | 22 | return { 23 | 'X': X, 24 | 'Y': Y, 25 | 'N': N, 26 | 'N_pred': N_pred 27 | } 28 | 29 | def fit(self, stan_data): 30 | mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123) 31 | return mcmc_result.extract() 32 | 33 | def create_figure(self, mcmc_sample): 34 | pred_dates = [i for i in range(len(self.data['Y']) + 3)] 35 | # pred_dates = np.linspace(0, len(self.data['Y']) + 3, 100) 36 | mcmc_tools.plot_ssm(mcmc_sample, pred_dates, 'local level ' 37 | 'model', 'Y', 'mu_pred') 38 | 39 | 40 | if __name__ == '__main__': 41 | spm = SPM('data-ss1.txt', '../model/model12-1') 42 | spm.describe() 43 | 44 | spm.observe_ts() 45 | 46 | stan_data = spm.create_data() 47 | mcmc_sample = spm.fit(stan_data) 48 | spm.create_figure(mcmc_sample) 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /exec/12-2.py: -------------------------------------------------------------------------------- 1 | # 時系列予測の問題に季節項を導入する 2 | # 時系列データは、目的変数を観測値の要素の和に分解するのが定石 3 | 4 | # Own Library 5 | import mcmc_tools 6 | import analysis_data as ad 7 | 8 | import seaborn as sns 9 | import matplotlib.pyplot as plt 10 | 11 | 12 | class SPM(ad.AnalysisData): 13 | def observe_ts(self): 14 | sns.lineplot(x=self.data['X'], y=self.data['Y']) 15 | plt.show() 16 | plt.close() 17 | 18 | def create_data(self): 19 | Y = self.data['Y'] 20 | N = len(Y) 21 | N_pred = 4 22 | L = 4 23 | 24 | return { 25 | 'Y': Y, 26 | 'N': N, 27 | 'L': L, 28 | 'N_pred': N_pred 29 | } 30 | 31 | def fit(self, stan_data): 32 | mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123) 33 | return mcmc_result.extract() 34 | 35 | def create_figure(self, mcmc_sample, state: str): 36 | pred_dates = [i for i in range(len(self.data['Y']) + 4)] 37 | # pred_dates = np.linspace(0, len(self.data['Y']) + 3, 100) 38 | mcmc_tools.plot_ssm(mcmc_sample, pred_dates, 'season and trend model' 39 | 'model', 'Y', state) 40 | 41 | 42 | if __name__ == '__main__': 43 | spm = SPM('data-ss2.txt', '../model/model12-2') 44 | spm.describe() 45 | 46 | spm.observe_ts() 47 | 48 | stan_data = spm.create_data() 49 | 50 | mcmc_sample = spm.fit(stan_data) 51 | 52 | # 全体の観測および予測分布 53 | spm.create_figure(mcmc_sample, 'y_mean_pred') 54 | 55 | # 要素ごとに分けて観測および予測分布 56 | spm.create_figure(mcmc_sample, 'mu_pred') 57 | spm.create_figure(mcmc_sample, 'season_pred') 58 | -------------------------------------------------------------------------------- /exec/12-3.py: -------------------------------------------------------------------------------- 1 | # 時系列データにおける変化点検出 2 | 3 | # Own Library 4 | import mcmc_tools 5 | import analysis_data as ad 6 | 7 | import seaborn as sns 8 | import matplotlib.pyplot as plt 9 | 10 | 11 | class DetectChangePoint(ad.AnalysisData): 12 | def observe_ts(self): 13 | sns.lineplot(x=self.data['X'], y=self.data['Y']) 14 | plt.show() 15 | plt.close() 16 | 17 | def create_data(self): 18 | Y = self.data['Y'] 19 | N = len(Y) 20 | return { 21 | 'Y': Y, 22 | 'N': N 23 | } 24 | 25 | def fit(self, stan_data): 26 | mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123) 27 | return mcmc_result.extract() 28 | 29 | def create_figure(self, mcmc_sample, state: str): 30 | # pred_dates = [i for i in range(len(self.data['Y']) + 4)] 31 | pred_dates = [i for i in range(len(self.data['Y']))] 32 | mcmc_tools.plot_ssm(mcmc_sample, pred_dates, 'detection about changing point' 33 | 'model', 'Y', state) 34 | 35 | 36 | if __name__ == '__main__': 37 | # dcp = DetectChangePoint('data-changepoint.txt', 'model12-3') 38 | # dcp.describe() 39 | # dcp.observe_ts() 40 | # stan_data = dcp.create_data() 41 | # mcmc = dcp.fit(stan_data) 42 | # dcp.create_figure(mcmc, 'mu') 43 | 44 | # このままだと、収束がうまくいかずに、 45 | # 再パラメータ化を勧めるWarningが出てくる。 46 | # WARNING:pystan:E-BFMI below 0.2 indicates you may need to reparameterize your model 47 | # そのため、以下のURLを参考に再パラメータ化を行う。 48 | # https://mc-stan.org/docs/2_18/stan-users-guide/reparameterization-section.html 49 | # 収束しないと出てくるが以外と収束してしまっている、、、 50 | 51 | # 再パラメータ化 52 | dcp_r = DetectChangePoint('data-changepoint.txt', '../model/model12-3-re') 53 | dcp_r.describe() 54 | dcp_r.observe_ts() 55 | stan_data = dcp_r.create_data() 56 | mcmc_r = dcp_r.fit(stan_data) 57 | dcp_r.create_figure(mcmc_r, 'beta') 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /exec/12-6.py: -------------------------------------------------------------------------------- 1 | # 状態空間モデルとマルコフ場モデルは等価である 2 | # 直感的な説明は非常にわかりやすい 3 | # Own Library 4 | import mcmc_tools 5 | import analysis_data as ad 6 | 7 | import seaborn as sns 8 | import matplotlib.pyplot as plt 9 | 10 | 11 | class Markov(ad.AnalysisData): 12 | def observe_ts(self): 13 | sns.lineplot(x=[i for i in range(len(self.data['Y']))], y=self.data['Y']) 14 | plt.show() 15 | plt.close() 16 | 17 | def create_data(self): 18 | Y = self.data['Y'] 19 | I = len(Y) 20 | return { 21 | 'Y': Y, 22 | 'I': I 23 | } 24 | 25 | def fit(self, stan_data): 26 | mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123) 27 | return mcmc_result.extract() 28 | 29 | def create_figure(self, mcmc_sample, state: str): 30 | # pred_dates = [i for i in range(len(self.data['Y']) + 4)] 31 | pred_dates = [i for i in range(len(self.data['Y']))] 32 | mcmc_tools.plot_ssm(mcmc_sample, pred_dates, 'markov model', 'Y', state) 33 | 34 | 35 | if __name__ == '__main__': 36 | m = Markov('data-kubo11a.txt', '../model/model12-6') 37 | m.describe() 38 | m.observe_ts() 39 | 40 | stan_data = m.create_data() 41 | mcmc_sample = m.fit(stan_data) 42 | 43 | m.create_figure(mcmc_sample, 'Y_mean') -------------------------------------------------------------------------------- /exec/12-7.py: -------------------------------------------------------------------------------- 1 | # 2次元格子状のマルコフ確率場モデル 2 | 3 | # Own Library 4 | import mcmc_tools 5 | import analysis_data as ad 6 | 7 | import pandas 8 | import seaborn as sns 9 | import matplotlib.pyplot as plt 10 | from mpl_toolkits.mplot3d import Axes3D 11 | 12 | import numpy as np 13 | 14 | 15 | class Markov2Dim(ad.AnalysisData2Dim): 16 | def observe_mesh(self): 17 | plt.matshow(self.data) 18 | plt.colorbar(fraction=0.025, pad=0.05) 19 | plt.xlabel('Plate Column') 20 | plt.ylabel('Plate Row') 21 | plt.show() 22 | plt.close() 23 | 24 | def create_data(self): 25 | I = len(self.data) 26 | J = len(self.data.columns) 27 | 28 | Y = self.data 29 | T = self.process.max().max() 30 | TID = self.process 31 | 32 | return { 33 | 'I': I, 34 | 'J': J, 35 | 'Y': Y, 36 | 'T': T, 37 | 'TID': TID 38 | } 39 | 40 | def fit(self, stan_data): 41 | mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=1234, iter=5200, warmup=200) 42 | return mcmc_result.extract() 43 | 44 | def create_figure(self, mcmc_sample): 45 | I = len(self.data) 46 | J = len(self.data.columns) 47 | X, Y = np.mgrid[0:I, 0:J] 48 | ax = Axes3D(plt.figure(), elev=60) 49 | 50 | # extracting z value 51 | r = mcmc_sample['r'] 52 | r_median = np.median(r, axis=0) 53 | 54 | ax.plot_wireframe(X, Y, r_median) 55 | plt.setp(ax, xlabel='Plate Row', ylabel='Plate Column', zlabel='r') 56 | plt.show() 57 | 58 | def observe_diff_mean(self, mcmc_sample): 59 | d = self.data.values 60 | TID = self.process.values 61 | mean_Y = [d[TID == t + 1].mean() - d.mean() for t in range(self.process.max().max())] 62 | 63 | quantile = [2.5, 50, 97.5] 64 | colname = ['p0025', 'p0500', 'p0975'] 65 | beta = pandas.DataFrame(np.percentile(mcmc_sample['beta'], q=quantile, axis=0).T, 66 | columns=colname) 67 | beta['x'] = mean_Y 68 | plt.plot([-5.0, 5.0], [-5.0, 5.0], 'k--', alpha=0.7) 69 | plt.errorbar(beta.x, beta.p0500, yerr=[beta.p0500 - beta.p0025, beta.p0975 - beta.p0500], 70 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='green', capsize=3) 71 | ax = plt.axes() 72 | ax.set_aspect('equal') 73 | plt.setp(ax, xlabel='Mean of Y[TID]', ylabel='beat[t]') 74 | plt.show() 75 | 76 | 77 | if __name__ == '__main__': 78 | m = Markov2Dim('data-2Dmesh.txt', 'data-2Dmesh-design.txt', '../model/model12-7') 79 | m.describe() 80 | m.observe_mesh() 81 | 82 | # モデリング 83 | stan_data = m.create_data() 84 | mcmc_sample = m.fit(stan_data) 85 | 86 | m.create_figure(mcmc_sample) 87 | m.observe_diff_mean(mcmc_sample) -------------------------------------------------------------------------------- /exec/12-exec-1.py: -------------------------------------------------------------------------------- 1 | # 時系列モデルのシュミレーション 2 | import numpy as np 3 | import pandas 4 | import matplotlib.pyplot as plt 5 | 6 | 7 | def simurate(T:int, sigma_mu, sigma_y): 8 | value = np.zeros(T) 9 | mu = np.zeros(T) 10 | mu[0] = value[0] 11 | for i in range(1, T): 12 | mu[i] = np.random.normal(mu[i-1], sigma_mu) 13 | value[i] = np.random.normal(mu[i], sigma_y) 14 | df = pandas.DataFrame(value, columns=['y']) 15 | df.plot() 16 | plt.show() 17 | 18 | 19 | if __name__ == '__main__': 20 | T = 1000 21 | # 前後の時刻との変化が多いが、全体のトレンドは似ている 22 | simurate(T, 0.1, 2.0) 23 | # 前後の時刻との変化は小さいが、全体のご連弩は大きく変化する 24 | simurate(T, 2.0, 0.1) 25 | -------------------------------------------------------------------------------- /exec/12-exec-2.py: -------------------------------------------------------------------------------- 1 | # 時系列予測の予測期間を 8 に増やす 2 | # 時系列予測の問題に季節項を導入する 3 | # 時系列データは、目的変数を観測値の要素の和に分解するのが定石 4 | 5 | # Own Library 6 | import mcmc_tools 7 | import analysis_data as ad 8 | 9 | import seaborn as sns 10 | import matplotlib.pyplot as plt 11 | 12 | 13 | class SPM(ad.AnalysisData): 14 | def observe_ts(self): 15 | sns.lineplot(x=self.data['X'], y=self.data['Y']) 16 | plt.show() 17 | plt.close() 18 | 19 | def create_data(self): 20 | Y = self.data['Y'] 21 | N = len(Y) 22 | N_pred = 8 23 | L = 8 24 | 25 | return { 26 | 'Y': Y, 27 | 'N': N, 28 | 'L': L, 29 | 'N_pred': N_pred 30 | } 31 | 32 | def fit(self, stan_data): 33 | mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123) 34 | return mcmc_result.extract() 35 | 36 | def create_figure(self, mcmc_sample, state: str): 37 | pred_dates = [i for i in range(len(self.data['Y']) + 8)] 38 | # pred_dates = np.linspace(0, len(self.data['Y']) + 3, 100) 39 | mcmc_tools.plot_ssm(mcmc_sample, pred_dates, 'season and trend model (L=8)' 40 | 'model', 'Y', state) 41 | 42 | 43 | if __name__ == '__main__': 44 | spm = SPM('data-ss2.txt', '../model/model12-exec-2') 45 | spm.describe() 46 | 47 | spm.observe_ts() 48 | 49 | stan_data = spm.create_data() 50 | 51 | mcmc_sample = spm.fit(stan_data) 52 | 53 | # 全体の観測および予測分布 54 | spm.create_figure(mcmc_sample, 'y_mean_pred') 55 | 56 | # 要素ごとに分けて観測および予測分布 57 | spm.create_figure(mcmc_sample, 'mu_pred') 58 | spm.create_figure(mcmc_sample, 'season_pred') 59 | -------------------------------------------------------------------------------- /exec/4-4-stan.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import mcmc_tools 5 | import matplotlib.pyplot as plt 6 | 7 | # ファイルの読み込み 8 | salary = pandas.read_csv('data-salary.txt') 9 | 10 | sample_size = len(salary['X']) 11 | Y = salary['Y'] 12 | X = salary['X'] 13 | 14 | age_range = np.arange(23, 61, 1) 15 | 16 | # データの先頭5行の確認 17 | stan_data = { 18 | 'N': sample_size, 19 | 'X': X, 20 | 'Y': Y, 21 | 'N_new': len(age_range), 22 | 'X_new': age_range 23 | } 24 | 25 | filename = '../model/model4-4' 26 | 27 | # 予測含んだサンプリング 28 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 29 | 30 | 31 | df = pandas.DataFrame(mcmc_result['y_new']) 32 | 33 | print(df) 34 | 35 | df.columns = age_range 36 | 37 | qua = [0.025, 0.25, 0.50, 0.75, 0.975] 38 | d_est = pandas.DataFrame() 39 | 40 | for i in np.arange(len(df.columns)): 41 | for qu in qua: 42 | d_est[qu] = df.quantile(qu) 43 | 44 | 45 | print(d_est) 46 | 47 | x = d_est.index 48 | y1 = d_est[0.025].values 49 | y2 = d_est[0.25].values 50 | y3 = d_est[0.5].values 51 | y4 = d_est[0.75].values 52 | y5 = d_est[0.975].values 53 | 54 | plt.fill_between(x,y1,y5,facecolor='blue',alpha=0.1) 55 | plt.fill_between(x,y2,y4,facecolor='blue',alpha=0.5) 56 | plt.plot(x,y3,'k-') 57 | plt.scatter(salary["X"],salary["Y"],c='b') 58 | plt.show() 59 | -------------------------------------------------------------------------------- /exec/4-4.py: -------------------------------------------------------------------------------- 1 | import seaborn as sns 2 | import pandas 3 | from sklearn.linear_model import LinearRegression 4 | import matplotlib.pyplot as plt 5 | 6 | # ファイルの読み込み 7 | salary = pandas.read_csv('data-salary.txt') 8 | 9 | # データの先頭5行の確認 10 | print(salary.head()) 11 | 12 | # データのサマリを確認 13 | print(salary.describe()) 14 | 15 | # データの図示 16 | sns.scatterplot( 17 | x='X', 18 | y='Y', 19 | data=salary 20 | ) 21 | plt.show() 22 | 23 | # 単回帰 Seaborn 24 | sns.lmplot("X","Y",salary) 25 | plt.show() 26 | 27 | # 単回帰 sklearn 28 | x = salary[['X']] 29 | y = salary[['Y']] 30 | model_lr = LinearRegression() 31 | model_lr.fit(x, y) 32 | 33 | # 係数 34 | print(model_lr.coef_) 35 | # 切片 36 | print(model_lr.intercept_) 37 | # 決定係数 38 | print(model_lr.score(x, y)) 39 | 40 | -------------------------------------------------------------------------------- /exec/4-5.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import mcmc_tools 5 | import matplotlib.pyplot as plt 6 | 7 | # ファイルの読み込み 8 | salary = pandas.read_csv('data-salary.txt') 9 | 10 | sample_size = len(salary['X']) 11 | Y = salary['Y'] 12 | X = salary['X'] 13 | 14 | # データの先頭5行の確認 15 | stan_data = { 16 | 'N': sample_size, 17 | 'X': X, 18 | 'Y': Y 19 | } 20 | 21 | filename = '../model/model4-5' 22 | 23 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 24 | 25 | # サンプリングデータの散布図 26 | d_mcmc = pandas.DataFrame({'Intercept': mcmc_result['Intercept'], 27 | 'b': mcmc_result['b'], 28 | 'sigma': mcmc_result['sigma']}) 29 | 30 | print(d_mcmc.head()) 31 | 32 | sns.jointplot("Intercept", "b", data=d_mcmc, kind="reg", color="m", height=7) 33 | plt.show() 34 | 35 | # 50歳の予測分布のサンプリング 36 | age = 50 37 | mean = mcmc_result['Intercept'].mean() + mcmc_result['b'].mean() * age 38 | print(mean) 39 | print(mcmc_result['sigma'].mean()) 40 | y50 = np.random.normal(loc=mean, scale=mcmc_result['sigma'].mean(),size=len(mcmc_result['lp__'])) 41 | 42 | # 23~60歳の予測分布のサンプリングと図示 43 | age_range = np.arange(23, 61, 1) 44 | predictions = [] 45 | for i in age_range: 46 | mean = mcmc_result['Intercept'].mean() + mcmc_result['b'].mean() * i 47 | y = np.random.normal(loc=mean, scale=mcmc_result['sigma'].mean(), size=len(mcmc_result['lp__'])) 48 | predictions.append(y) 49 | 50 | df = pandas.DataFrame(np.array(predictions).T) 51 | 52 | print(df) 53 | 54 | df.columns = age_range 55 | 56 | qua = [0.025, 0.25, 0.50, 0.75, 0.975] 57 | d_est = pandas.DataFrame() 58 | 59 | for i in np.arange(len(df.columns)): 60 | for qu in qua: 61 | d_est[qu] = df.quantile(qu) 62 | 63 | 64 | print(d_est) 65 | 66 | x = d_est.index 67 | y1 = d_est[0.025].values 68 | y2 = d_est[0.25].values 69 | y3 = d_est[0.5].values 70 | y4 = d_est[0.75].values 71 | y5 = d_est[0.975].values 72 | 73 | plt.fill_between(x,y1,y5,facecolor='blue',alpha=0.1) 74 | plt.fill_between(x,y2,y4,facecolor='blue',alpha=0.5) 75 | plt.plot(x,y3,'k-') 76 | plt.scatter(salary["X"],salary["Y"],c='b') 77 | plt.show() 78 | -------------------------------------------------------------------------------- /exec/4-exec.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | 4 | sys.path.append(os.path.join(os.path.dirname(__file__), '.')) 5 | 6 | import numpy as np 7 | import pystan 8 | import pandas 9 | import pickle 10 | import seaborn as sns 11 | import matplotlib.pyplot as plt 12 | import mcmc_tools 13 | 14 | np.random.seed(seed=1234) 15 | 16 | n1 = 30 17 | n2 = 20 18 | 19 | y1 = np.random.normal(loc=0.0, scale=5.0, size=n1) 20 | y2 = np.random.normal(loc=1.0, scale=4.0, size=n2) 21 | 22 | label = [] 23 | data = [] 24 | for y1_elem in y1: 25 | label.append('Y1') 26 | data.append(y1_elem) 27 | for y2_elem in y2: 28 | label.append('Y2') 29 | data.append(y2_elem) 30 | 31 | df = pandas.DataFrame({'label': label, 'y': data}) 32 | print(df.head()) 33 | 34 | # (1) 35 | sns.violinplot(x='label', y='y', data=df) 36 | plt.show() 37 | 38 | stan_data = { 39 | 'y1_N': n1, 40 | 'y2_N': n2, 41 | 'y1': y1, 42 | 'y2': y2 43 | } 44 | 45 | filename = '../model/4-exec' 46 | 47 | # (2), (3) 48 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 49 | 50 | # (4) 51 | df = pandas.DataFrame({'mu1': mcmc_result['mu1'], 'mu2': mcmc_result['mu2']}) 52 | print(df.head()) 53 | 54 | df_lower_mu2 = df.query('mu1 < mu2') 55 | 56 | prob_lower_mu2 = len(df_lower_mu2)/len(df) 57 | 58 | print(prob_lower_mu2) 59 | 60 | # (5) 61 | filename_2 = '../model/4-exec-2' 62 | mcmc_result = mcmc_tools.sampling(filename_2, stan_data, n_jobs=4) 63 | 64 | df = pandas.DataFrame({'mu1': mcmc_result['mu1'], 'mu2': mcmc_result['mu2']}) 65 | print(df) 66 | 67 | df_lower_mu2 = df.query('mu1 < mu2') 68 | print(df_lower_mu2) 69 | 70 | prob_lower_mu2 = len(df_lower_mu2)/len(df) 71 | 72 | print(prob_lower_mu2) -------------------------------------------------------------------------------- /exec/5-2.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import mcmc_tools 5 | import matplotlib.pyplot as plt 6 | from scipy.stats import norm 7 | 8 | # ファイルの読み込み 9 | # PersonID: 学生のID 10 | # M: 3ヶ月間ヶ月間における履修登録した科目の総授業回数 11 | # Y: Mのうち出席した授業回数 12 | attendance_2 = pandas.read_csv('data-attendance-2.txt') 13 | print(attendance_2.head()) 14 | print(attendance_2.describe()) 15 | 16 | # ratio = Y/M (出席率)を追加 17 | attendance_2['ratio'] = attendance_2.apply(lambda x: x['Y']/x['M'], axis=1) 18 | # 確認 19 | print(attendance_2.head()) 20 | 21 | # データ観察作業として散布部行列の確認のため、ペアプロットの表示 22 | sns.pairplot(attendance_2, hue="A", diag_kind='hist', vars=['A', 'Score', 'M', 'Y', 'ratio']) 23 | plt.show() 24 | 25 | # 変数が1を超えてほしくない場合、ロジスティック関数を使って回帰を行う(直接正規分布を推定しない) 26 | # 1、0のどちらか(ここでは出席、非出席)をとる試行を複数回行った分布は、二項分布を使うと良い。 27 | # ここでは、出席確率をAとScoreの2つの要素から推定する。確率を推定するので、ロジスティック関数を使って推定値qを求める。 28 | # qと授業回数Mを使って、出席した授業回数Yを二項分布に従うものとして推定する。 29 | 30 | # データ準備 31 | # スケーリング 32 | Score = attendance_2['Score']/200 33 | 34 | Y = attendance_2['Y'] 35 | A = attendance_2['A'] 36 | M = attendance_2['M'] 37 | N = len(Y) 38 | 39 | 40 | stan_data = { 41 | 'N': N, 42 | 'Score': Score, 43 | 'A': A, 44 | 'Y': Y, 45 | 'M': M 46 | } 47 | 48 | # モデルのコンパイル 49 | filename = '../model/model5-4' 50 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 51 | 52 | # 実測値と予測値のプロット 53 | quantile = [10, 50, 90] 54 | colname = ['p' + str(x) for x in quantile] 55 | print(np.percentile(mcmc_result['y_pred'], q=quantile, axis=0)) 56 | attendance_2_pred = pandas.DataFrame(np.percentile(mcmc_result['y_pred'], q=quantile, axis=0).T, columns=colname) 57 | d = pandas.concat([attendance_2, attendance_2_pred], axis=1) 58 | d0 = d.query('A==0') 59 | d1 = d.query('A==1') 60 | 61 | plt.plot([0,0.5], [0,0.5], 'k--', alpha=0.7) 62 | plt.errorbar(d0.Y, d0.p50, yerr=[d0.p50 - d0.p10, d0.p90 - d0.p50], 63 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3) 64 | plt.errorbar(d1.Y, d1.p50, yerr=[d1.p50 - d1.p10, d1.p90 - d1.p50], 65 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='^', mfc='green', capsize=3) 66 | ax = plt.axes() 67 | ax.set_aspect('equal') 68 | plt.show() -------------------------------------------------------------------------------- /exec/5-3-exec-4.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import mcmc_tools 5 | import matplotlib.pyplot as plt 6 | from sklearn.metrics import roc_curve 7 | from sklearn.metrics import auc 8 | 9 | 10 | # ファイルの読み込み 11 | # PersonID: 学生のID 12 | # A: アルバイトが好きかどうか0:好きでない、1:好き 13 | # Score: 学問への興味を数値化したもの 14 | # Weather: 天気(A:晴れ、B:曇り、C:雨) 15 | # Y: 授業に出席したかどうか0:欠席、1:出席 16 | attendance_3 = pandas.read_csv('data-attendance-3.txt') 17 | print(attendance_3.head()) 18 | print(attendance_3.describe()) 19 | 20 | # 解析の目的 21 | # A, Score, Weather を使って、応答変数Yをどのくらい予測できるか 22 | 23 | # 2値、カテゴリカル変数が多い場合、散布図ではなく集計でデータを観察すると良い 24 | print(pandas.crosstab(index=attendance_3['Weather'],columns=attendance_3['Y'])) 25 | 26 | # 練習問題5(3) 27 | print(pandas.crosstab(index=attendance_3['A'],columns=attendance_3['Y'])) 28 | 29 | 30 | # 背景知識を使った変換を実施 31 | # カテゴリカル変数を数値に置き換える際、各カテゴリの応答変数に関する影響度を背景知識として使う方法がある 32 | # ここでは、A、B、Cをそれぞれ0、0.2、1の影響度をもつ変数として変換する。 33 | # 変換用辞書 34 | 35 | # ここでは練習問題5(4)の前提に従い、各天気における事前知識がないものとする、 36 | # この場合は、各カテゴリカル変数をインデックスにおきかえ、インデックスごとにパラメータを用意する 37 | # Stanのインデックスは1からなので、1、2、3を使う 38 | # これは実質的に、ダミー変数を使った場合と同等になる 39 | # 練習問題5(4) 40 | # インデックスを使うとサンプリングの時間が伸びる 41 | # attendance_3_dm = pandas.get_dummies(attendance_3) 42 | # print(attendance_3_dm.head()) 43 | # 変換用辞書 44 | weather_effec = { 45 | 'A': 1, 46 | 'B': 2, 47 | 'C': 3 48 | } 49 | 50 | attendance_3_re = attendance_3.replace(weather_effec) 51 | print(attendance_3_re.head()) 52 | 53 | # 0、1の2値の出現確率を推定したい場合、ベルヌーイ分布を使う 54 | # ここでは、A、Score、WeatherからYを推定する。A、Score、Weatherは出席確率としてロジスティック関数を使って推定し、 55 | # 推定した値qを使って、Yをベルヌーイ分布に従うものとして計算する。 56 | Score = attendance_3_re['Score']/200 57 | 58 | Y = attendance_3_re['Y'] 59 | A = attendance_3_re['A'] 60 | Weather = attendance_3_re['Weather'] 61 | N = len(Y) 62 | 63 | stan_data = { 64 | 'N': N, 65 | 'Score': Score, 66 | 'A': A, 67 | 'Y': Y, 68 | 'Weather': Weather 69 | } 70 | 71 | # コンパイル 72 | filename = '../model/model5-5-exec-4' 73 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 74 | mcmc_sample = mcmc_result.extract() 75 | # この統計モデルは、ポアソン関数を指数関数を挟んだあとに使っているが、同時に使えるpoisson_logがあり、 76 | # 実はそちらのほうが推奨。今回は説明変数のインデックス手法による違いのみ比較したかったので変更せず。 77 | 78 | # 取得データの行列を確認 79 | # print(mcmc_sample['q'].shape) 80 | # print(mcmc_sample['q'].T.shape) 81 | 82 | q_sample = mcmc_sample['q'].T 83 | 84 | # 各qの中央値を取得 85 | q_median = [] 86 | for i in range(N): 87 | q_median.append(np.median(q_sample[i])) 88 | 89 | # サンプリングしたqと応答変数の関係を確認 90 | # 書籍とは転地した状態の図を描くほうがPythonでは簡単 91 | # Y0が欠席、Y1が出席なので、qが小さいほどY0、大きいほどY1に振れていれば良い推定といえる。 92 | # 今回はデータが振れていないので良い推定とはいえない。 93 | plot_df = pandas.DataFrame({ 94 | 'Y': Y, 95 | 'A': A, 96 | 'q': q_median 97 | }) 98 | sns.violinplot(x='Y', y='q', hue='A', data=plot_df) 99 | plt.show() 100 | 101 | # ROC曲線を確認 102 | # PythonでROC曲線をえがく場合はskleranが便利 103 | # ROC曲線をプロット 104 | fpr, tpr, thresholds = roc_curve(Y, q_median) 105 | 106 | # AUC(ROC曲線の面積)を求めるのもsklearnが便利 107 | auc = auc(fpr, tpr) 108 | 109 | # 練習問題5(4)でもaucは0.62なので事前知識を導入した場合と変わらずの結果である。 110 | plt.plot(fpr, tpr, label='ROC curve (area = %.2f)'%auc) 111 | plt.legend() 112 | plt.title('ROC curve') 113 | plt.xlabel('False Positive Rate') 114 | plt.ylabel('True Positive Rate') 115 | plt.grid(True) 116 | plt.show() -------------------------------------------------------------------------------- /exec/5-3.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import mcmc_tools 5 | import matplotlib.pyplot as plt 6 | from sklearn.metrics import roc_curve 7 | from sklearn.metrics import auc 8 | 9 | 10 | # ファイルの読み込み 11 | # PersonID: 学生のID 12 | # A: アルバイトが好きかどうか0:好きでない、1:好き 13 | # Score: 学問への興味を数値化したもの 14 | # Weather: 天気(A:晴れ、B:曇り、C:雨) 15 | # Y: 授業に出席したかどうか0:欠席、1:出席 16 | attendance_3 = pandas.read_csv('data-attendance-3.txt') 17 | print(attendance_3.head()) 18 | print(attendance_3.describe()) 19 | 20 | # 解析の目的 21 | # A, Score, Weather を使って、応答変数Yをどのくらい予測できるか 22 | 23 | # 2値、カテゴリカル変数が多い場合、散布図ではなく集計でデータを観察すると良い 24 | print(pandas.crosstab(index=attendance_3['Weather'],columns=attendance_3['Y'])) 25 | 26 | # 練習問題5(3) 27 | print(pandas.crosstab(index=attendance_3['A'],columns=attendance_3['Y'])) 28 | 29 | 30 | # 背景知識を使った変換を実施 31 | # カテゴリカル変数を数値に置き換える際、各カテゴリの応答変数に関する影響度を背景知識として使う方法がある 32 | # ここでは、A、B、Cをそれぞれ0、0.2、1の影響度をもつ変数として変換する。 33 | # 変換用辞書 34 | weather_effec = { 35 | 'A': 0, 36 | 'B': 0.2, 37 | 'C': 1 38 | } 39 | 40 | attendance_3_re = attendance_3.replace(weather_effec) 41 | print(attendance_3_re.head()) 42 | 43 | # 0、1の2値の出現確率を推定したい場合、ベルヌーイ分布を使う 44 | # ここでは、A、Score、WeatherからYを推定する。A、Score、Weatherは出席確率としてロジスティック関数を使って推定し、 45 | # 推定した値qを使って、Yをベルヌーイ分布に従うものとして計算する。 46 | Score = attendance_3_re['Score']/200 47 | 48 | Y = attendance_3_re['Y'] 49 | A = attendance_3_re['A'] 50 | Weather = attendance_3_re['Weather'] 51 | N = len(Y) 52 | 53 | stan_data = { 54 | 'N': N, 55 | 'Score': Score, 56 | 'A': A, 57 | 'Y': Y, 58 | 'Weather': Weather 59 | } 60 | 61 | # コンパイル 62 | filename = '../model/model5-5' 63 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 64 | mcmc_sample = mcmc_result.extract() 65 | 66 | # 取得データの行列を確認 67 | # print(mcmc_sample['q'].shape) 68 | # print(mcmc_sample['q'].T.shape) 69 | 70 | q_sample = mcmc_sample['q'].T 71 | 72 | # 各qの中央値を取得 73 | q_median = [] 74 | for i in range(N): 75 | q_median.append(np.median(q_sample[i])) 76 | 77 | # サンプリングしたqと応答変数の関係を確認 78 | # 書籍とは転地した状態の図を描くほうがPythonでは簡単 79 | # Y0が欠席、Y1が出席なので、qが小さいほどY0、大きいほどY1に振れていれば良い推定といえる。 80 | # 今回はデータが振れていないので良い推定とはいえない。 81 | plot_df = pandas.DataFrame({ 82 | 'Y': Y, 83 | 'A': A, 84 | 'q': q_median 85 | }) 86 | sns.violinplot(x='Y', y='q', hue='A', data=plot_df) 87 | plt.show() 88 | 89 | # ROC曲線を確認 90 | # PythonでROC曲線をえがく場合はskleranが便利 91 | # ROC曲線をプロット 92 | fpr, tpr, thresholds = roc_curve(Y, q_median) 93 | 94 | # AUC(ROC曲線の面積)を求めるのもsklearnが便利 95 | auc = auc(fpr, tpr) 96 | 97 | # 書籍では閾値を0.6としているがsklearnでは最適な閾値を求める 98 | # 今回の分類器では、AUCが0.62なので、結果は良くない。 99 | plt.plot(fpr, tpr, label='ROC curve (area = %.2f)'%auc) 100 | plt.legend() 101 | plt.title('ROC curve') 102 | plt.xlabel('False Positive Rate') 103 | plt.ylabel('True Positive Rate') 104 | plt.grid(True) 105 | plt.show() -------------------------------------------------------------------------------- /exec/5-4.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import mcmc_tools 5 | import matplotlib.pyplot as plt 6 | from scipy.stats import norm 7 | 8 | # ファイルの読み込み 9 | # PersonID: 学生のID 10 | # M: 3ヶ月間ヶ月間における履修登録した科目の総授業回数 11 | # Y: Mのうち出席した授業回数 12 | attendance_2 = pandas.read_csv('data-attendance-2.txt') 13 | print(attendance_2.head()) 14 | print(attendance_2.describe()) 15 | 16 | # ここでの解析の目的は、AとScoreがMにどの程度寄与しているかを判断したいとする。 17 | # 離散した数値の推定はポアソン分布による近似が第一選択。 18 | # 説明変数は、AとScore 19 | 20 | # データ準備 21 | # スケーリング 22 | Score = attendance_2['Score']/200 23 | 24 | A = attendance_2['A'] 25 | M = attendance_2['M'] 26 | N = len(M) 27 | 28 | stan_data = { 29 | 'N': N, 30 | 'Score': Score, 31 | 'A': A, 32 | 'M': M 33 | } 34 | 35 | # コンパイル 36 | filename = '../model/model5-6' 37 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 38 | mcmc_sample = mcmc_result.extract() 39 | 40 | # ポアソン分布を利用すると、 41 | # 推定の結果から、各説明変数を変化させた際に応答変数がどのように変化するか、 42 | # 例えば、Scoreが50から150になった際に、履修登録する授業回数が何倍になるか、 43 | # という計算が簡単な指数の計算で求まる。 44 | 45 | # 演習問題 5(5) 46 | # 実測値と予測値のプロット 47 | # 説明変数はAとScoreだが、ここでは応答変数とそれに対する予測値のみを扱う。もち完全に予測できれいれば、 48 | # すべて同じ数値となるが、予測値はサンプリングしているので信頼区間として表示することになる。 49 | quantile = [10, 50, 90] 50 | colname = ['p' + str(x) for x in quantile] 51 | print(np.percentile(mcmc_result['m_pred'], q=quantile, axis=0)) 52 | attendance_2_pred = pandas.DataFrame(np.percentile(mcmc_result['m_pred'], q=quantile, axis=0).T, columns=colname) 53 | # 実装値と予測値のDataFrameを作成 54 | d = pandas.concat([attendance_2, attendance_2_pred], axis=1) 55 | d0 = d.query('A==0') 56 | d1 = d.query('A==1') 57 | 58 | plt.plot([0,0.5], [0,0.5], 'k--', alpha=0.7) 59 | plt.errorbar(d0.M, d0.p50, yerr=[d0.p50 - d0.p10, d0.p90 - d0.p50], 60 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3, label="A=0") 61 | plt.errorbar(d1.M, d1.p50, yerr=[d1.p50 - d1.p10, d1.p90 - d1.p50], 62 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='^', mfc='green', capsize=3, label="A=1") 63 | ax = plt.axes() 64 | ax.set_aspect('equal') 65 | plt.legend() 66 | plt.xlabel('Observed', fontsize=20) 67 | plt.ylabel('Predicted', fontsize=20) 68 | plt.show() 69 | 70 | # 今回は、ほとんどの信頼区間がy=xを含んでいないことから、実際の値と比べて予測値が離れてしまっていることがわかる。 71 | -------------------------------------------------------------------------------- /exec/5-exec-5-6.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import mcmc_tools 5 | import matplotlib.pyplot as plt 6 | from scipy.stats import norm 7 | 8 | # ファイルの読み込み 9 | # y: 種子数 応答変数 10 | # x: 体サイズ 11 | # f: 処理の違い(CまたはT) 12 | data3a = pandas.read_csv('data3a.csv') 13 | print(data3a.head()) 14 | print(data3a.describe()) 15 | 16 | # 目的 17 | # 体サイズXと処理の違いfがyに及ぼず影響を調べる。 18 | # そのため、xとfからyを推定できるかモデリングする。 19 | 20 | # 応答変数は離散的な自然数なのでポアソン分布を利用する。 21 | # ポアソン分布に与えるパラメータはxとfを線形結合して指数をとったものとする。 22 | # カテゴリカル変数であるfは0と1に変換して利用する。 23 | # 1と2でも良いが、バイナリ値である場合には掛け算でパラメータの使用の有無を決定するほうが計算がシンプルにできる。 24 | # 最初はパラメータの数を増やしても良いが、その後削減できるパラメータがないかどうか確認することも大切である。 25 | # また、expとpoissonの組み合わせてうまくパラメータが探索できないとき、 26 | # 27 | f_effec = { 28 | 'C': 0, 29 | 'T': 1 30 | } 31 | 32 | data3a_re = data3a.replace(f_effec) 33 | print(data3a_re.head()) 34 | 35 | y = data3a_re['y'] 36 | x = data3a_re['x'] 37 | f = data3a_re['f'] 38 | N = len(y) 39 | 40 | # データ準備 41 | stan_data = { 42 | 'N': N, 43 | 'y': y, 44 | 'x': x, 45 | 'f': f 46 | } 47 | 48 | # コンパイル 49 | filename = '../model/5-exec-5-6' 50 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=1983) 51 | mcmc_sample = mcmc_result.extract() 52 | 53 | # 予測値と実測値のプロット 54 | quantile = [10, 50, 90] 55 | colname = ['p' + str(x) for x in quantile] 56 | print(np.percentile(mcmc_sample['y_pred'], q=quantile, axis=0)) 57 | data3a_pred = pandas.DataFrame(np.percentile(mcmc_sample['y_pred'], q=quantile, axis=0).T, columns=colname) 58 | # 実装値と予測値のDataFrameを作成 59 | d = pandas.concat([data3a_re, data3a_pred], axis=1) 60 | d0 = d.query('f==0') 61 | d1 = d.query('f==1') 62 | 63 | plt.errorbar(d0.y, d0.p50, yerr=[d0.p50 - d0.p10, d0.p90 - d0.p50], 64 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3, label="f=0") 65 | plt.errorbar(d1.y, d1.p50, yerr=[d1.p50 - d1.p10, d1.p90 - d1.p50], 66 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='^', mfc='green', capsize=3, label="f=1") 67 | ax = plt.axes() 68 | plt.plot([0,15], [0,15], 'k--', alpha=0.7) 69 | ax.set_aspect('equal') 70 | plt.legend() 71 | plt.xlabel('Observed', fontsize=20) 72 | plt.ylabel('Predicted', fontsize=20) 73 | plt.show() -------------------------------------------------------------------------------- /exec/5-exec-5-7.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import mcmc_tools 5 | import matplotlib.pyplot as plt 6 | from scipy.stats import norm 7 | 8 | # ファイルの読み込み 9 | # y: 生存していた種子数 応答変数 10 | # N: 調査した種子数 11 | # x: 体サイズ 12 | # f: 処理の違い(CまたはT) 13 | data4a = pandas.read_csv('data4a.csv') 14 | print(data4a.head()) 15 | print(data4a.describe()) 16 | 17 | # ここでは、2項ロジスティック回帰を利用して推定を試みる。 18 | # 種子の生存率を確立で表すため、ロジスティック関数を利用する。 19 | # 確率はxとfに依存するものとする。 20 | # その確率と、調査した種子数を説明変数として、生存していた種子数をモデリングする。 21 | f_effec = { 22 | 'C': 0, 23 | 'T': 1 24 | } 25 | 26 | data4a_re = data4a.replace(f_effec) 27 | print(data4a_re.head()) 28 | 29 | y = data4a_re['y'] 30 | x = data4a_re['x'] 31 | f = data4a_re['f'] 32 | N = data4a_re['N'] 33 | I = len(y) 34 | 35 | stan_data = { 36 | 'I': I, 37 | 'y': y, 38 | 'N': N, 39 | 'x': x, 40 | 'f': f 41 | } 42 | 43 | # コンパイル 44 | filename = '../model/5-exec-5-7' 45 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=1983) 46 | mcmc_sample = mcmc_result.extract() 47 | 48 | 49 | # 予測値と実測値のプロット 50 | quantile = [10, 50, 90] 51 | colname = ['p' + str(x) for x in quantile] 52 | print(np.percentile(mcmc_sample['y_pred'], q=quantile, axis=0)) 53 | data4a_pred = pandas.DataFrame(np.percentile(mcmc_sample['y_pred'], q=quantile, axis=0).T, columns=colname) 54 | # 実装値と予測値のDataFrameを作成 55 | d = pandas.concat([data4a_re, data4a_pred], axis=1) 56 | d0 = d.query('f==0') 57 | d1 = d.query('f==1') 58 | 59 | plt.errorbar(d0.y, d0.p50, yerr=[d0.p50 - d0.p10, d0.p90 - d0.p50], 60 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3, label="f=0") 61 | plt.errorbar(d1.y, d1.p50, yerr=[d1.p50 - d1.p10, d1.p90 - d1.p50], 62 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='^', mfc='green', capsize=3, label="f=1") 63 | ax = plt.axes() 64 | plt.plot([0,10], [0,10], 'k--', alpha=0.7) 65 | ax.set_aspect('equal') 66 | plt.legend() 67 | plt.xlabel('Observed', fontsize=12) 68 | plt.ylabel('Predicted', fontsize=12) 69 | plt.show() 70 | 71 | # この結果から、練習問題5(6)よりも5(7)の設定のほうが良い推定を得られることがわかる。 72 | # これはデータとデータをつなぐ仕組みを考えることにつながる。説明変数はほとんど変わらないのに、 73 | # 種子が生き残る確率、とと検査した個体数を導入することによって、 74 | # 推論性能が上昇していることがわかる。 75 | # これが、スライダークランク機構を例に題して説明される実例である。 -------------------------------------------------------------------------------- /exec/6-1.py: -------------------------------------------------------------------------------- 1 | # この章では、一通り確率分布の説明がされている。 2 | # それぞれの分布がどのようなデータで仮定されることが多いのか、 3 | # 確認しておくことにする。 4 | 5 | # 一様分布 6 | # 無情報事前分布として使われる。 7 | # 離散であればサイコロ、 8 | # 連続であれば丸い鉛筆で例えられることが多い、どの事象も同確率で起こる場合に使う。 9 | 10 | # ベルヌーイ分布 11 | # コイン投げで表がでるかどうか、ある商品を買うか買わないか、薬が効くか効かないか 12 | 13 | # 二項分布 14 | # 10試合中勝利した数、兄弟姉妹のうちの女性の人数、植物の種が目を出した数 15 | # WebサービスでのA/Bテストも結果が2種類であることが多いので、Aになる確率をp、Bになる確率を1-pとして、二項分布で表現できる。 16 | 17 | # ベータ分布 18 | # ベルヌーイ分布で使うコインの形状を表現できる。 19 | # 製品郡の故障率が似通っているかどうか 20 | # Webサービスでは、ページに2つの選択ボタンがあり、それぞれAがα回、Bがβ回クリックされた場合の、AやBが選ばれる確率の分布を表すことが可能。 21 | 22 | # カテゴリカル分布 23 | # ベルヌーイ分布の多変量版 24 | # 購入した商品のカテゴリーをインデックスとして扱うデータ 25 | 26 | # 多項分布 27 | # 二項分布の多変量版 28 | # 宝くじ1000枚のうち、各カテゴリーが何回ずつ出たか 29 | 30 | # ディリクレ分布 31 | # 多数のカテゴリーがあり、それぞれの選択確率の分布を考える場合 32 | # Webサービスでは、たとえばページに4つの選択式ボタンがあり、 33 | # それぞれ10回、5回、1回、20回クリックされた場合の、それぞれのボタンがクリックされる確率を表すことが可能。 34 | 35 | # 指数分布 36 | # あるイベントが起こるまでの時間(故障、死ぬ、流れ星の観測など) 37 | 38 | # ポアソン分布 39 | # 1日の間に観測される動物の個体数、1時間の間に届くメールの数 40 | # Webサービスでは、1日のコンバージョン数など 41 | 42 | # ガンマ分布 43 | # 待ち時間に使う。観測するまでの時間、何かが壊れるまでの時間、効くまでの時間 44 | # Webサービスだと、ある確率で広く拡散されるイベントが、何回目に実際に拡散されるかの分布に使うことがある。 45 | 46 | # 正規分布 47 | # たとえば、サイコロを何回か振っての出た目の和などは正規分布。 48 | # Webサービスでは、日時アクセス数の分布(DAU)や、クリック数(CTR)、数が多い場合のA/Bテストの分布などで利用可能。 49 | 50 | # 対数正規分布 51 | # 人間の体重、年収の金額など 52 | # 正規分布は左右対称ですが、グラフの右側に裾が長い場合、対数正規分布が利用する。 53 | # 年収の分布など、最低は0だけど、最高はどこまでも薄く続いていくような分布の場合。 54 | # Webサービスでは、サービス滞在時間、投稿記事の長さなどが対数正規分布に従うことがある。 55 | 56 | # コーシー分布 57 | # t分布で自由度1の場合の分布です。平均も分散も存在しない、珍しい分布。 58 | # 平均が存在しないので、中心極限定理が成り立たず、足し合わせても正規分布にならない。 59 | # 正規分布に比べて裾が厚いので、外れ値が発生する分布のモデル 60 | # コーシー分布は外れ値をとる確率が高く、外れ値が重要な意味をもつ場合には利用される分布。 61 | # 株価暴落など、正規分布の裾が軽い分布でモデル化できないときに使う。 62 | # 外れ値を含むモデル、変化点の検出 63 | 64 | # ラプラス分布 65 | # 鋭いピークをもち、裾が長い分布 66 | -------------------------------------------------------------------------------- /exec/7-1.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import matplotlib.pyplot as plt 5 | import mcmc_tools 6 | from scipy.stats import norm 7 | 8 | # 回帰分析の各種テクニックを学んでいく 9 | 10 | # 7.1 交互作用の解釈をしっかりしていく 11 | # 積をとる場合、線形結合の項を変形することによって、 12 | # モデリングの解釈が可能となる。 13 | data_rental = pandas.read_csv('data-rental.txt') 14 | print(data_rental.head()) 15 | print(data_rental.describe()) 16 | 17 | 18 | # データの図示 19 | sns.scatterplot( 20 | x='Area', 21 | y='Y', 22 | data=data_rental 23 | ) 24 | plt.show() 25 | plt.close() 26 | 27 | # AreaをもとにYを推定するモデリング 28 | # Yは正規分布を仮定する Area をもとに平均を推定し、分散をノイズとして扱う。 29 | Y = data_rental['Y'] 30 | Area = data_rental['Area'] 31 | N = len(Y) 32 | Area_new = np.arange(10, 120, 1) 33 | N_new = len(Area_new) 34 | 35 | stan_data = { 36 | 'Y': Y, 37 | 'Area': Area, 38 | 'N': N, 39 | 'Area_new': Area_new, 40 | 'N_new': N_new 41 | } 42 | 43 | # コンパイル 44 | filename = '../model/model7-1' 45 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 46 | mcmc_sample = mcmc_result.extract() 47 | 48 | # 予測分布のプロット 49 | df = pandas.DataFrame(mcmc_sample['Y_new']) 50 | df.columns = Area_new 51 | print(df) 52 | qua = [0.025, 0.25, 0.50, 0.75, 0.975] 53 | d_est = pandas.DataFrame() 54 | for i in np.arange(len(df.columns)): 55 | for qu in qua: 56 | d_est[qu] = df.quantile(qu) 57 | 58 | x = d_est.index 59 | y1 = d_est[0.025].values 60 | y2 = d_est[0.25].values 61 | y3 = d_est[0.5].values 62 | y4 = d_est[0.75].values 63 | y5 = d_est[0.975].values 64 | 65 | plt.fill_between(x,y1,y5,facecolor='blue',alpha=0.1) 66 | plt.fill_between(x,y2,y4,facecolor='blue',alpha=0.5) 67 | plt.plot(x,y3,'k-') 68 | plt.scatter(data_rental["Area"],data_rental["Y"],c='b') 69 | plt.show() 70 | plt.close() 71 | 72 | # 予測値と実績値のプロット 73 | quantile = [10, 50, 90] 74 | colname = ['p' + str(x) for x in quantile] 75 | print(np.percentile(mcmc_result['Y_pred'], q=quantile, axis=0)) 76 | data_rental_pred = pandas.DataFrame(np.percentile(mcmc_result['Y_pred'], q=quantile, axis=0).T, columns=colname) 77 | d = pandas.concat([data_rental, data_rental_pred], axis=1) 78 | 79 | plt.plot([0,1800], [0,1800], 'k--', alpha=0.7) 80 | plt.errorbar(d.Y, d.p50, yerr=[d.p50 - d.p10, d.p90 - d.p50], 81 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3) 82 | ax = plt.axes() 83 | ax.set_aspect('equal') 84 | plt.legend() 85 | plt.xlabel('Observed', fontsize=12) 86 | plt.ylabel('Predicted', fontsize=12) 87 | plt.show() 88 | plt.close() 89 | 90 | # 分散の確認 91 | # 実測値と中央値の差分でMAP推定、カーネル密度推定を行う 92 | data_rental_mu = pandas.DataFrame(np.percentile(mcmc_result['mu'], q=quantile, axis=0).T, columns=colname) 93 | d_mu = pandas.concat([data_rental, data_rental_mu], axis=1) 94 | def ip_diff(d_mu): 95 | return d_mu.loc['Y'] - d_mu.loc['p50'] 96 | d_mu['ip'] = d_mu.apply(ip_diff, axis=1) 97 | # MAP推定、カーネル密度推定seabornで実施 98 | # 内部はscipyのnorm 99 | sns.distplot(d_mu['ip'], bins=13, color='#123456', label='data', 100 | kde_kws={'label': 'kde', 'color': 'k'}, 101 | fit=norm, fit_kws={'label': 'norm', 'color': 'red'}, 102 | rug=False) 103 | plt.legend() 104 | plt.show() 105 | plt.close() 106 | # この予測では、カーネル密度推定の結果から、多峰性のノイズ分布となっていることがわかる。 107 | # この理由は、応答変数の大きさとノイズの大きさを等しくあつかっているため、10倍のYに対する10倍のノイズは、推定結果に対して、 108 | # 10倍の価値をもつようになるからである。 109 | -------------------------------------------------------------------------------- /exec/7-3-aircon.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import matplotlib.pyplot as plt 5 | import mcmc_tools 6 | from scipy.stats import norm 7 | 8 | # 回帰分析の各種テクニックを学んでいく 9 | 10 | # 7.3 非線形 11 | 12 | # data-aircon 13 | # X: 屋外の平均気温℃ 14 | # Y: エアコンの消費電力kWh 15 | data_aircon = pandas.read_csv('data-aircon.txt') 16 | print(data_aircon.head()) 17 | print(data_aircon.describe()) 18 | 19 | # 散布図の表示 20 | # XとYが非線形の関係であることを観察できる 21 | plt.scatter(data_aircon["X"],data_aircon["Y"],c='b') 22 | plt.xlabel('X', fontsize=12) 23 | plt.ylabel('Y', fontsize=12) 24 | plt.show() 25 | plt.close() 26 | 27 | # モデリング 28 | # ここでは、快適と感じる温度x_0が存在すると仮定し、消費電力がx_0からの二乗和誤差のような値を平均とした 29 | # 正規分布に従うとする。 30 | Y = data_aircon['Y'] 31 | X = data_aircon['X'] 32 | N = len(Y) 33 | 34 | X_new = np.arange(-10, 35, 1) 35 | N_new = len(X_new) 36 | 37 | stan_data = { 38 | 'Y': Y, 39 | 'X': X, 40 | 'N': N, 41 | 'N_new': N_new, 42 | 'X_new': X_new 43 | } 44 | 45 | # コンパイル 46 | filename = '../model/model7-3-aircon' 47 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 48 | mcmc_sample = mcmc_result.extract() 49 | 50 | # 予測分布 51 | df = pandas.DataFrame(mcmc_sample['Y_new']) 52 | df.columns = X_new 53 | print(df) 54 | qua = [0.025, 0.25, 0.50, 0.75, 0.975] 55 | d_est = pandas.DataFrame() 56 | for i in np.arange(len(df.columns)): 57 | for qu in qua: 58 | d_est[qu] = df.quantile(qu) 59 | x = d_est.index 60 | y1 = d_est[0.025].values 61 | y2 = d_est[0.25].values 62 | y3 = d_est[0.5].values 63 | y4 = d_est[0.75].values 64 | y5 = d_est[0.975].values 65 | plt.fill_between(x,y1,y5,facecolor='blue',alpha=0.1) 66 | plt.fill_between(x,y2,y4,facecolor='blue',alpha=0.5) 67 | plt.plot(x,y3,'k-') 68 | plt.scatter(data_aircon["X"],data_aircon["Y"],c='b') 69 | plt.show() 70 | plt.close() 71 | 72 | # 予測値と実測値のプロット 73 | quantile = [10, 50, 90] 74 | colname = ['p' + str(x) for x in quantile] 75 | print(np.percentile(mcmc_sample['Y_pred'], q=quantile, axis=0)) 76 | data_rental_pred = pandas.DataFrame(np.percentile(mcmc_sample['Y_pred'], q=quantile, axis=0).T, columns=colname) 77 | d = pandas.concat([data_aircon, data_rental_pred], axis=1) 78 | 79 | plt.plot([-10,35], [-10,35], 'k--', alpha=0.7) 80 | plt.errorbar(d.Y, d.p50, yerr=[d.p50 - d.p10, d.p90 - d.p50], 81 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3) 82 | ax = plt.axes() 83 | ax.set_aspect('equal') 84 | plt.legend() 85 | plt.xlabel('Observed', fontsize=12) 86 | plt.ylabel('Predicted', fontsize=12) 87 | plt.show() 88 | plt.close() 89 | # このデータについて、ほとんどすべての80%信頼区間がy=x上に位置しており、 90 | # 十分に説明変数で応答変数を予測できると考えることができる。 -------------------------------------------------------------------------------- /exec/7-3-conc.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import matplotlib.pyplot as plt 5 | import mcmc_tools 6 | from scipy.stats import norm 7 | 8 | # 回帰分析の各種テクニックを学んでいく 9 | 10 | # 7.3 非線形 11 | 12 | # data-conc 13 | # Time: 投与からの経過時間Time(hour) 14 | # Y: 薬の血中濃度mg/mL 15 | data_conc = pandas.read_csv('data-conc.txt') 16 | print(data_conc.head()) 17 | print(data_conc.describe()) 18 | 19 | # 散布図の表示 20 | # XとYが非線形の関係であることを観察できる 21 | # また、データ点数が非常に少ない 22 | plt.scatter(data_conc["Time"],data_conc["Y"],c='b') 23 | plt.xlabel('Time', fontsize=12) 24 | plt.ylabel('Y', fontsize=12) 25 | plt.show() 26 | plt.close() 27 | 28 | # このデータのモデリングは、物理法則を用いる。 29 | # 薬の血中濃度yと時間tの関係は、 30 | # 点滴で投与されると考えた場合、 31 | # 一定の流入量Aを仮定する。 32 | # 薬剤は体内で分解される。速度は血中濃度に比例すると考えられているので、 33 | # 血中からの喪失量は -by (b > 0) とかける。 34 | # すると、dy/dt = A - by が単位時間あたりの血中濃度の常備分方程式になる。 35 | # さらにAが b x a だと仮定すると、 36 | # dy/dy = b ( a - y ) となる。 37 | # この常備分方程式を解くと、 38 | # y = a { 1 - Cexp(-bt)} となる。これは定数の置き方に工夫をすることで、曲線フィットにもっていく。 39 | # 説明変数はTime 40 | Y = data_conc['Y'] 41 | time = data_conc['Time'] 42 | N = len(Y) 43 | 44 | time_new = np.linspace(0, 24, 60) 45 | N_new = len(time_new) 46 | 47 | print(N_new) 48 | 49 | stan_data = { 50 | 'Y': Y, 51 | 'time': time, 52 | 'N': N, 53 | 'time_new': time_new, 54 | 'N_new': N_new 55 | } 56 | 57 | # コンパイル 58 | filename = '../model/model7-3-conc' 59 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 60 | mcmc_sample = mcmc_result.extract() 61 | # model4季では、左辺と右辺の型が異なってもコンパイルが通って計算できてしまうことに注意。 62 | # その場合、パラメータは最後のデータにのみフイットするので、急激にYが増加するようなモデルになる。 63 | 64 | # 予測分布 65 | df = pandas.DataFrame(mcmc_sample['Y_new']) 66 | df.columns = time_new 67 | print(df) 68 | qua = [0.025, 0.25, 0.50, 0.75, 0.975] 69 | d_est = pandas.DataFrame() 70 | for i in np.arange(len(df.columns)): 71 | for qu in qua: 72 | d_est[qu] = df.quantile(qu) 73 | 74 | x = d_est.index 75 | y1 = d_est[0.025].values 76 | y2 = d_est[0.25].values 77 | y3 = d_est[0.5].values 78 | y4 = d_est[0.75].values 79 | y5 = d_est[0.975].values 80 | 81 | plt.fill_between(x,y1,y5,facecolor='blue',alpha=0.1) 82 | plt.fill_between(x,y2,y4,facecolor='blue',alpha=0.5) 83 | plt.plot(x,y3,'k-') 84 | plt.scatter(data_conc["Time"],data_conc["Y"],c='b') 85 | # plt.xticks([1,2,5,10,20,50,100]) 86 | # plt.yticks([200,500,1000,2000]) 87 | #plt.xlim((9, 120)) 88 | plt.show() 89 | plt.close() 90 | 91 | # 予測値と実績値のプロット 92 | quantile = [10, 50, 90] 93 | colname = ['p' + str(x) for x in quantile] 94 | print(np.percentile(mcmc_sample['Y_pred'], q=quantile, axis=0)) 95 | data_conc_pred = pandas.DataFrame(np.percentile(mcmc_sample['Y_pred'], q=quantile, axis=0).T, columns=colname) 96 | d = pandas.concat([data_conc, data_conc_pred], axis=1) 97 | plt.plot([0,30], [0,30], 'k--', alpha=0.7) 98 | plt.errorbar(d.Y, d.p50, yerr=[d.p50 - d.p10, d.p90 - d.p50], 99 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3) 100 | ax = plt.axes() 101 | ax.set_aspect('equal') 102 | plt.legend() 103 | plt.xlabel('Observed', fontsize=12) 104 | plt.ylabel('Predicted', fontsize=12) 105 | plt.show() 106 | plt.close() 107 | # ほとんどの実測値が予測値の信頼区間に入っているので推定できていると仮定。 -------------------------------------------------------------------------------- /exec/7-4.py: -------------------------------------------------------------------------------- 1 | # 多重共線性の話 2 | # ここでの例は、賃貸物件価格における部屋数と広さの関係 3 | # もしこの2つの相関が高ければ、どちらかを説明変数から外す。 4 | # 相関が高いかどうかは説明変数感の相関係数を行列を計算するなどして、 5 | # 0.8~0.95程度を閾値としてどちらかを排除する。 -------------------------------------------------------------------------------- /exec/7-5.py: -------------------------------------------------------------------------------- 1 | # 交絡(confounding) 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | import mcmc_tools 7 | from scipy.stats import norm 8 | 9 | # 回帰分析の各種テクニックを学んでいく 10 | # ここでは交絡、モデルの外側に応答変数と説明変数の両方に影響を与える変数が存在する場合。 11 | 12 | # data-50m 13 | # Y: 50m走の平均秒速(m/秒) 14 | # Weight: 体重 15 | # Age: 年齢 16 | data_50m = pandas.read_csv('data-50m.txt') 17 | print(data_50m.head()) 18 | print(data_50m.describe()) 19 | 20 | # ペアプロットの表示 21 | sns.pairplot(data_50m, hue="Age", diag_kind='hist') 22 | plt.show() 23 | 24 | # ここでのモデリング手法は、パス解析と呼ばれる。 25 | # 因果推論する方法の1つであり、複数の回帰を組み合わせて変数間の因果関係を模索する解析方法である。 26 | # 1つめの回帰は、年齢に対する体重、 27 | # 2つめの回帰は、年齢と体重に対する平均秒速である。 28 | Y = data_50m['Y'] 29 | Weight = data_50m['Weight'] 30 | Age = data_50m['Age'] 31 | N = len(Y) 32 | 33 | Age_new = np.arange(7, 12) 34 | N_new = len(Age_new) 35 | 36 | stan_data = { 37 | 'Y': Y, 38 | 'Weight': Weight, 39 | 'Age': Age, 40 | 'N': N, 41 | 'Age_new': Age_new, 42 | 'N_new': N_new 43 | } 44 | 45 | # コンパイル 46 | filename = '../model/model7-5' 47 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 48 | mcmc_sample = mcmc_result.extract() 49 | # 1つめの回帰、年齢に対する体重はc2パラメータで表現表現しており、3.96で正の相関。 50 | # 2つめの回帰、年齢と体重に対すパラメータはb2とb3で、b2が0.59で正の相関。 51 | # b3が-0.04で負の相関。 52 | # 理屈と合うパラメータの推定値が得られた。 -------------------------------------------------------------------------------- /exec/7-6.py: -------------------------------------------------------------------------------- 1 | # 説明変数が多すぎる場合の回帰 2 | # その場合、理想的には説明変数間の関係をモデリングして解決するのが良い。 3 | # ここでの例では、遺伝子検査の結果をもとに、効きそうな薬を推定する場合について述べられている。 4 | # 遺伝子間には多数の関係があり、その情報を活用することが望ましいそうだ。 5 | # その他にも具体的なデータ例が記載されている。 6 | # 1. 極端に出現データに偏りのある2値データは削除 7 | # 2. 説明変数に対して階層的クラスタリングを実施して類似性の高い変数をまとたり、マイナーなデータを捨てる。 8 | # 3. 主成分分析などの手法でデータの次元を減らす 9 | # 4. Bayesian Lasso。説明変数の係数に二重指数分布を事前分布とした値を設定する。0に近い値をもつ係数は不要と考えることが可能。 10 | 11 | -------------------------------------------------------------------------------- /exec/7-7.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import matplotlib.pyplot as plt 5 | import mcmc_tools 6 | from scipy.stats import norm 7 | 8 | # 説明変数にノイズを含む場合 9 | # 説明変数自体が推定値である場合には、そもそも説明変数にノイズが存在していると考えることができる。 10 | # data-salalyの年齢Xがアプリケーションによる推定値だったと仮定した場合。 11 | 12 | # ファイルの読み込み 13 | # X: 年齢 14 | # Y: 年収 15 | salary = pandas.read_csv('data-salary.txt') 16 | 17 | # データの先頭5行の確認 18 | print(salary.head()) 19 | 20 | # データのサマリを確認 21 | print(salary.describe()) 22 | 23 | # データの図示 24 | sns.scatterplot( 25 | x='X', 26 | y='Y', 27 | data=salary 28 | ) 29 | plt.show() 30 | 31 | # Xに+-2.5程度のノイズを仮定したい場合、標準偏差2.5の正規分布を使うことができる。 32 | Y = salary['Y'] 33 | X = salary['X'] 34 | N = len(Y) 35 | 36 | stan_data = { 37 | 'Y': Y, 38 | 'X': X, 39 | 'N': N 40 | } 41 | 42 | # コンパイル 43 | filename = '../model/model7-7' 44 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 45 | mcmc_sample = mcmc_result.extract() 46 | 47 | # 説明変数にノイズを含む場合の扱いが、ベイジアンモデリングを使うことで簡単にできる例である。 48 | -------------------------------------------------------------------------------- /exec/7-8.py: -------------------------------------------------------------------------------- 1 | # 打ち切り(Censored)の例 2 | # 打ち切りのあるデータは伝統的な統計学だけで解決策を得ようとしても難しいのだが、 3 | # Stanでは打ち切りの値までの累積分布関数の値を対数尤度に簡単に足せる 4 | # というのもStanではサンプリング中の対数尤度は常にtarget変数に保存されているため、 5 | # targetに累積分布関数の値を足せば良い。 6 | # 打ち切り発生のデータ分の値を足すモデリングをやってみる。 7 | # 打ち切りが発生していないデータのみで通常のサンプリングを実施し、 8 | # 打ち切りが発生しているデータについては、その累積分布関数をtargetに加えるのみとする。 9 | 10 | import numpy as np 11 | import seaborn as sns 12 | import pandas 13 | import matplotlib.pyplot as plt 14 | import mcmc_tools 15 | from scipy.stats import norm 16 | 17 | # ファイルの読み込み 18 | # Y: 血中のタンパク質濃度 19 | protein = pandas.read_csv('data-protein.txt') 20 | # データの先頭5行の確認 21 | print(protein.head()) 22 | # データのサマリを確認 23 | print(protein.describe()) 24 | 25 | 26 | # < を含むデータが打ち切り、含まないデータが打ち切りしていないデータである場合 27 | protein_cens = protein.query('Y.str.contains("<")', engine='python') 28 | protein_obs = protein.query('not Y.str.contains("<")', engine='python') 29 | 30 | # データに<が含まれるため文字列の認識でDataFrameに格納される。 31 | # floatに変換する 32 | Y_obs = [float(s) for s in protein_obs['Y'].values] 33 | # Y_obs = protein_obs['Y'].astype('float') とpandasの機能を使ってもOK 34 | Y_cens = protein_cens['Y'].values 35 | 36 | print(Y_obs) 37 | print(Y_cens) 38 | 39 | N_obs =len(Y_obs) 40 | N_cens = len(Y_cens) 41 | 42 | # 打ち切り値を取得 43 | L = int(Y_cens[0][1:]) 44 | 45 | stan_data = { 46 | 'N_obs': N_obs, 47 | 'N_cens': N_cens, 48 | 'Y_obs': Y_obs, 49 | 'L': L 50 | } 51 | 52 | # コンパイル 53 | filename = '../model/model7-8' 54 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 55 | mcmc_sample = mcmc_result.extract() 56 | 57 | # 打ち切りデータに対する手段として知っておくと良さそう。 58 | # 結果を見ると、平均25.47、分散15.11の正規分布を推定している。 -------------------------------------------------------------------------------- /exec/7-9.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import matplotlib.pyplot as plt 5 | import mcmc_tools 6 | from scipy.stats import norm 7 | 8 | # 最後は外れ値を含むデータ 9 | # これは知っていれば非常に簡単な手法。 10 | # 裾の重い分布を使って外れ値の確率分布への影響を減らすことを試みる。 11 | 12 | # ファイルの読み込み 13 | # X: なにかのインデックス 14 | # Y: なにかの数値データ 15 | outlier = pandas.read_csv('data-outlier.txt') 16 | # データの先頭5行の確認 17 | print(outlier.head()) 18 | # データのサマリを確認 19 | print(outlier.describe()) 20 | 21 | # データの図示 22 | sns.scatterplot( 23 | x='X', 24 | y='Y', 25 | data=outlier 26 | ) 27 | plt.show() 28 | # xが3のあたりで極端なYを記録しており、外れ値と想定したとする。 29 | # コーシー分布を仮定することで、予測分布への外れ値の影響が小さくなっていることを確認する。 30 | 31 | X = outlier['X'] 32 | Y = outlier['Y'] 33 | X_new = np.linspace(0, 11, 100) 34 | 35 | N = len(Y) 36 | N_new = len(X_new) 37 | 38 | stan_data = { 39 | 'N': N, 40 | 'X': X, 41 | 'Y': Y, 42 | 'N_new': N_new, 43 | 'X_new': X_new 44 | } 45 | 46 | # コンパイル 47 | filename = '../model/model7-9' 48 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 49 | mcmc_sample = mcmc_result.extract() 50 | 51 | # 予測分布 52 | df = pandas.DataFrame(mcmc_sample['Y_new']) 53 | df.columns = X_new 54 | print(df) 55 | qua = [0.025, 0.25, 0.50, 0.75, 0.975] 56 | d_est = pandas.DataFrame() 57 | for i in np.arange(len(df.columns)): 58 | for qu in qua: 59 | d_est[qu] = df.quantile(qu) 60 | 61 | x = d_est.index 62 | y1 = d_est[0.025].values 63 | y2 = d_est[0.25].values 64 | y3 = d_est[0.5].values 65 | y4 = d_est[0.75].values 66 | y5 = d_est[0.975].values 67 | 68 | plt.fill_between(x,y1,y5,facecolor='blue',alpha=0.1) 69 | plt.fill_between(x,y2,y4,facecolor='blue',alpha=0.5) 70 | plt.plot(x,y3,'k-') 71 | plt.scatter(outlier["X"],outlier["Y"],c='b') 72 | plt.show() 73 | plt.close() 74 | 75 | # 予測分布を確認すると、外れ値による信頼区間への影響が小さいことが確認できる。 76 | # しかしながら、単純な正規分布を仮定した場合とどちらが正解かというと、 77 | # 与えられたデータからだけでは判断できない。 78 | # xが3付近では別の理由で大きな値をとるのかもしれない。 79 | # 今回はxが3付近のデータをノイズと仮定した場合の確率分布を推定したにすぎない。 80 | 81 | # 別の方法として、混合正規分布やZIP(Zero Inflated Poisson)分布を使うと良い。 82 | # Zero Inflated Poissonは、ベルヌーイ分布とポアソン分布を混ぜた分布で、分布中に 83 | # A もしくは Bというようなカテゴリカルなクラスが存在し、それぞれごとにポアソン分布で 84 | # 回数を観測しているような場合に用いる。 85 | # これらの分布については11章で再度扱うらしい。 -------------------------------------------------------------------------------- /exec/8-1-eq.py: -------------------------------------------------------------------------------- 1 | # ここでは、8-1-hieと等価なモデルををパラメータを削減して構築する。 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | import mcmc_tools 7 | from scipy.stats import norm 8 | import random 9 | 10 | # 年収ファイル2 11 | # X: 年齢、実際からマイナス23(新卒の年齢を23とし、所属年数として扱うため) 12 | # Y: 年収 13 | # KID: 勤務している会社のID(1~4)大手4社 14 | 15 | salary2 = pandas.read_csv('data-salary-2.txt') 16 | print(salary2.head()) 17 | print(salary2.describe()) 18 | 19 | # モデリング 20 | # Yを推定するためのパラメータaとbが、全体平均を平均とした正規分布 21 | Y = salary2['Y'] 22 | X = salary2['X'] 23 | N = len(Y) 24 | N_group = 4 25 | KID = salary2['KID'] 26 | 27 | stan_data = { 28 | 'Y': Y, 29 | 'X': X, 30 | 'N': N, 31 | 'N_group': N_group, 32 | 'KID': KID 33 | } 34 | 35 | # コンパイル 36 | filename = '../model/model8-1-eq' 37 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 38 | mcmc_sample = mcmc_result.extract() 39 | # モデルは等価なので、性能的な違いは有意には出ないが、パラメータが少なくなった分、 40 | # サンプリングにかかる時間が短くなる。 41 | # しかし、モデルによっては逆に時間がかかることもあるらしいので注意。 42 | 43 | a_hie = mcmc_sample['a'] 44 | pd_hie = pandas.DataFrame(a_hie) 45 | pd_hie.plot.box() 46 | plt.show() 47 | 48 | 49 | -------------------------------------------------------------------------------- /exec/8-1.py: -------------------------------------------------------------------------------- 1 | # 階層モデルを学ぶ。 2 | # グループや個人差を扱うための手法の1つであり、最初は階層モデルと単純なモデルを比較して、 3 | # 階層モデルの良い点を観察していく。 4 | import numpy as np 5 | import seaborn as sns 6 | import pandas 7 | import matplotlib.pyplot as plt 8 | import mcmc_tools 9 | from scipy.stats import norm 10 | 11 | # 年収ファイル2 12 | # X: 年齢、実際からマイナス23(新卒の年齢を23とし、所属年数として扱うため) 13 | # Y: 年収 14 | # KID: 勤務している会社のID(1~4)大手4社 15 | 16 | salary2 = pandas.read_csv('data-salary-2.txt') 17 | print(salary2.head()) 18 | print(salary2.describe()) 19 | 20 | 21 | # 以下の仮定をおく。 22 | # Yは基本年収と正規分布に従うノイズの和である。 23 | # 大手4社は年功序列性だが、新卒の基本年収と年齢に伴う昇給額は会社によってかなり異なる。 24 | # 最後の仮定が、グループ差を考える動機となる。 25 | 26 | # ペアプロットの表示 27 | sns.pairplot(salary2, hue="KID", diag_kind='hist') 28 | plt.show() 29 | 30 | # 最初は単純な回帰モデルを試す。 31 | # Xを説明変数として、線形モデルを構築、確率分布は正規分布を想定する。 32 | X = salary2['X'] 33 | Y = salary2['Y'] 34 | N = len(Y) 35 | 36 | X_new = np.arange(0, 30) 37 | N_new = len(X_new) 38 | 39 | stan_data = { 40 | 'X': X, 41 | 'Y': Y, 42 | 'N': N, 43 | 'N_new': N_new, 44 | 'X_new': X_new 45 | } 46 | 47 | # コンパイル 48 | filename = '../model/model8-1' 49 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 50 | mcmc_sample = mcmc_result.extract() 51 | 52 | # 予測分布のプロット 53 | df = pandas.DataFrame(mcmc_sample['Y_new']) 54 | df.columns = X_new 55 | print(df) 56 | qua = [0.025, 0.25, 0.50, 0.75, 0.975] 57 | d_est = pandas.DataFrame() 58 | for i in np.arange(len(df.columns)): 59 | for qu in qua: 60 | d_est[qu] = df.quantile(qu) 61 | 62 | x = d_est.index 63 | y1 = d_est[0.025].values 64 | y2 = d_est[0.25].values 65 | y3 = d_est[0.5].values 66 | y4 = d_est[0.75].values 67 | y5 = d_est[0.975].values 68 | 69 | plt.fill_between(x,y1,y5,facecolor='blue',alpha=0.1) 70 | plt.fill_between(x,y2,y4,facecolor='blue',alpha=0.5) 71 | plt.plot(x,y3,'k-') 72 | # plt.scatter(data_rental["Area"],data_rental["Y"],c='b') 73 | plt.show() 74 | plt.close() 75 | 76 | # 実測値と予測値のプロット 77 | quantile = [10, 50, 90] 78 | colname = ['p' + str(x) for x in quantile] 79 | print(np.percentile(mcmc_result['Y_pred'], q=quantile, axis=0)) 80 | salary2_pred = pandas.DataFrame(np.percentile(mcmc_result['Y_pred'], q=quantile, axis=0).T, columns=colname) 81 | d = pandas.concat([salary2, salary2_pred], axis=1) 82 | d0 = d.query('KID==1') 83 | d1 = d.query('KID==2') 84 | d2 = d.query('KID==3') 85 | d3 = d.query('KID==4') 86 | 87 | plt.plot([0,800], [0,800], 'k--', alpha=0.7) 88 | plt.errorbar(d0.Y, d0.p50, yerr=[d0.p50 - d0.p10, d0.p90 - d0.p50], 89 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3) 90 | plt.errorbar(d1.Y, d1.p50, yerr=[d1.p50 - d1.p10, d1.p90 - d1.p50], 91 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='^', mfc='green', capsize=3) 92 | plt.errorbar(d2.Y, d2.p50, yerr=[d2.p50 - d2.p10, d2.p90 - d2.p50], 93 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='x', mfc='red', capsize=3) 94 | plt.errorbar(d3.Y, d3.p50, yerr=[d3.p50 - d3.p10, d3.p90 - d3.p50], 95 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='yellow', capsize=3) 96 | 97 | ax = plt.axes() 98 | ax.set_aspect('equal') 99 | plt.legend() 100 | plt.xlabel('Observed', fontsize=12) 101 | plt.ylabel('Predicted', fontsize=12) 102 | plt.show() 103 | plt.close() 104 | 105 | # グラフから、会社によって金額を大きめに予想しすぎたり、小さめに予想しすぎたりすることが発生していることがわかる。 106 | # また、KID=4については観測と予測値は負の相関を示している。 107 | -------------------------------------------------------------------------------- /exec/8-2.py: -------------------------------------------------------------------------------- 1 | # 複数階層をもつモデリング 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | import mcmc_tools 7 | from scipy.stats import norm 8 | from sklearn.linear_model import LinearRegression 9 | 10 | 11 | # 年収ファイル3 12 | # X: 年齢、実際からマイナス23(新卒の年齢を23とし、所属年数として扱うため) 13 | # Y: 年収 14 | # KID: 勤務している会社のID(1~30)30社 15 | # GID: 業界のID(1~3) 16 | salary3 = pandas.read_csv('data-salary-3.txt') 17 | print(salary3.head()) 18 | print(salary3.describe()) 19 | 20 | # データの図示 21 | sns.scatterplot( 22 | x='X', 23 | y='Y', 24 | hue='GID', 25 | data=salary3 26 | ) 27 | plt.show() 28 | 29 | # IDが増えてきたら各データの分布を確認するのも良い方法である。 30 | # 各IDごとに単回帰してみる。 31 | 32 | # 単回帰 sklearn 33 | salary_g1 = salary3.query('GID==1') 34 | salary_g2 = salary3.query('GID==2') 35 | salary_g3 = salary3.query('GID==3') 36 | 37 | # 単回帰 Seaborn 38 | fig, (ax1, ax2, ax3) = plt.subplots(1, 3, sharey='all', sharex='all') 39 | sns.regplot("X","Y",salary_g1, ax=ax1) 40 | sns.regplot("X","Y",salary_g2, ax=ax2) 41 | sns.regplot("X","Y",salary_g3, ax=ax3) 42 | plt.tight_layout() 43 | plt.show() 44 | plt.close() 45 | 46 | x = salary_g1[['X']] 47 | y = salary_g1[['Y']] 48 | model_lr = LinearRegression() 49 | model_lr.fit(x, y) 50 | 51 | # モデリング 52 | # 会社ごとに切片と線形結合係数を想定し、それらが全体平均と業界平均から構成されていると考える。 53 | # 業界平均は全体平均を平均とした正規分布から観測されると考える。 54 | # 各会社ごとの切片と線形結合係数は、業界平均を平均とした正規分布から観測されると考える。 55 | 56 | Y = salary3['Y'] 57 | X = salary3['X'] 58 | N = len(Y) 59 | N_group = 30 60 | KID = salary3['KID'] 61 | N_industry = 3 62 | GID = salary3['GID'] 63 | 64 | # 会社IDから業界IDを取得するデータを取得する配列を作成 65 | K2G = salary3.drop_duplicates(subset=['KID', 'GID'])['GID'] 66 | 67 | stan_data = { 68 | 'Y': Y, 69 | 'X': X, 70 | 'N': N, 71 | 'N_group': N_group, 72 | 'N_industry': N_industry, 73 | 'KID': KID, 74 | 'K2G': K2G, 75 | 'GID': GID 76 | } 77 | 78 | # コンパイル 79 | filename = '../model/model8-2' 80 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 81 | mcmc_sample = mcmc_result.extract() 82 | 83 | # このモデリングでは、業界ごとに変化するのは平均のみと仮定しているが、 84 | # 分散も変化すると仮定するモデリングを行う。 85 | # 86 | filename = '../model/model8-2-sd' 87 | mcmc_result_sd = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 88 | mcmc_sample_sd = mcmc_result.extract() 89 | # もしモデルが収束しない場合、複雑さに比べてデータが少ないことが原因が考えられる。 90 | 91 | # 練習問題8(3) 92 | # 会社ごとの年収のベイズ予測区間 93 | # ※ 書籍ではmodel8-5.stanがここではmodel8-2.stan 94 | # a業界平均[g]とb業界平均[g]の事後分布を描く 95 | N_mcmc = mcmc_sample['lp__'].size 96 | G = salary3['GID'].max() 97 | 98 | print(N_mcmc) 99 | print(G) 100 | 101 | fig = plt.figure() 102 | ax = fig.add_subplot(1, 1, 1) 103 | ax.violinplot(mcmc_sample['a1']) 104 | ax.set_xticks([1, 2, 3]) 105 | ax.set_xticklabels(['a1_1', 'a1_2', 'a1_3']) 106 | ax.set_xlabel('parameters') 107 | ax.set_ylabel('value') 108 | plt.show() 109 | plt.close() 110 | 111 | fig2 = plt.figure() 112 | ax2 = fig2.add_subplot(1, 1, 1) 113 | ax2.violinplot(mcmc_sample['b1']) 114 | ax2.set_xticks([1, 2, 3]) 115 | ax2.set_xticklabels(['b1_1', 'b1_2', 'b1_3']) 116 | ax2.set_xlabel('parameters') 117 | ax2.set_ylabel('value') 118 | plt.show() 119 | plt.close() 120 | -------------------------------------------------------------------------------- /exec/8-exec-6.py: -------------------------------------------------------------------------------- 1 | # 練習問題8(6) 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | from matplotlib.figure import figaspect 7 | from matplotlib.gridspec import GridSpec 8 | import mcmc_tools 9 | from scipy.stats import norm 10 | from scipy.stats import gaussian_kde 11 | 12 | # id: 個体番号 13 | # y: 生存していた種子数(8個中) 14 | data7a = pandas.read_csv('data7a.csv') 15 | print(data7a.head()) 16 | print(data7a.describe()) 17 | 18 | # モデリング 19 | # 2項ロジスティック回帰でモデリングする。 20 | # 生存率qを導入して、生存する種子数を推定する 21 | 22 | Y = data7a['y'] 23 | N = len(Y) 24 | 25 | stan_data = { 26 | 'y': Y, 27 | 'N': N 28 | } 29 | 30 | filename = '../model/model-exec8-6' 31 | mcmc_result = mcmc_tools.sampling(filename, stan_data, 32 | n_jobs=4, 33 | seed=123) 34 | mcmc_sample = mcmc_result.extract() 35 | 36 | # 実測値と予測値のプロット 37 | quantile = [10, 50, 90] 38 | colname = ['p' + str(x) for x in quantile] 39 | print(np.percentile(mcmc_result['y_pred'], q=quantile, axis=0)) 40 | data_rental_pred = pandas.DataFrame(np.percentile(mcmc_result['y_pred'], q=quantile, axis=0).T, columns=colname) 41 | d = pandas.concat([data7a, data_rental_pred], axis=1) 42 | 43 | plt.plot([0,8], [0,8], 'k--', alpha=0.7) 44 | plt.errorbar(d.y, d.p50, yerr=[d.p50 - d.p10, d.p90 - d.p50], 45 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3) 46 | ax = plt.axes() 47 | ax.set_aspect('equal') 48 | plt.legend() 49 | plt.xlabel('Observed', fontsize=12) 50 | plt.ylabel('Predicted', fontsize=12) 51 | plt.show() 52 | plt.close() 53 | # これみるとまあまあ良い性能 54 | 55 | 56 | -------------------------------------------------------------------------------- /exec/8-exec-7.py: -------------------------------------------------------------------------------- 1 | # 練習問題8(7) 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | from matplotlib.figure import figaspect 7 | from matplotlib.gridspec import GridSpec 8 | import mcmc_tools 9 | from scipy.stats import norm 10 | from scipy.stats import gaussian_kde 11 | 12 | # id: 個体番号 13 | # pot: 植木鉢番号(A~J) 14 | # f: 処理の違い(C or T) 15 | # y: 種子数 16 | d1 = pandas.read_csv('d1.csv') 17 | print(d1.head()) 18 | print(d1.describe()) 19 | 20 | # モデリング 21 | # 線形結合するのは"処理の違い"とし、ほかはノイズとして扱う。 22 | y = d1['y'] 23 | N = len(y) 24 | 25 | # pandasでIDを変更するときはSeriesが使える 26 | F2int = pandas.Series([0, 1], index=('C', 'T')) 27 | F = F2int[d1['f']] 28 | print(F) 29 | 30 | # こちらもIDを変更するのでSeriesを使う 31 | pots = d1['pot'].unique() 32 | N_Pot = pots.size 33 | Pot2int = pandas.Series(np.arange(N_Pot)+1, index=pots) 34 | N2Pot = Pot2int[d1['pot']] 35 | print(N2Pot) 36 | 37 | stan_data = { 38 | 'Y': y, 39 | 'N': N, 40 | 'N2P': N2Pot, 41 | 'F': F, 42 | 'N_Pot': N_Pot 43 | } 44 | 45 | # モデリング 46 | # この例題では説明変数は"処理の違い"のみになっている。 47 | # その他は個体IDと鉢に依存するノイズを生成して、ポアソン分布のパラメータに追加する形になっている。 48 | filename = '../model/model-exec8-7' 49 | mcmc_result = mcmc_tools.sampling(filename, stan_data, 50 | n_jobs=4, 51 | seed=123) 52 | mcmc_sample = mcmc_result.extract() 53 | 54 | # 個体差はb_I、鉢の差はb_Pに反映されるので、MAP推定値のヒストグラムを描いてみる。 55 | # まずは個体差 56 | param_names = ['mcmc'] + ['b_I{}'.format(i+1) for i in range(100)] 57 | N_mcmc = mcmc_sample['lp__'].size 58 | d_est = pandas.DataFrame(np.hstack([np.arange(N_mcmc).reshape((-1, 1)), mcmc_sample['b_I']]), columns=param_names) 59 | for i in range(100): 60 | kde_bc = gaussian_kde(d_est['b_I%d' % (i+1)]) 61 | plt.plot(np.linspace(-5, 5, num=100), kde_bc(np.linspace(-5, 5, num=100)), label='b_I%d' % (i+1)) 62 | plt.xlabel('value') 63 | plt.ylabel('kde density') 64 | plt.show() 65 | plt.close() 66 | 67 | # 次に鉢 68 | param_names = ['mcmc'] + ['b_P{}'.format(i+1) for i in range(10)] 69 | N_mcmc = mcmc_sample['lp__'].size 70 | d_est = pandas.DataFrame(np.hstack([np.arange(N_mcmc).reshape((-1, 1)), mcmc_sample['b_P']]), columns=param_names) 71 | for i in range(10): 72 | kde_bc = gaussian_kde(d_est['b_P%d' % (i+1)]) 73 | plt.plot(np.linspace(-10, 10, num=100), kde_bc(np.linspace(-10, 10, num=100)), label='b_P%d' % (i+1)) 74 | plt.xlabel('value') 75 | plt.ylabel('kde density') 76 | plt.legend() 77 | plt.show() 78 | plt.close() 79 | # 鉢植えごとの差は大きなところで5。オッズ計算でexp(5)くらい差があることになる。 80 | # けっこう違う。 -------------------------------------------------------------------------------- /exec/9-2-1.py: -------------------------------------------------------------------------------- 1 | # Stanのvector記法 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import mcmc_tools 6 | import matplotlib.pyplot as plt 7 | 8 | # ファイルの読み込み 9 | salary = pandas.read_csv('data-salary.txt') 10 | 11 | sample_size = len(salary['X']) 12 | Y = salary['Y'] 13 | X = salary['X'] 14 | 15 | age_range = np.arange(23, 61, 1) 16 | 17 | # データの先頭5行の確認 18 | stan_data = { 19 | 'N': sample_size, 20 | 'X': X, 21 | 'Y': Y, 22 | 'N_new': len(age_range), 23 | 'X_new': age_range 24 | } 25 | 26 | filename = '../model/model9-2-1' 27 | 28 | # 予測含んだサンプリング 29 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 30 | 31 | 32 | df = pandas.DataFrame(mcmc_result['y_new']) 33 | 34 | print(df) 35 | 36 | df.columns = age_range 37 | 38 | qua = [0.025, 0.25, 0.50, 0.75, 0.975] 39 | d_est = pandas.DataFrame() 40 | 41 | for i in np.arange(len(df.columns)): 42 | for qu in qua: 43 | d_est[qu] = df.quantile(qu) 44 | 45 | 46 | print(d_est) 47 | 48 | x = d_est.index 49 | y1 = d_est[0.025].values 50 | y2 = d_est[0.25].values 51 | y3 = d_est[0.5].values 52 | y4 = d_est[0.75].values 53 | y5 = d_est[0.975].values 54 | 55 | plt.fill_between(x,y1,y5,facecolor='blue',alpha=0.1) 56 | plt.fill_between(x,y2,y4,facecolor='blue',alpha=0.5) 57 | plt.plot(x,y3,'k-') 58 | plt.scatter(salary["X"],salary["Y"],c='b') 59 | plt.show() 60 | -------------------------------------------------------------------------------- /exec/9-2-2.py: -------------------------------------------------------------------------------- 1 | # model8-1-eqのベクトル化 2 | # ここでは、8-1-hieと等価なモデルををパラメータを削減して構築する。 3 | import numpy as np 4 | import seaborn as sns 5 | import pandas 6 | import matplotlib.pyplot as plt 7 | import mcmc_tools 8 | from scipy.stats import norm 9 | import random 10 | 11 | # 年収ファイル2 12 | # X: 年齢、実際からマイナス23(新卒の年齢を23とし、所属年数として扱うため) 13 | # Y: 年収 14 | # KID: 勤務している会社のID(1~4)大手4社 15 | 16 | salary2 = pandas.read_csv('data-salary-2.txt') 17 | print(salary2.head()) 18 | print(salary2.describe()) 19 | 20 | # モデリング 21 | # Yを推定するためのパラメータaとbが、全体平均を平均とした正規分布 22 | Y = salary2['Y'] 23 | X = salary2['X'] 24 | N = len(Y) 25 | N_group = 4 26 | KID = salary2['KID'] 27 | 28 | stan_data = { 29 | 'Y': Y, 30 | 'X': X, 31 | 'N': N, 32 | 'N_group': N_group, 33 | 'KID': KID 34 | } 35 | 36 | # コンパイル 37 | filename = '../model/model9-2-2' 38 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 39 | mcmc_sample = mcmc_result.extract() 40 | # モデルは等価なので、性能的な違いは有意には出ないが、パラメータが少なくなった分、 41 | # サンプリングにかかる時間が短くなる。 42 | # しかし、モデルによっては逆に時間がかかることもあるらしいので注意。 43 | 44 | a_hie = mcmc_sample['a'] 45 | pd_hie = pandas.DataFrame(a_hie) 46 | pd_hie.plot.box() 47 | plt.show() 48 | -------------------------------------------------------------------------------- /exec/9-3-1.py: -------------------------------------------------------------------------------- 1 | # 多変量正規分布はベクトルが従う分布と考えることができる。 2 | # そのためStanで扱う場合はベクトルとmatrixを使って表現する。 3 | import numpy as np 4 | import seaborn as sns 5 | import pandas 6 | import matplotlib.pyplot as plt 7 | from matplotlib.figure import figaspect 8 | from matplotlib.gridspec import GridSpec 9 | import mcmc_tools 10 | from scipy.stats import norm 11 | import time 12 | 13 | # data-mvn 14 | # 1行が1名のデータ 15 | # Y1: 50m走のタイム(sec) 16 | # Y2: 走り幅跳びで飛んだ距離(m) 17 | mvn = pandas.read_csv('data-mvn.txt') 18 | print(mvn.head()) 19 | print(mvn.describe()) 20 | 21 | # 散布図を描いてみる 22 | sns.scatterplot( 23 | x='Y1', 24 | y='Y2', 25 | data=mvn 26 | ) 27 | plt.show() 28 | # 足が速い(秒数が少ない)ほうが、幅跳びの距離が大きくなる 29 | # 負の相関が見られる。 30 | 31 | # モデリング 32 | # ここでは各人ごとに平均ベクトルと分散共分散行列をもつ多変量正規分布から 33 | # Y1とY2のベクトルデータ(2次元)が観測されるとする。 34 | Y1 = mvn['Y1'] 35 | Y2 = mvn['Y2'] 36 | N = len(Y1) 37 | D = 2 38 | 39 | stan_data = { 40 | 'N': N, 41 | 'D': D, 42 | 'Y': mvn 43 | } 44 | 45 | # コンパイル 46 | filename = '../model/model9-3-1' 47 | start_1 = time.time() 48 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 49 | elapsed_time_1 = time.time() - start_1 50 | 51 | # ベクトル化による高速化 52 | filename = '../model/model9-3-1-vec' 53 | start_2 = time.time() 54 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 55 | elapsed_time_2 = time.time() - start_2 56 | 57 | print("elapsed_time:{0}".format(elapsed_time_1) + "[sec]") 58 | print("elapsed_time:{0}".format(elapsed_time_2) + "[sec]") 59 | 60 | -------------------------------------------------------------------------------- /exec/9-3-2.py: -------------------------------------------------------------------------------- 1 | # 年齢と年収の関係の問題の説明変数が4個に増えた場合を考える。 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | from matplotlib.figure import figaspect 7 | from matplotlib.gridspec import GridSpec 8 | import mcmc_tools 9 | from scipy.stats import norm 10 | import time 11 | 12 | # data-attendance-5 13 | # 1行が1名のデータ 14 | # A: アルバイトの好き嫌い 15 | # Score: テストスコア 16 | # X3: 不明 17 | # X4: 不明 18 | # Y: 年収 19 | attendance_5 = pandas.read_csv('data-attendance-5.txt') 20 | print(attendance_5.head()) 21 | print(attendance_5.describe()) 22 | 23 | # 説明変数が多いときに、説明変数それぞれを配列にしてStanに渡すと煩雑になり面倒なので、 24 | # 行列にしてデータを渡す方法がよく使われる 25 | 26 | Y = attendance_5['Y'] 27 | 28 | # 切片と説明変数のDataFrame 29 | # もとのデータからオブジェクトをコピーしておく。 30 | X = attendance_5[['A', 'Score', 'X3', 'X4']].copy() 31 | # Scoreのスケーリング 32 | f_stand = lambda x: x/200 33 | X['Score'] = X['Score'].map(f_stand) 34 | X.insert(0, 'b', 1) 35 | 36 | N = len(Y) 37 | D = len(X.columns) 38 | 39 | stan_data = { 40 | 'N': N, 41 | 'D': D, 42 | 'X': X, 43 | 'Y': Y 44 | } 45 | 46 | # コンパイル 47 | filename = '../model/model9-3-2' 48 | start_1 = time.time() 49 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 50 | elapsed_time_1 = time.time() - start_1 51 | print("elapsed_time:{0}".format(elapsed_time_1) + "[sec]") 52 | 53 | # 実測値と予測値のプロット 54 | # 5-1(model5-3.stan)のプロットよりも、予測と実測値のズレが小さくなっている。(y=x に近づいている) 55 | quantile = [10, 50, 90] 56 | colname = ['p' + str(x) for x in quantile] 57 | print(np.percentile(mcmc_result['y_pred'], q=quantile, axis=0)) 58 | attendance_5_pred = pandas.DataFrame(np.percentile(mcmc_result['y_pred'], q=quantile, axis=0).T, columns=colname) 59 | d = pandas.concat([attendance_5, attendance_5_pred], axis=1) 60 | d0 = d.query('A==0') 61 | d1 = d.query('A==1') 62 | plt.plot([0,0.5], [0,0.5], 'k--', alpha=0.7) 63 | plt.errorbar(d0.Y, d0.p50, yerr=[d0.p50 - d0.p10, d0.p90 - d0.p50], 64 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3) 65 | plt.errorbar(d1.Y, d1.p50, yerr=[d1.p50 - d1.p10, d1.p90 - d1.p50], 66 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='^', mfc='green', capsize=3) 67 | ax = plt.axes() 68 | ax.set_aspect('equal') 69 | plt.xlabel('Observed', fontsize=12) 70 | plt.ylabel('Predicted', fontsize=12) 71 | plt.show() -------------------------------------------------------------------------------- /exec/9-4-1.py: -------------------------------------------------------------------------------- 1 | # パラメータに制約を入れるいくつかの方法 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | from matplotlib.figure import figaspect 7 | from matplotlib.gridspec import GridSpec 8 | import mcmc_tools 9 | from scipy.stats import norm 10 | import time 11 | 12 | # data-dice.txt 13 | # 200回分のサイコロを降った結果の記録 14 | # Face: 出た目 15 | dice = pandas.read_csv('data-dice.txt') 16 | print(dice) 17 | print(dice.head()) 18 | print(dice.describe()) 19 | 20 | # カテゴリカルな問題では、試行ごとに扱うよりも集計をとって多項分布を使ったほうがはるかに高速であるらしい。 21 | Y = dice['Face'].value_counts().sort_index() 22 | K = len(Y) 23 | 24 | stan_data = { 25 | 'Y': Y, 26 | 'K': K 27 | } 28 | # コンパイル 29 | filename = '../model/model9-4-1' 30 | start_1 = time.time() 31 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 32 | elapsed_time_1 = time.time() - start_1 33 | print("elapsed_time:{0}".format(elapsed_time_1) + "[sec]") 34 | 35 | # カテゴリカルデータを1試行ずつ行った場合のモデリング(倍以上の計算時間がかかる) 36 | Y_b = dice['Face'] 37 | N = len(Y_b) 38 | 39 | stan_data_b = { 40 | 'Y': Y_b, 41 | 'N': N, 42 | 'K': K 43 | } 44 | # コンパイル 45 | filename = '../model/model9-4-1-b' 46 | start_1 = time.time() 47 | mcmc_result_b = mcmc_tools.sampling(filename, stan_data_b, n_jobs=4) 48 | elapsed_time_1 = time.time() - start_1 49 | print("elapsed_time:{0}".format(elapsed_time_1) + "[sec]") 50 | -------------------------------------------------------------------------------- /exec/9-5.py: -------------------------------------------------------------------------------- 1 | # Stanを扱ううえで役に立つトラブルシューティングを学ぶ 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | from matplotlib.figure import figaspect 7 | from matplotlib.gridspec import GridSpec 8 | import mcmc_tools 9 | from scipy.stats import norm 10 | import time 11 | 12 | 13 | # Stanではint型の整数値でパラメータを定義できない 14 | # 等価なモデル構築については、11章 15 | 16 | 17 | # 欠損値を扱う 18 | # data-conc-2-NA-wide.txt 19 | # PersonID: 人ID 20 | # Time1,2,8,12,24: 各時間における薬剤の血中濃度 21 | conc_2_na_long = pandas.read_csv('data-conc-2-NA-wide.txt') 22 | print(conc_2_na_long) 23 | print(conc_2_na_long.head()) 24 | print(conc_2_na_long.describe()) 25 | 26 | # このようなNAを含むデータは横長(列固定)ではなく、縦長(ID指定)へ変形するとStan内で測定ごとにループを回しやすくなる 27 | 28 | # data-conc-2-NA-long.txt 29 | # PersonID: 人ID 30 | # TimeID: 時間ID 31 | # Y: 薬剤の血中濃度 32 | conc_2_na_long = pandas.read_csv('data-conc-2-NA-long.txt') 33 | print(conc_2_na_long) 34 | print(conc_2_na_long.head()) 35 | print(conc_2_na_long.describe()) 36 | 37 | # 物理計算から、患者ごとに Y=a{1-exp(-bt)} に当てはめるのだが、縦長(long)になると、TimeIDを組み込む必要がある。 38 | # そのため、平均muをTimeIDごとに定義する。 39 | # aは頭打ちになるYの値、bが頭打ちになるまでの時間を決めるパラメータであり、全体の傾向を表す正規分布から生成される。 40 | Y = conc_2_na_long['Y'] 41 | I = len(Y) 42 | PersonID = conc_2_na_long['PersonID'] 43 | N = PersonID.nunique() 44 | 45 | TimeID = conc_2_na_long['TimeID'] 46 | T = TimeID.nunique() 47 | 48 | Time = np.array([1, 2, 4, 8, 12, 24]) 49 | 50 | T_new = 60 51 | Time_new = np.linspace(0, 24, T_new) 52 | 53 | stan_data = { 54 | 'I': I, 55 | 'N': N, 56 | 'T': T, 57 | 'PersonID': PersonID, 58 | 'TimeID': TimeID, 59 | 'Time': Time, 60 | 'Y': Y, 61 | 'T_new': T_new, 62 | 'Time_new': Time_new 63 | } 64 | 65 | # コンパイル 66 | filename = '../model/model9-5' 67 | start = time.time() 68 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 69 | elapsed_time = time.time() - start 70 | print("elapsed_time:{0}".format(elapsed_time) + "[sec]") 71 | 72 | 73 | # 予測分布 74 | probs = (2.5, 50, 97.5) 75 | qua = np.transpose(np.percentile(mcmc_result['y_new'], (2.5, 50, 97.5), axis=0), axes=(1, 2, 0)) 76 | d_est = pandas.DataFrame(qua.reshape((-1, 3)), columns=['p{}'.format(p) for p in probs]) 77 | d_est['PersonID'] = np.repeat(np.arange(N)+1, T_new) 78 | d_est['Time'] = np.tile(Time_new, N) 79 | 80 | print(d_est) 81 | Time_tbl = pandas.Series(Time, index=['Time{}'.format(t) for t in Time]) 82 | d = pandas.melt(conc_2_na_long, id_vars='PersonID', var_name='Time', value_name='Y') 83 | d['Time'] = Time_tbl[d['Time']].values 84 | 85 | _, axes = plt.subplots(4, 4, figsize=figaspect(7/8)*1.5) 86 | for (row, col), ax in np.ndenumerate(axes): 87 | person = row * 4+ col + 1 88 | ax.fill_between('Time', 'p2.5', 'p97.5', data=d_est.query('PersonID==@person'), color='k', alpha=1/5) 89 | ax.plot('Time', 'p50', data=d_est.query('PersonID==@person'), color='k') 90 | ax.scatter('Time', 'Y', data=d.query('PersonID==@person'), color='k') 91 | if row < 3: 92 | plt.setp(ax.get_xticklabels(), visible=False) 93 | else: 94 | plt.setp(ax, xlabel='Time (hour)') 95 | if col > 0: 96 | plt.setp(ax.get_yticklabels(), visible=False) 97 | else: 98 | plt.setp(ax, ylabel='Y') 99 | plt.setp(ax, title=person, xticks=Time, xlim=(0, 24), yticks=np.arange(0, 60, 10), ylim=(-3, 57)) 100 | plt.tight_layout() 101 | plt.show() 102 | # 結果をみると、PersonID3のデータだけ欠損値が3つあるため、信頼区間が大きく描かれることがわかる。 103 | # また、Stanで予測分布を推定しなくても、muの値を使ってPythonを利用して正規分布からデータをサンプリングすれば、同様の結果を得ることができる。 104 | 105 | 106 | -------------------------------------------------------------------------------- /exec/9-exec-2.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import seaborn as sns 3 | import pandas 4 | import mcmc_tools 5 | import matplotlib.pyplot as plt 6 | from scipy.stats import norm 7 | 8 | # ファイルの読み込み 9 | # PersonID: 学生のID 10 | # M: 3ヶ月間ヶ月間における履修登録した科目の総授業回数 11 | # Y: Mのうち出席した授業回数 12 | attendance_2 = pandas.read_csv('data-attendance-2.txt') 13 | print(attendance_2.head()) 14 | print(attendance_2.describe()) 15 | 16 | # ここでの解析の目的は、AとScoreがMにどの程度寄与しているかを判断したいとする。 17 | # 離散した数値の推定はポアソン分布による近似が第一選択。 18 | # 説明変数は、AとScore 19 | 20 | # データ準備 21 | # スケーリング 22 | Score = attendance_2['Score']/200 23 | 24 | A = attendance_2['A'] 25 | M = attendance_2['M'] 26 | N = len(M) 27 | 28 | stan_data = { 29 | 'N': N, 30 | 'Score': Score, 31 | 'A': A, 32 | 'M': M 33 | } 34 | 35 | # コンパイル 36 | filename = '../model/model-exec9-2' 37 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) 38 | mcmc_sample = mcmc_result.extract() 39 | 40 | # ポアソン分布を利用すると、 41 | # 推定の結果から、各説明変数を変化させた際に応答変数がどのように変化するか、 42 | # 例えば、Scoreが50から150になった際に、履修登録する授業回数が何倍になるか、 43 | # という計算が簡単な指数の計算で求まる。 44 | 45 | # 演習問題 5(5) 46 | # 実測値と予測値のプロット 47 | # 説明変数はAとScoreだが、ここでは応答変数とそれに対する予測値のみを扱う。もち完全に予測できれいれば、 48 | # すべて同じ数値となるが、予測値はサンプリングしているので信頼区間として表示することになる。 49 | quantile = [10, 50, 90] 50 | colname = ['p' + str(x) for x in quantile] 51 | print(np.percentile(mcmc_result['m_pred'], q=quantile, axis=0)) 52 | attendance_2_pred = pandas.DataFrame(np.percentile(mcmc_result['m_pred'], q=quantile, axis=0).T, columns=colname) 53 | # 実装値と予測値のDataFrameを作成 54 | d = pandas.concat([attendance_2, attendance_2_pred], axis=1) 55 | d0 = d.query('A==0') 56 | d1 = d.query('A==1') 57 | 58 | plt.plot([0,0.5], [0,0.5], 'k--', alpha=0.7) 59 | plt.errorbar(d0.M, d0.p50, yerr=[d0.p50 - d0.p10, d0.p90 - d0.p50], 60 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='o', mfc='blue', capsize=3, label="A=0") 61 | plt.errorbar(d1.M, d1.p50, yerr=[d1.p50 - d1.p10, d1.p90 - d1.p50], 62 | fmt='o', ecolor='gray', ms=10, alpha=0.8, marker='^', mfc='green', capsize=3, label="A=1") 63 | ax = plt.axes() 64 | ax.set_aspect('equal') 65 | plt.title('model-exec9-2') 66 | plt.legend() 67 | plt.xlabel('Observed', fontsize=20) 68 | plt.ylabel('Predicted', fontsize=20) 69 | plt.show() 70 | 71 | # 今回は、ほとんどの信頼区間がy=xを含んでいないことから、実際の値と比べて予測値が離れてしまっていることがわかる。 72 | -------------------------------------------------------------------------------- /exec/9-exec-3.py: -------------------------------------------------------------------------------- 1 | # vector同士の内積計算をStanで行う。 2 | import numpy as np 3 | import mcmc_tools 4 | 5 | a = np.array([1, 2, 3]) 6 | b = np.array([4, 5, 6]) 7 | 8 | ra = np.array([1, 2, 3]) 9 | 10 | stan_data = { 11 | 'N': 3, 12 | 'a': a, 13 | 'b': b, 14 | 'ra': ra 15 | } 16 | 17 | # コンパイル 18 | filename = '../model/model-exec9-3' 19 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, algorithm='Fixed_param') 20 | mcmc_sample = mcmc_result.extract() 21 | 22 | ip = np.inner(a, b) 23 | print(ip) -------------------------------------------------------------------------------- /exec/9-exec-4.py: -------------------------------------------------------------------------------- 1 | # model8-2.stanのベクトル化 2 | import numpy as np 3 | import seaborn as sns 4 | import pandas 5 | import matplotlib.pyplot as plt 6 | import mcmc_tools 7 | from scipy.stats import norm 8 | from sklearn.linear_model import LinearRegression 9 | 10 | 11 | # 年収ファイル3 12 | # X: 年齢、実際からマイナス23(新卒の年齢を23とし、所属年数として扱うため) 13 | # Y: 年収 14 | # KID: 勤務している会社のID(1~30)30社 15 | # GID: 業界のID(1~3) 16 | salary3 = pandas.read_csv('data-salary-3.txt') 17 | print(salary3.head()) 18 | print(salary3.describe()) 19 | 20 | # データの図示 21 | sns.scatterplot( 22 | x='X', 23 | y='Y', 24 | hue='GID', 25 | data=salary3 26 | ) 27 | plt.show() 28 | 29 | # モデリング 30 | # 会社ごとに切片と線形結合係数を想定し、それらが全体平均と業界平均から構成されていると考える。 31 | # 業界平均は全体平均を平均とした正規分布から観測されると考える。 32 | # 各会社ごとの切片と線形結合係数は、業界平均を平均とした正規分布から観測されると考える。 33 | 34 | Y = salary3['Y'] 35 | X = salary3['X'] 36 | N = len(Y) 37 | N_group = 30 38 | KID = salary3['KID'] 39 | N_industry = 3 40 | GID = salary3['GID'] 41 | 42 | # 会社IDから業界IDを取得するデータを取得する配列を作成 43 | K2G = salary3.drop_duplicates(subset=['KID', 'GID'])['GID'] 44 | 45 | stan_data = { 46 | 'Y': Y, 47 | 'X': X, 48 | 'N': N, 49 | 'N_group': N_group, 50 | 'N_industry': N_industry, 51 | 'KID': KID, 52 | 'K2G': K2G, 53 | 'GID': GID 54 | } 55 | 56 | # コンパイル 57 | filename = '../model/model-exec9-4' 58 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) 59 | mcmc_sample = mcmc_result.extract() -------------------------------------------------------------------------------- /exec/9-exec-5.py: -------------------------------------------------------------------------------- 1 | # minとfminの引数の型 2 | 3 | # min 4 | # https://mc-stan.org/docs/2_22/functions-reference/reductions.html 5 | # vectorまたはmatrixをとれる 6 | 7 | # fmin 8 | # https://mc-stan.org/docs/2_22/functions-reference/step-functions.html 9 | # real型の値を2つとれる 10 | 11 | import numpy as np 12 | import mcmc_tools 13 | 14 | x = np.array([1, 2, 3]) 15 | a = 10 16 | b = 20 17 | 18 | stan_data = { 19 | 'N': 3, 20 | 'x': x, 21 | 'a': a, 22 | 'b': b 23 | } 24 | 25 | # コンパイル 26 | filename = '../model/model-exec9-5' 27 | mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, algorithm='Fixed_param') 28 | mcmc_sample = mcmc_result.extract() -------------------------------------------------------------------------------- /exec/README.md: -------------------------------------------------------------------------------- 1 | # Description 2 | ## chap.4 3 | 最も基本的なベイジアンモデリングとして単回帰を実装します。 4 | 5 | 6 | ## chap.5 7 | 回帰問題を扱うための基本的なモデルを実装します。 8 | - 重回帰 9 | - ロジスティック回帰 10 | - ポアソン回帰 11 | 12 | 13 | ## chap.6 14 | モデリングに必要な確率分布の紹介とサンプリングを実装します。 15 | 16 | 17 | ## chap.7 18 | 回帰分析を行う際の説明変数の工夫や多重共線性(日本ではマルチコとも呼ぶ)などの問題への対処法を実装します。 19 | - 交互作用 20 | - 対数 21 | - 非線形 22 | - 多重共線性 23 | - 交絡 24 | - パラメータの数、ノイズ 25 | - 打ち切り 26 | - 外れ値 27 | 28 | ## chap.8 29 | ベイジアンモデリングの良い点を発揮しやすい、階層モデルを実装します。 30 | 31 | 32 | ## chap.9 33 | ベクトル化を実装します。 34 | 35 | 36 | ## chap.10 37 | 収束しない問題への対処法を実装します。 38 | 39 | 40 | ## chap.11 41 | 離散値をとるパラメータに対する周辺化を実装します。 42 | 43 | 44 | ## chap.12 45 | 状態空間モデルを使った時系列や空間を扱うモデルを実装します。 46 | 47 | 48 | --- 49 | Copyright (c) 2020 Masahiro Imai Released under the MIT license 50 | -------------------------------------------------------------------------------- /exec/analysis_data.py: -------------------------------------------------------------------------------- 1 | import pandas 2 | import matplotlib.pyplot as plt 3 | import seaborn as sns 4 | 5 | 6 | class AnalysisData(): 7 | def __init__(self, file: str, model_file: str): 8 | self.file = file 9 | self.data = pandas.read_csv(file) 10 | self.model_file = model_file 11 | 12 | def describe(self): 13 | print(self.data.head()) 14 | print(self.data.describe()) 15 | 16 | def hist(self): 17 | ax = self.data.plot.hist(bins=30, alpha=0.5, legend=True) 18 | self.data.plot.kde(legend=True, alpha=0.5, secondary_y=True, ax=ax) 19 | plt.show() 20 | 21 | def observe(self, hue): 22 | sns.pairplot(self.data, diag_kind='hist', hue=hue) 23 | plt.show() 24 | plt.close() 25 | 26 | 27 | class AnalysisData2Dim(): 28 | def __init__(self, file: str, file2: str, model_file: str): 29 | self.file = file 30 | self.data = pandas.read_csv(file, header=None) 31 | self.process = pandas.read_csv(file2, header=None) 32 | self.model_file = model_file 33 | 34 | def describe(self): 35 | print(self.data.head()) 36 | print(self.data.describe()) 37 | 38 | print(self.process.head()) 39 | print(self.process.describe()) 40 | -------------------------------------------------------------------------------- /exec/d1.csv: -------------------------------------------------------------------------------- 1 | id,pot,f,y 2 | 1,A,C,6 3 | 2,A,C,3 4 | 3,A,C,19 5 | 4,A,C,5 6 | 5,A,C,0 7 | 6,A,C,19 8 | 7,A,C,4 9 | 8,A,C,8 10 | 9,A,C,12 11 | 10,A,C,8 12 | 11,B,C,0 13 | 12,B,C,1 14 | 13,B,C,1 15 | 14,B,C,5 16 | 15,B,C,7 17 | 16,B,C,4 18 | 17,B,C,0 19 | 18,B,C,4 20 | 19,B,C,2 21 | 20,B,C,23 22 | 21,C,C,2 23 | 22,C,C,1 24 | 23,C,C,4 25 | 24,C,C,3 26 | 25,C,C,4 27 | 26,C,C,0 28 | 27,C,C,1 29 | 28,C,C,1 30 | 29,C,C,3 31 | 30,C,C,6 32 | 31,D,C,27 33 | 32,D,C,3 34 | 33,D,C,29 35 | 34,D,C,17 36 | 35,D,C,1 37 | 36,D,C,16 38 | 37,D,C,16 39 | 38,D,C,6 40 | 39,D,C,4 41 | 40,D,C,8 42 | 41,E,C,6 43 | 42,E,C,16 44 | 43,E,C,8 45 | 44,E,C,3 46 | 45,E,C,2 47 | 46,E,C,8 48 | 47,E,C,4 49 | 48,E,C,0 50 | 49,E,C,0 51 | 50,E,C,2 52 | 51,F,T,2 53 | 52,F,T,2 54 | 53,F,T,0 55 | 54,F,T,0 56 | 55,F,T,1 57 | 56,F,T,0 58 | 57,F,T,0 59 | 58,F,T,1 60 | 59,F,T,0 61 | 60,F,T,1 62 | 61,G,T,11 63 | 62,G,T,2 64 | 63,G,T,2 65 | 64,G,T,18 66 | 65,G,T,3 67 | 66,G,T,8 68 | 67,G,T,7 69 | 68,G,T,3 70 | 69,G,T,1 71 | 70,G,T,0 72 | 71,H,T,7 73 | 72,H,T,0 74 | 73,H,T,0 75 | 74,H,T,0 76 | 75,H,T,1 77 | 76,H,T,1 78 | 77,H,T,0 79 | 78,H,T,0 80 | 79,H,T,1 81 | 80,H,T,1 82 | 81,I,T,10 83 | 82,I,T,2 84 | 83,I,T,11 85 | 84,I,T,4 86 | 85,I,T,3 87 | 86,I,T,16 88 | 87,I,T,4 89 | 88,I,T,37 90 | 89,I,T,5 91 | 90,I,T,19 92 | 91,J,T,27 93 | 92,J,T,1 94 | 93,J,T,1 95 | 94,J,T,2 96 | 95,J,T,0 97 | 96,J,T,1 98 | 97,J,T,1 99 | 98,J,T,2 100 | 99,J,T,1 101 | 100,J,T,0 102 | -------------------------------------------------------------------------------- /exec/data-2Dmesh-design.txt: -------------------------------------------------------------------------------- 1 | 88,84,60,36,63,91,45,76,73,31,55,42,33,87,80,55,17,10,70,9,58,53,7,92 2 | 81,96,35,58,53,80,18,6,55,86,32,34,16,82,40,88,57,7,90,8,20,35,17,26 3 | 51,61,51,39,79,38,70,93,33,12,37,54,3,45,35,41,64,67,15,6,95,5,88,56 4 | 15,22,1,56,29,22,34,43,30,27,54,78,2,24,1,55,52,27,94,47,39,87,25,71 5 | 18,4,76,22,18,30,69,92,9,14,85,28,64,4,81,7,62,17,92,66,61,21,43,77 6 | 26,52,16,35,22,58,11,89,64,9,96,29,16,89,68,46,10,56,19,44,93,36,50,14 7 | 59,28,44,36,61,54,24,73,49,74,23,49,29,83,78,13,57,74,21,76,69,95,90,71 8 | 87,48,68,8,53,70,40,12,10,3,47,23,24,62,3,33,92,13,14,46,39,6,54,89 9 | 31,68,1,18,84,74,14,95,85,49,93,71,73,69,46,81,83,69,8,19,27,66,56,10 10 | 28,91,72,40,2,41,65,70,30,38,78,71,74,91,90,5,26,6,17,42,1,20,47,41 11 | 86,15,38,65,77,59,72,45,86,78,5,52,11,60,31,58,66,15,59,81,44,30,60,29 12 | 73,64,24,87,79,75,11,75,4,23,16,50,91,62,83,23,96,36,77,95,12,43,28,57 13 | 2,48,67,72,13,11,89,67,21,94,42,63,19,93,61,84,60,19,37,34,80,57,79,68 14 | 94,63,37,41,51,21,45,84,7,82,39,31,53,51,43,38,88,62,46,2,40,96,79,48 15 | 75,75,59,65,85,76,32,32,82,83,34,77,82,3,25,25,4,13,42,90,47,20,86,50 16 | 63,33,37,27,94,48,49,5,8,50,20,65,12,52,66,85,25,80,72,32,67,44,26,9 17 | -------------------------------------------------------------------------------- /exec/data-2Dmesh.txt: -------------------------------------------------------------------------------- 1 | 1.09,1.16,0.63,1.36,3.08,4.04,2.68,4.72,3.61,4.65,2.63,1.33,1.81,3.69,2.64,3.09,2.12,1.97,3.49,2.22,2.5,1.54,1.83,2.06 2 | 1.39,1.85,0.49,1.88,2.54,3.75,3.86,5.8,4.31,4.86,2.71,2.27,2.67,3.06,2.51,3.02,5.32,2.9,1.78,3.18,6.32,1.17,1.54,0.01 3 | -0.81,2.24,0.27,2.81,4.16,3.46,6.18,8.22,5.08,4.32,1.72,2.97,5.33,2.5,2.75,6.12,3.49,3.15,6.03,5.03,3.64,3.91,2.48,2.86 4 | 2.72,1.46,1.28,4.64,4.98,5.5,6.28,6.53,5.99,7.05,4.5,4.53,5.21,5.24,3.45,5.19,4.53,6.14,7.07,4.3,5.19,4.94,2.3,2.3 5 | 0.87,-0.49,3.59,4.59,5.12,5.96,10.02,8.8,7.38,7.73,7.29,5.32,5.15,3.64,5.7,5.58,9.37,5.91,7,8.4,6.99,4.85,2.5,0.7 6 | 0.15,2.32,4.83,4.38,7.06,8.22,9.21,9.81,8.71,8.16,7.95,7.77,7.4,7.03,9.07,6.34,6.37,7.8,5.99,6.51,8.47,3.73,2.88,2.42 7 | 4.15,2.1,5.26,5.81,9.97,9.19,11.45,10.41,9.7,10.44,8.73,8.22,8.89,7.22,7.64,7.37,9.83,7.95,7.7,6.83,8.36,4.41,2.4,2.89 8 | 3.85,2.22,8.11,7.48,8.96,11.6,10.8,9.81,9.32,11.69,8.64,9.82,10.21,12.61,10.83,8.1,8.12,6.44,6.83,5.64,5.53,5.16,2.56,2.67 9 | 4.8,6.53,5.95,7.96,10.32,12.54,11.48,9.79,10.73,9.07,11.64,10.06,8.97,11,7.82,7.96,5.95,8.85,5.08,4.77,6.33,6.31,4.36,1.7 10 | 2.96,5.28,6.87,9.09,11.65,13.44,10.99,9.63,7.86,7.06,8.08,9.76,10.35,8.65,7.19,8.45,5.17,6.89,5.22,3.83,2.83,6.43,1.9,4.27 11 | 5.14,6.45,6.46,9.96,9.42,13.37,10.66,7.91,9.51,7.53,9.07,8.41,7.9,6.72,8.63,5.95,8.63,7.17,7.47,4.66,3.61,2.27,1.5,2.01 12 | 4.04,4.27,8.2,9.7,11.23,13.66,10.14,12.21,6.38,8.72,8.54,8,7.27,9.69,4.68,5.89,6.87,4.65,3.68,4.02,2.68,1.84,0.89,3.68 13 | 4.39,3.1,5.06,7.6,8.69,10.12,10.43,8.98,9.91,10.88,7.32,8.07,5.67,8.08,6.24,5.13,3.72,4.53,2.5,3.84,3.19,4.59,2.01,2.96 14 | 3.68,3.38,2.48,8.16,5.65,9.55,8.92,10.46,9.84,9.48,8.1,9.14,4.46,3.04,3.79,2.78,3.8,7.53,2.66,3.74,1.91,1.89,1.27,-0.64 15 | 5.3,5.34,6.13,5.13,7.68,7.46,8.05,9.41,9.96,7.08,7.24,4.8,5.38,5.74,2.97,2.66,0.42,2.14,1.45,0.74,0.44,4.14,1.57,0.05 16 | 1.69,1.64,0.42,4.52,6.28,4.29,6.36,8.64,7.32,7.29,9.79,5.22,2.99,2.99,5.74,3.71,1.5,2.1,1.32,0.9,-0.02,0.68,-1.13,-0.33 17 | -------------------------------------------------------------------------------- /exec/data-50m.txt: -------------------------------------------------------------------------------- 1 | Y,Weight,Age 2 | 2.46,16.6,7 3 | 3.02,21.4,7 4 | 2.91,24,7 5 | 3.05,13,7 6 | 2.6,21.9,7 7 | 2.45,22.1,7 8 | 2.61,18.7,7 9 | 2.91,18.8,7 10 | 3.34,18.7,7 11 | 3.17,21.5,8 12 | 2.75,22.8,8 13 | 3.02,21.1,8 14 | 3.29,21.8,8 15 | 3,24.5,8 16 | 2.93,27.4,8 17 | 3.07,23.9,8 18 | 2.76,22.7,8 19 | 3.17,21.4,8 20 | 3.47,21.6,8 21 | 3.01,32,8 22 | 3.26,24.7,8 23 | 3.51,26.5,9 24 | 3.56,26.7,9 25 | 3.15,29.6,9 26 | 3.64,25.9,9 27 | 3.83,23.5,9 28 | 4.01,29.9,9 29 | 4,24.8,9 30 | 3.42,28.1,9 31 | 3.79,25.1,9 32 | 3.09,31.6,9 33 | 4.35,30.4,10 34 | 4.41,29.6,10 35 | 4.72,30.3,10 36 | 4.36,26.7,10 37 | 4.03,28.2,10 38 | 4.32,24.9,10 39 | 4.05,27.6,10 40 | 3.81,31,10 41 | 4.13,30.4,10 42 | 3.57,36.5,10 43 | 4.21,28.5,10 44 | 4.24,29.2,10 45 | 4.04,31,10 46 | 4.09,28.7,10 47 | 3.95,28.8,10 48 | 4.29,32.2,11 49 | 4.9,31.7,11 50 | 4.56,34,11 51 | 4.8,34.1,11 52 | 4.34,29.9,11 53 | 4.61,33.8,11 54 | 4.82,32.2,11 55 | 4.6,32.5,11 56 | 4.44,35.2,11 57 | 4.18,37.5,11 58 | 4.89,41,11 59 | 4.81,33.2,11 60 | 5.28,44.6,12 61 | 5.11,35.8,12 62 | 4.67,41.6,12 63 | 4.16,47.7,12 64 | 4.75,39.4,12 65 | 5.09,37.4,12 66 | 5.24,39.5,12 67 | 4.79,45.2,12 68 | -------------------------------------------------------------------------------- /exec/data-ZIP.txt: -------------------------------------------------------------------------------- 1 | Sex,Sake,Age,Y 2 | 0,1,18,5 3 | 1,0,18,2 4 | 1,1,18,1 5 | 0,0,19,3 6 | 0,0,19,5 7 | 1,0,19,7 8 | 0,1,20,5 9 | 0,0,20,0 10 | 0,0,21,8 11 | 0,0,21,8 12 | 0,0,21,0 13 | 0,1,21,7 14 | 0,0,21,6 15 | 1,0,22,0 16 | 0,0,22,0 17 | 1,0,22,1 18 | 0,1,22,4 19 | 0,0,22,0 20 | 1,0,23,0 21 | 1,0,23,3 22 | 0,0,23,0 23 | 1,0,23,0 24 | 1,0,23,4 25 | 1,0,23,8 26 | 0,1,23,7 27 | 0,0,23,3 28 | 0,0,23,7 29 | 0,0,24,0 30 | 1,0,24,2 31 | 1,1,24,4 32 | 1,1,25,0 33 | 0,0,25,9 34 | 0,0,26,0 35 | 0,1,26,7 36 | 0,0,26,0 37 | 0,0,26,0 38 | 0,0,26,9 39 | 1,0,26,4 40 | 0,0,26,6 41 | 1,0,26,1 42 | 0,0,26,13 43 | 1,0,27,5 44 | 0,1,27,7 45 | 1,0,27,1 46 | 0,1,27,6 47 | 1,1,27,2 48 | 0,1,28,10 49 | 1,0,28,0 50 | 1,0,28,2 51 | 1,0,28,1 52 | 0,0,28,6 53 | 0,0,28,9 54 | 0,0,28,0 55 | 0,0,28,9 56 | 0,0,29,8 57 | 1,1,29,3 58 | 0,1,29,11 59 | 0,1,29,4 60 | 0,0,30,0 61 | 1,0,30,6 62 | 1,1,30,3 63 | 1,0,30,1 64 | 1,0,30,4 65 | 1,0,30,3 66 | 0,0,31,0 67 | 0,0,31,0 68 | 0,0,31,5 69 | 0,0,31,0 70 | 0,0,32,8 71 | 0,1,32,7 72 | 1,0,32,2 73 | 0,1,32,4 74 | 0,0,32,0 75 | 0,1,32,7 76 | 1,0,32,6 77 | 1,0,32,5 78 | 1,0,32,0 79 | 0,0,33,0 80 | 0,0,33,0 81 | 1,1,33,4 82 | 1,0,33,2 83 | 0,1,33,11 84 | 0,0,33,10 85 | 0,0,33,5 86 | 0,1,33,0 87 | 0,0,33,0 88 | 0,0,34,0 89 | 0,0,34,0 90 | 0,0,34,0 91 | 1,1,34,2 92 | 0,1,34,7 93 | 0,0,35,11 94 | 0,0,35,0 95 | 1,1,35,3 96 | 1,0,35,6 97 | 1,1,35,4 98 | 1,0,35,1 99 | 0,0,36,0 100 | 0,0,36,0 101 | 1,1,36,5 102 | 1,0,36,0 103 | 0,0,36,0 104 | 1,0,36,6 105 | 1,0,37,0 106 | 1,0,37,5 107 | 0,0,37,9 108 | 0,0,38,0 109 | 0,0,38,0 110 | 0,1,38,10 111 | 0,0,38,0 112 | 0,0,38,2 113 | 0,0,38,0 114 | 1,1,39,6 115 | 0,0,39,10 116 | 0,1,39,6 117 | 1,0,39,8 118 | 1,0,39,5 119 | 0,1,40,8 120 | 0,0,40,9 121 | 1,1,40,3 122 | 1,0,40,6 123 | 0,0,40,5 124 | 0,0,41,9 125 | 1,0,41,0 126 | 0,0,41,0 127 | 0,0,41,11 128 | 1,1,41,3 129 | 0,0,41,0 130 | 0,1,41,5 131 | 1,0,42,6 132 | 1,1,42,6 133 | 0,0,42,7 134 | 1,0,42,9 135 | 1,1,42,2 136 | 0,0,42,0 137 | 0,1,43,12 138 | 1,0,43,0 139 | 1,1,43,0 140 | 1,0,43,5 141 | 1,0,43,4 142 | 0,1,43,0 143 | 0,0,43,0 144 | 0,1,44,7 145 | 0,0,44,0 146 | 0,1,44,9 147 | 0,1,44,6 148 | 1,0,44,0 149 | 0,1,44,4 150 | 0,1,45,8 151 | 1,0,45,0 152 | 0,0,46,0 153 | 1,0,46,4 154 | 0,0,46,0 155 | 0,1,46,8 156 | 1,0,46,6 157 | 1,0,46,3 158 | 1,0,47,8 159 | 0,0,47,11 160 | 0,0,47,0 161 | 1,0,47,7 162 | 0,0,48,0 163 | 0,1,48,15 164 | 1,1,48,0 165 | 0,0,48,0 166 | 0,0,48,0 167 | 1,0,48,9 168 | 0,0,49,0 169 | 0,1,49,12 170 | 0,0,50,0 171 | 0,1,50,9 172 | 0,0,50,7 173 | 0,1,50,9 174 | 1,0,51,0 175 | 0,0,51,15 176 | 0,1,51,9 177 | 1,1,51,6 178 | 1,0,51,3 179 | 0,0,51,0 180 | 0,0,51,0 181 | 1,0,51,0 182 | 0,1,52,12 183 | 1,1,52,2 184 | 0,1,52,9 185 | 1,0,52,5 186 | 0,1,52,17 187 | 1,0,52,6 188 | 0,0,53,0 189 | 0,0,53,0 190 | 0,1,53,10 191 | 0,0,54,15 192 | 1,0,54,0 193 | 0,0,54,0 194 | 1,1,54,5 195 | 1,0,54,4 196 | 0,0,54,13 197 | 0,1,55,6 198 | 0,0,55,0 199 | 0,0,55,0 200 | 0,1,55,12 201 | 1,0,55,6 202 | -------------------------------------------------------------------------------- /exec/data-aircon.txt: -------------------------------------------------------------------------------- 1 | X,Y 2 | -2.1,98.2 3 | -1.9,109.3 4 | -1.3,95.4 5 | -1.4,93.5 6 | -1.3,95.5 7 | -0.8,91.5 8 | -0.8,99.5 9 | -1,95.1 10 | -0.7,96.4 11 | -0.5,87.4 12 | 0,87.3 13 | 0,84.2 14 | 0.2,85.1 15 | 0.3,78.5 16 | 0.4,75.8 17 | 1,89.7 18 | 1,82.3 19 | 0.6,74.2 20 | 1.4,72.4 21 | 1.3,69.6 22 | 1.4,88.4 23 | 1.7,80.8 24 | 1.7,71.7 25 | 2,74.6 26 | 2.2,67.7 27 | 2.1,67.6 28 | 2.8,61.1 29 | 2.9,61.9 30 | 2.8,75.2 31 | 3.4,61.2 32 | 3.4,62.1 33 | 3.5,62.5 34 | 3.9,65.5 35 | 4.1,54.5 36 | 4.2,50.7 37 | 4.4,65 38 | 4.5,52 39 | 4.6,50.1 40 | 4.7,46.4 41 | 4.9,45.1 42 | 5,48.5 43 | 5.3,53.7 44 | 5.3,56.7 45 | 6.1,49.6 46 | 6.1,43.6 47 | 5.8,47.6 48 | 6.1,41.5 49 | 6.3,40.5 50 | 6.7,47.5 51 | 6.7,36.6 52 | 7,52.3 53 | 7.1,40 54 | 7.3,40.9 55 | 7.7,33.3 56 | 7.6,34.9 57 | 8.1,28.3 58 | 7.7,36.7 59 | 8.3,37.4 60 | 8.4,36.5 61 | 8.6,29.4 62 | 8.8,28.4 63 | 8.8,30.1 64 | 9,40.6 65 | 9.1,25.4 66 | 9.2,30.2 67 | 9.7,40.3 68 | 9.9,28.1 69 | 10,20.6 70 | 10.3,23.3 71 | 10.7,28.5 72 | 10.4,24.7 73 | 10.2,24.3 74 | 11.1,22.7 75 | 10.9,25.7 76 | 11.1,33.7 77 | 11.6,22.5 78 | 11.5,29.4 79 | 11.5,26.9 80 | 12,21.4 81 | 12.1,13 82 | 12.3,18.2 83 | 12.6,17.7 84 | 12.6,20.7 85 | 13,26.9 86 | 13,32.6 87 | 13.3,27.7 88 | 13.6,17.4 89 | 13.6,8.1 90 | 13.7,15.8 91 | 14.1,17.6 92 | 14.3,21.7 93 | 14.4,22.2 94 | 14.5,20.4 95 | 14.5,8.6 96 | 15.1,20.5 97 | 14.9,13.4 98 | 15.6,16 99 | 15.6,15.4 100 | 15.5,17.6 101 | 15.5,15.3 102 | 15.7,5.3 103 | 16.1,18.7 104 | 16.2,16.6 105 | 16.3,12.7 106 | 16.4,14.9 107 | 16.8,14.7 108 | 16.8,15.2 109 | 16.8,23.3 110 | 17.2,12.5 111 | 17.7,14.5 112 | 17.5,20.3 113 | 18,19.5 114 | 17.7,20.1 115 | 18.2,10.2 116 | 18.5,24.9 117 | 18.6,13.9 118 | 18.8,24.2 119 | 18.8,5.9 120 | 18.9,13.7 121 | 19.1,20.8 122 | 19.5,9.8 123 | 19.4,9.5 124 | 19.7,8.7 125 | 19.9,8.2 126 | 20.5,12.2 127 | 20.2,16.3 128 | 20.6,3.3 129 | 20.7,16.1 130 | 20.7,21.9 131 | 21,26.9 132 | 21.5,23.4 133 | 21.5,20.2 134 | 21.6,6.2 135 | 21.7,12.8 136 | 21.5,14 137 | 22.4,21.3 138 | 22,16.1 139 | 22.6,10.7 140 | 23.1,28.3 141 | 22.6,22.9 142 | 23.2,20.3 143 | 23.2,25.8 144 | 23.1,11.1 145 | 23.3,22.9 146 | 23.4,16.5 147 | 23.8,24.3 148 | 23.8,20.1 149 | 24.4,25.6 150 | 24.9,30.9 151 | 24.4,21.9 152 | 25,29.4 153 | 25.1,17.3 154 | 25.2,20.3 155 | 25.2,32.8 156 | 25.5,27.4 157 | 25.7,14 158 | 26,19.1 159 | 26,25.7 160 | 26.4,33.4 161 | 26.3,27.5 162 | 26.8,33.4 163 | 26.6,34.4 164 | 26.7,39 165 | 27.8,34 166 | 27.2,31.2 167 | 27.6,22.8 168 | 27.8,34.4 169 | 27.8,30.3 170 | 28.1,29.7 171 | 28.3,34.9 172 | 28.3,41.9 173 | 28.6,25.9 174 | 28.7,35.5 175 | 29.4,41.5 176 | 29,33.9 177 | 29.1,41.4 178 | 29.5,43.8 179 | 29.7,42.4 180 | 29.9,29.6 181 | 29.9,58.3 182 | -------------------------------------------------------------------------------- /exec/data-attendance-1.txt: -------------------------------------------------------------------------------- 1 | A,Score,Y 2 | 0,69,0.286 3 | 1,145,0.196 4 | 0,125,0.261 5 | 1,86,0.109 6 | 1,158,0.23 7 | 0,133,0.35 8 | 0,111,0.33 9 | 1,147,0.194 10 | 0,146,0.413 11 | 0,145,0.36 12 | 1,141,0.225 13 | 0,137,0.423 14 | 1,118,0.186 15 | 0,111,0.287 16 | 0,109,0.371 17 | 1,99,0.183 18 | 0,114,0.345 19 | 0,82,0.264 20 | 0,185,0.413 21 | 1,156,0.316 22 | 1,86,0.062 23 | 1,108,0.272 24 | 1,106,0.229 25 | 1,143,0.195 26 | 1,117,0.097 27 | 1,128,0.137 28 | 0,119,0.337 29 | 0,119,0.307 30 | 0,161,0.383 31 | 0,113,0.253 32 | 1,165,0.249 33 | 1,74,0.027 34 | 1,138,0.099 35 | 1,124,0.149 36 | 0,126,0.391 37 | 0,131,0.311 38 | 1,105,0.171 39 | 0,110,0.207 40 | 0,89,0.26 41 | 0,88,0.293 42 | 0,129,0.36 43 | 0,133,0.356 44 | 0,122,0.289 45 | 0,148,0.328 46 | 0,182,0.383 47 | 0,105,0.302 48 | 0,51,0.133 49 | 0,150,0.353 50 | 0,99,0.268 51 | 1,99,0.234 52 | -------------------------------------------------------------------------------- /exec/data-attendance-2.txt: -------------------------------------------------------------------------------- 1 | PersonID,A,Score,M,Y 2 | 1,0,69,43,38 3 | 2,1,145,56,40 4 | 3,0,125,32,24 5 | 4,1,86,45,33 6 | 5,1,158,33,23 7 | 6,0,133,61,60 8 | 7,0,111,49,35 9 | 8,1,147,76,47 10 | 9,0,146,78,63 11 | 10,0,145,64,57 12 | 11,1,141,34,18 13 | 12,0,137,44,30 14 | 13,1,118,53,33 15 | 14,0,111,40,28 16 | 15,0,109,56,46 17 | 16,1,99,59,37 18 | 17,0,114,38,27 19 | 18,0,82,45,28 20 | 19,0,185,45,43 21 | 20,1,156,77,50 22 | 21,1,86,70,31 23 | 22,1,108,77,49 24 | 23,1,106,63,38 25 | 24,1,143,68,45 26 | 25,1,117,50,37 27 | 26,1,128,51,34 28 | 27,0,119,29,21 29 | 28,0,119,37,26 30 | 29,0,161,18,17 31 | 30,0,113,49,40 32 | 31,1,165,75,58 33 | 32,1,74,12,11 34 | 33,1,138,23,18 35 | 34,1,124,37,28 36 | 35,0,126,59,39 37 | 36,0,131,55,51 38 | 37,1,105,88,55 39 | 38,0,110,47,30 40 | 39,0,89,22,18 41 | 40,0,88,41,26 42 | 41,0,129,57,46 43 | 42,0,133,32,26 44 | 43,0,122,53,36 45 | 44,0,148,31,24 46 | 45,0,182,23,22 47 | 46,0,105,51,34 48 | 47,0,51,22,10 49 | 48,0,150,38,29 50 | 49,0,99,23,20 51 | 50,1,99,67,43 52 | -------------------------------------------------------------------------------- /exec/data-attendance-4-1.txt: -------------------------------------------------------------------------------- 1 | PersonID,A,Score 2 | 1,0,69 3 | 2,1,145 4 | 3,0,125 5 | 4,1,86 6 | 5,1,158 7 | 6,0,133 8 | 7,0,111 9 | 8,1,147 10 | 9,0,146 11 | 10,0,145 12 | 11,1,141 13 | 12,0,137 14 | 13,1,118 15 | 14,0,111 16 | 15,0,109 17 | 16,1,99 18 | 17,0,114 19 | 18,0,82 20 | 19,0,185 21 | 20,1,156 22 | 21,1,86 23 | 22,1,108 24 | 23,1,106 25 | 24,1,143 26 | 25,1,117 27 | 26,1,128 28 | 27,0,119 29 | 28,0,119 30 | 29,0,161 31 | 30,0,113 32 | 31,1,165 33 | 32,1,74 34 | 33,1,138 35 | 34,1,124 36 | 35,0,126 37 | 36,0,131 38 | 37,1,105 39 | 38,0,110 40 | 39,0,89 41 | 40,0,88 42 | 41,0,129 43 | 42,0,133 44 | 43,0,122 45 | 44,0,148 46 | 45,0,182 47 | 46,0,105 48 | 47,0,51 49 | 48,0,150 50 | 49,0,99 51 | 50,1,99 52 | -------------------------------------------------------------------------------- /exec/data-attendance-5.txt: -------------------------------------------------------------------------------- 1 | A,Score,X3,X4,Y 2 | 0,69,-0.56,1.2,0.286 3 | 1,145,-0.23,0.67,0.196 4 | 0,125,1.56,0.98,0.261 5 | 1,86,0.07,1.91,0.109 6 | 1,158,0.13,0.97,0.23 7 | 0,133,1.72,1.78,0.35 8 | 0,111,0.46,1.83,0.33 9 | 1,147,-1.27,1.22,0.194 10 | 0,146,-0.69,0.82,0.413 11 | 0,145,-0.45,0.29,0.36 12 | 1,141,1.22,1.87,0.225 13 | 0,137,0.36,0.6,0.423 14 | 1,118,0.4,0.12,0.186 15 | 0,111,0.11,1.9,0.287 16 | 0,109,-0.56,1.44,0.371 17 | 1,99,1.79,0.28,0.183 18 | 0,114,0.5,1.1,0.345 19 | 0,82,-1.97,1.91,0.264 20 | 0,185,0.7,1.17,0.413 21 | 1,156,-0.47,0.81,0.316 22 | 1,86,-1.07,1.3,0.062 23 | 1,108,-0.22,0.64,0.272 24 | 1,106,-1.03,0.62,0.229 25 | 1,143,-0.73,0.44,0.195 26 | 1,117,-0.63,0.74,0.097 27 | 1,128,-1.69,1.97,0.137 28 | 0,119,0.84,0.31,0.337 29 | 0,119,0.15,0.18,0.307 30 | 0,161,-1.14,0.28,0.383 31 | 0,113,1.25,1.38,0.253 32 | 1,165,0.43,1.24,0.249 33 | 1,74,-0.3,1.78,0.027 34 | 1,138,0.9,1.35,0.099 35 | 1,124,0.88,1.47,0.149 36 | 0,126,0.82,1.04,0.391 37 | 0,131,0.69,1.32,0.311 38 | 1,105,0.55,1.64,0.171 39 | 0,110,-0.06,1.57,0.207 40 | 0,89,-0.31,1.96,0.26 41 | 0,88,-0.38,0.88,0.293 42 | 0,129,-0.69,0.62,0.36 43 | 0,133,-0.21,0.82,0.356 44 | 0,122,-1.27,0.02,0.289 45 | 0,148,2.17,0.37,0.328 46 | 0,182,1.21,1.69,0.383 47 | 0,105,-1.12,0.46,0.302 48 | 0,51,-0.4,0.48,0.133 49 | 0,150,-0.47,0.15,0.353 50 | 0,99,0.78,0.49,0.268 51 | 1,99,-0.08,1.46,0.234 52 | -------------------------------------------------------------------------------- /exec/data-coin.txt: -------------------------------------------------------------------------------- 1 | Y 2 | 1 3 | 0 4 | 1 5 | 0 6 | 0 7 | 1 8 | 1 9 | 0 10 | 1 11 | 1 12 | 0 13 | 1 14 | 0 15 | 1 16 | 1 17 | 0 18 | 1 19 | 1 20 | 1 21 | 0 22 | 0 23 | 0 24 | 0 25 | 0 26 | 0 27 | 0 28 | 1 29 | 1 30 | 1 31 | 1 32 | 0 33 | 0 34 | 0 35 | 0 36 | 1 37 | 1 38 | 0 39 | 1 40 | 1 41 | 1 42 | 1 43 | 1 44 | 1 45 | 1 46 | 1 47 | 1 48 | 1 49 | 1 50 | 1 51 | 0 52 | 1 53 | 1 54 | 0 55 | 1 56 | 1 57 | 1 58 | 1 59 | 0 60 | 0 61 | 1 62 | 0 63 | 1 64 | 1 65 | 1 66 | 0 67 | 1 68 | 0 69 | 0 70 | 0 71 | 1 72 | 0 73 | 0 74 | 0 75 | 1 76 | 1 77 | 1 78 | 1 79 | 0 80 | 1 81 | 1 82 | 1 83 | 0 84 | 1 85 | 0 86 | 1 87 | 1 88 | 0 89 | 0 90 | 0 91 | 1 92 | 1 93 | 0 94 | 1 95 | 0 96 | 1 97 | 1 98 | 0 99 | 1 100 | 1 101 | 1 102 | -------------------------------------------------------------------------------- /exec/data-conc-2-NA-long.txt: -------------------------------------------------------------------------------- 1 | PersonID,TimeID,Y 2 | 1,1,2.4 3 | 3,1,5.2 4 | 4,1,6.7 5 | 5,1,0.3 6 | 6,1,6.3 7 | 7,1,3 8 | 8,1,6.2 9 | 9,1,14.4 10 | 10,1,7.7 11 | 11,1,8.8 12 | 12,1,6.8 13 | 13,1,0.7 14 | 14,1,5.8 15 | 15,1,1.8 16 | 16,1,14.3 17 | 2,2,3.9 18 | 3,2,9.4 19 | 4,2,12.6 20 | 5,2,4.7 21 | 6,2,3.8 22 | 7,2,4.2 23 | 8,2,6.8 24 | 9,2,17 25 | 10,2,10 26 | 11,2,11.3 27 | 12,2,12.6 28 | 13,2,4.6 29 | 14,2,9.4 30 | 15,2,7.9 31 | 1,3,7.5 32 | 2,3,4.4 33 | 3,3,19.4 34 | 4,3,19.1 35 | 5,3,7 36 | 6,3,11.8 37 | 7,3,8.8 38 | 8,3,9.4 39 | 9,3,22.7 40 | 10,3,14.8 41 | 11,3,13.3 42 | 12,3,13.4 43 | 13,3,5.1 44 | 14,3,14.3 45 | 15,3,13.2 46 | 1,4,11.9 47 | 2,4,7.7 48 | 4,4,23.4 49 | 5,4,10.2 50 | 6,4,9.2 51 | 7,4,15.4 52 | 8,4,11.3 53 | 9,4,29.8 54 | 10,4,15.3 55 | 11,4,19.2 56 | 12,4,14.9 57 | 13,4,9.9 58 | 14,4,23.1 59 | 15,4,15.6 60 | 16,4,31.9 61 | 1,5,12.5 62 | 2,5,6.4 63 | 4,5,25.8 64 | 5,5,12.9 65 | 6,5,13.9 66 | 7,5,10.7 67 | 8,5,12.4 68 | 9,5,33 69 | 10,5,18 70 | 11,5,17.4 71 | 12,5,16.8 72 | 13,5,11.4 73 | 14,5,22.9 74 | 15,5,16.5 75 | 16,5,31.9 76 | 2,6,8.3 77 | 4,6,26.1 78 | 5,6,14.8 79 | 6,6,18.2 80 | 7,6,16.2 81 | 8,6,14.7 82 | 9,6,32.2 83 | 10,6,18.7 84 | 11,6,21.8 85 | 12,6,16 86 | 13,6,11.2 87 | 14,6,25.2 88 | 15,6,15.9 89 | 16,6,30.6 90 | -------------------------------------------------------------------------------- /exec/data-conc-2-NA-wide.txt: -------------------------------------------------------------------------------- 1 | PersonID,Time1,Time2,Time4,Time8,Time12,Time24 2 | 1,2.4,NA,7.5,11.9,12.5,NA 3 | 2,NA,3.9,4.4,7.7,6.4,8.3 4 | 3,5.2,9.4,19.4,NA,NA,NA 5 | 4,6.7,12.6,19.1,23.4,25.8,26.1 6 | 5,0.3,4.7,7.0,10.2,12.9,14.8 7 | 6,6.3,3.8,11.8,9.2,13.9,18.2 8 | 7,3.0,4.2,8.8,15.4,10.7,16.2 9 | 8,6.2,6.8,9.4,11.3,12.4,14.7 10 | 9,14.4,17.0,22.7,29.8,33.0,32.2 11 | 10,7.7,10.0,14.8,15.3,18.0,18.7 12 | 11,8.8,11.3,13.3,19.2,17.4,21.8 13 | 12,6.8,12.6,13.4,14.9,16.8,16.0 14 | 13,0.7,4.6,5.1,9.9,11.4,11.2 15 | 14,5.8,9.4,14.3,23.1,22.9,25.2 16 | 15,1.8,7.9,13.2,15.6,16.5,15.9 17 | 16,14.3,NA,NA,31.9,31.9,30.6 18 | -------------------------------------------------------------------------------- /exec/data-conc-2.txt: -------------------------------------------------------------------------------- 1 | PersonID,Time1,Time2,Time4,Time8,Time12,Time24 2 | 1,2.4,5.0,7.5,11.9,12.5,12.7 3 | 2,1.4,3.9,4.4,7.7,6.4,8.3 4 | 3,5.2,9.4,19.4,20.2,22.7,24.9 5 | 4,6.7,12.6,19.1,23.4,25.8,26.1 6 | 5,0.3,4.7,7.0,10.2,12.9,14.8 7 | 6,6.3,3.8,11.8,9.2,13.9,18.2 8 | 7,3.0,4.2,8.8,15.4,10.7,16.2 9 | 8,6.2,6.8,9.4,11.3,12.4,14.7 10 | 9,14.4,17.0,22.7,29.8,33.0,32.2 11 | 10,7.7,10.0,14.8,15.3,18.0,18.7 12 | 11,8.8,11.3,13.3,19.2,17.4,21.8 13 | 12,6.8,12.6,13.4,14.9,16.8,16.0 14 | 13,0.7,4.6,5.1,9.9,11.4,11.2 15 | 14,5.8,9.4,14.3,23.1,22.9,25.2 16 | 15,1.8,7.9,13.2,15.6,16.5,15.9 17 | 16,14.3,18.7,29.3,31.9,31.9,30.6 18 | -------------------------------------------------------------------------------- /exec/data-conc.txt: -------------------------------------------------------------------------------- 1 | Time,Y 2 | 1,2.4 3 | 2,5.0 4 | 4,7.5 5 | 8,11.9 6 | 12,12.5 7 | 24,12.7 8 | -------------------------------------------------------------------------------- /exec/data-dice.txt: -------------------------------------------------------------------------------- 1 | Face 2 | 1 3 | 2 4 | 6 5 | 5 6 | 4 7 | 4 8 | 6 9 | 4 10 | 4 11 | 3 12 | 3 13 | 2 14 | 2 15 | 5 16 | 5 17 | 4 18 | 4 19 | 1 20 | 2 21 | 4 22 | 2 23 | 2 24 | 2 25 | 2 26 | 2 27 | 6 28 | 2 29 | 2 30 | 2 31 | 2 32 | 2 33 | 2 34 | 4 35 | 1 36 | 2 37 | 4 38 | 1 39 | 2 40 | 2 41 | 1 42 | 4 43 | 4 44 | 2 45 | 3 46 | 1 47 | 4 48 | 2 49 | 6 50 | 2 51 | 4 52 | 4 53 | 4 54 | 6 55 | 3 56 | 4 57 | 3 58 | 1 59 | 2 60 | 2 61 | 2 62 | 2 63 | 2 64 | 1 65 | 4 66 | 2 67 | 5 68 | 3 69 | 1 70 | 2 71 | 4 72 | 4 73 | 3 74 | 2 75 | 1 76 | 2 77 | 4 78 | 2 79 | 5 80 | 5 81 | 2 82 | 1 83 | 2 84 | 2 85 | 2 86 | 5 87 | 4 88 | 3 89 | 6 90 | 3 91 | 3 92 | 2 93 | 5 94 | 6 95 | 3 96 | 4 97 | 1 98 | 3 99 | 2 100 | 4 101 | 4 102 | 2 103 | 4 104 | 4 105 | 2 106 | 2 107 | 2 108 | 4 109 | 2 110 | 6 111 | 5 112 | 6 113 | 1 114 | 4 115 | 4 116 | 2 117 | 6 118 | 2 119 | 2 120 | 6 121 | 3 122 | 3 123 | 2 124 | 2 125 | 2 126 | 4 127 | 4 128 | 4 129 | 2 130 | 6 131 | 2 132 | 1 133 | 4 134 | 2 135 | 4 136 | 2 137 | 5 138 | 3 139 | 4 140 | 4 141 | 2 142 | 4 143 | 5 144 | 2 145 | 2 146 | 4 147 | 2 148 | 2 149 | 1 150 | 6 151 | 2 152 | 4 153 | 5 154 | 2 155 | 4 156 | 2 157 | 3 158 | 4 159 | 2 160 | 5 161 | 2 162 | 2 163 | 2 164 | 4 165 | 2 166 | 4 167 | 5 168 | 1 169 | 3 170 | 2 171 | 2 172 | 4 173 | 2 174 | 5 175 | 4 176 | 3 177 | 3 178 | 4 179 | 3 180 | 1 181 | 2 182 | 4 183 | 1 184 | 2 185 | 5 186 | 2 187 | 6 188 | 4 189 | 2 190 | 1 191 | 2 192 | 2 193 | 1 194 | 4 195 | 1 196 | 4 197 | 2 198 | 5 199 | 5 200 | 4 201 | 5 202 | -------------------------------------------------------------------------------- /exec/data-kubo11a.txt: -------------------------------------------------------------------------------- 1 | Y 2 | 0 3 | 3 4 | 2 5 | 5 6 | 6 7 | 16 8 | 8 9 | 14 10 | 11 11 | 10 12 | 17 13 | 19 14 | 14 15 | 19 16 | 19 17 | 18 18 | 15 19 | 13 20 | 13 21 | 9 22 | 11 23 | 15 24 | 18 25 | 12 26 | 11 27 | 17 28 | 14 29 | 16 30 | 15 31 | 9 32 | 6 33 | 15 34 | 10 35 | 11 36 | 14 37 | 7 38 | 14 39 | 14 40 | 13 41 | 17 42 | 8 43 | 7 44 | 10 45 | 4 46 | 5 47 | 5 48 | 7 49 | 4 50 | 3 51 | 1 52 | -------------------------------------------------------------------------------- /exec/data-map-JIS.txt: -------------------------------------------------------------------------------- 1 | 1,北海道 2 | 2,青森県 3 | 3,岩手県 4 | 4,宮城県 5 | 5,秋田県 6 | 6,山形県 7 | 7,福島県 8 | 8,茨城県 9 | 9,栃木県 10 | 10,群馬県 11 | 11,埼玉県 12 | 12,千葉県 13 | 13,東京都 14 | 14,神奈川県 15 | 15,新潟県 16 | 16,富山県 17 | 17,石川県 18 | 18,福井県 19 | 19,山梨県 20 | 20,長野県 21 | 21,岐阜県 22 | 22,静岡県 23 | 23,愛知県 24 | 24,三重県 25 | 25,滋賀県 26 | 26,京都府 27 | 27,大阪府 28 | 28,兵庫県 29 | 29,奈良県 30 | 30,和歌山県 31 | 31,鳥取県 32 | 32,島根県 33 | 33,岡山県 34 | 34,広島県 35 | 35,山口県 36 | 36,徳島県 37 | 37,香川県 38 | 38,愛媛県 39 | 39,高知県 40 | 40,福岡県 41 | 41,佐賀県 42 | 42,長崎県 43 | 43,熊本県 44 | 44,大分県 45 | 45,宮崎県 46 | 46,鹿児島県 47 | 47,沖縄県 48 | -------------------------------------------------------------------------------- /exec/data-map-neighbor.txt: -------------------------------------------------------------------------------- 1 | From,To 2 | 1,2 3 | 2,5 4 | 2,3 5 | 3,5 6 | 3,4 7 | 4,6 8 | 4,7 9 | 4,5 10 | 5,6 11 | 6,7 12 | 6,15 13 | 7,8 14 | 7,9 15 | 7,10 16 | 7,15 17 | 8,12 18 | 8,11 19 | 8,9 20 | 9,11 21 | 9,10 22 | 10,11 23 | 10,15 24 | 10,20 25 | 11,12 26 | 11,13 27 | 11,19 28 | 11,20 29 | 12,13 30 | 12,14 31 | 13,14 32 | 13,19 33 | 14,19 34 | 14,22 35 | 15,20 36 | 15,16 37 | 16,17 38 | 16,21 39 | 16,20 40 | 17,18 41 | 17,21 42 | 18,26 43 | 18,25 44 | 18,21 45 | 19,20 46 | 19,22 47 | 20,22 48 | 20,23 49 | 20,21 50 | 21,23 51 | 21,24 52 | 21,25 53 | 22,23 54 | 23,24 55 | 24,25 56 | 24,26 57 | 24,29 58 | 24,30 59 | 25,26 60 | 26,27 61 | 26,28 62 | 26,29 63 | 27,29 64 | 27,30 65 | 27,28 66 | 28,31 67 | 28,33 68 | 28,37 69 | 28,36 70 | 28,30 71 | 29,30 72 | 30,36 73 | 31,32 74 | 31,33 75 | 31,34 76 | 32,34 77 | 32,35 78 | 33,34 79 | 33,37 80 | 34,35 81 | 34,38 82 | 34,37 83 | 35,38 84 | 35,40 85 | 35,44 86 | 36,37 87 | 36,38 88 | 36,39 89 | 37,38 90 | 38,39 91 | 38,44 92 | 40,41 93 | 40,43 94 | 40,44 95 | 40,42 96 | 41,42 97 | 43,44 98 | 43,45 99 | 43,46 100 | 44,45 101 | 45,46 102 | -------------------------------------------------------------------------------- /exec/data-map-temperature.txt: -------------------------------------------------------------------------------- 1 | prefID,Y 2 | 1,9.2 3 | 2,10.5 4 | 3,10.6 5 | 4,12.7 6 | 5,11.9 7 | 6,11.9 8 | 7,13.4 9 | 8,14.3 10 | 9,14.4 11 | 10,15.2 12 | 11,15.6 13 | 12,16.6 14 | 13,17.1 15 | 14,16.6 16 | 15,13.8 17 | 16,14.5 18 | 17,15 19 | 18,14.9 20 | 19,15.4 21 | 20,12.3 22 | 21,16.3 23 | 22,17.2 24 | 23,16.4 25 | 24,16.5 26 | 25,15.1 27 | 26,16.2 28 | 27,17.1 29 | 28,17 30 | 29,15.3 31 | 30,17 32 | 31,15.5 33 | 32,15.4 34 | 33,16.4 35 | 34,16.6 36 | 35,15.8 37 | 36,16.8 38 | 37,16.8 39 | 38,16.8 40 | 39,17.3 41 | 40,17.7 42 | 41,17.1 43 | 42,17.5 44 | 43,17.2 45 | 44,16.9 46 | 45,17.9 47 | 46,18.9 48 | 47,23.3 49 | -------------------------------------------------------------------------------- /exec/data-mix1.txt: -------------------------------------------------------------------------------- 1 | Y 2 | -0.84 3 | -0.35 4 | 2.34 5 | 0.11 6 | 0.19 7 | 2.57 8 | 0.69 9 | -1.9 10 | -1.03 11 | -0.67 12 | 1.84 13 | 0.54 14 | 0.6 15 | 0.17 16 | -0.83 17 | 2.68 18 | 0.75 19 | -2.95 20 | 1.05 21 | -0.71 22 | -1.6 23 | -0.33 24 | -1.54 25 | -1.09 26 | -0.94 27 | -2.53 28 | 1.26 29 | 0.23 30 | -1.71 31 | 1.88 32 | 0.64 33 | -0.44 34 | 1.34 35 | 1.32 36 | 1.23 37 | 1.03 38 | 0.83 39 | -0.09 40 | -0.46 41 | -0.57 42 | -1.04 43 | -0.31 44 | -1.9 45 | 3.25 46 | 1.81 47 | -1.68 48 | -0.6 49 | -0.7 50 | 1.17 51 | -0.13 52 | 0.38 53 | -0.04 54 | -0.06 55 | 2.05 56 | -0.34 57 | 2.27 58 | -2.32 59 | 0.88 60 | 0.19 61 | 0.32 62 | 6.84 63 | 4.89 64 | 5.27 65 | 3.76 66 | 3.64 67 | 6.67 68 | 6.99 69 | 6.12 70 | 8.03 71 | 10.51 72 | 4.92 73 | 0.92 74 | 8.21 75 | 4.44 76 | 4.49 77 | 8.26 78 | 5.37 79 | 3.31 80 | 6.4 81 | 5.69 82 | 6.01 83 | 6.85 84 | 5.18 85 | 7.42 86 | 5.51 87 | 6.73 88 | 8.41 89 | 6.96 90 | 5.28 91 | 8.53 92 | 8.19 93 | 7.21 94 | 6.53 95 | 4.62 96 | 8.99 97 | 4.68 98 | 10.81 99 | 9.37 100 | 5.48 101 | 3.74 102 | -------------------------------------------------------------------------------- /exec/data-mix2.txt: -------------------------------------------------------------------------------- 1 | Y 2 | 9.44 3 | 9.77 4 | 11.56 5 | 10.07 6 | 10.13 7 | 11.72 8 | 10.46 9 | 8.73 10 | 9.31 11 | 9.55 12 | 11.22 13 | 10.36 14 | 10.4 15 | 10.11 16 | 9.44 17 | 11.79 18 | 10.5 19 | 8.03 20 | 10.7 21 | 9.53 22 | 8.93 23 | 9.78 24 | 8.97 25 | 9.27 26 | 9.37 27 | 8.31 28 | 10.84 29 | 10.15 30 | 8.86 31 | 11.25 32 | 10.43 33 | 9.7 34 | 10.9 35 | 10.88 36 | 17.23 37 | 17.03 38 | 16.83 39 | 15.91 40 | 15.54 41 | 15.43 42 | 14.96 43 | 15.69 44 | 14.1 45 | 19.25 46 | 17.81 47 | 14.32 48 | 15.4 49 | 15.3 50 | 17.17 51 | 15.87 52 | 16.38 53 | 15.96 54 | 15.94 55 | 18.05 56 | 20.8 57 | 22.36 58 | 19.61 59 | 21.53 60 | 21.11 61 | 21.19 62 | 21.34 63 | 20.55 64 | 20.7 65 | 20.08 66 | 20.04 67 | 21.27 68 | 21.4 69 | 21.05 70 | 21.83 71 | 22.85 72 | 20.56 73 | 18.92 74 | 21.91 75 | 20.36 76 | 20.38 77 | 21.92 78 | 20.74 79 | 19.9 80 | 21.16 81 | 20.87 82 | 21.01 83 | 21.35 84 | 20.67 85 | 21.58 86 | 20.8 87 | 21.3 88 | 21.99 89 | 21.39 90 | 20.71 91 | 22.03 92 | 21.89 93 | 21.49 94 | 21.21 95 | 20.43 96 | 22.22 97 | 20.46 98 | 22.97 99 | 22.38 100 | 20.79 101 | 20.08 102 | 20.36 103 | 21.23 104 | 20.78 105 | 20.69 106 | 20.14 107 | 20.96 108 | 20.29 109 | 19.5 110 | 20.66 111 | 21.83 112 | 20.48 113 | 21.55 114 | 19.54 115 | 20.95 116 | 21.47 117 | 21.27 118 | 21.1 119 | 20.42 120 | 20.24 121 | 20.08 122 | 21.11 123 | 20.15 124 | 20.56 125 | 20.77 126 | 22.66 127 | 20.41 128 | 21.21 129 | 21.07 130 | 20.13 131 | 20.94 132 | 22.3 133 | 21.41 134 | 21.04 135 | 20.62 136 | 22.24 137 | 25.74 138 | 22.89 139 | 25.31 140 | 26.6 141 | 22.91 142 | 25.27 143 | 24.21 144 | 22.77 145 | 22.83 146 | 22.74 147 | 23.92 148 | 22.89 149 | 25.26 150 | 26.81 151 | 23.08 152 | 25.37 153 | 25.35 154 | 24.87 155 | 23.39 156 | 24.37 157 | 24.19 158 | 25.12 159 | 24.09 160 | 25.57 161 | 24.09 162 | 25.66 163 | 23.35 164 | 23.11 165 | 28.07 166 | 24.04 167 | 24.83 168 | 25.2 169 | 23.97 170 | 25.07 171 | 24.91 172 | 24.26 173 | 24.57 174 | 24.46 175 | 26.84 176 | 30.15 177 | 29.26 178 | 32.09 179 | 32.78 180 | 33.09 181 | 30.85 182 | 29.34 183 | 35.16 184 | 31.13 185 | 29.84 186 | 31.41 187 | 31.51 188 | 34.77 189 | 32.21 190 | 33.89 191 | 30.75 192 | 32.54 193 | 31.19 194 | 32.24 195 | 29.76 196 | 28.72 197 | 36.99 198 | 33.5 199 | 28.87 200 | 30.47 201 | 29.04 202 | -------------------------------------------------------------------------------- /exec/data-mvn.txt: -------------------------------------------------------------------------------- 1 | Y1,Y2 2 | 9.2,2.56 3 | 9.8,1.99 4 | 9.4,2.4 5 | 9.2,2.27 6 | 8.1,3.68 7 | 9.2,2.81 8 | 9.2,2.5 9 | 8.5,2.65 10 | 8.7,3.36 11 | 9.3,2.56 12 | 9.2,2.54 13 | 9.2,2.72 14 | 8.3,3.46 15 | 9.8,2.5 16 | 8,3.33 17 | 9.3,2.3 18 | 10.3,1.76 19 | 8.6,3.26 20 | 9.6,2.48 21 | 8.2,3.14 22 | 9.6,1.76 23 | 9.6,2.17 24 | 9.9,2.2 25 | 8.9,2.9 26 | 9.3,2.49 27 | 8.7,2.42 28 | 10.2,1.92 29 | 9.6,2.07 30 | 9.7,2.53 31 | 9.6,2.32 32 | 9.2,2.22 33 | 8.8,2.71 34 | -------------------------------------------------------------------------------- /exec/data-outlier.txt: -------------------------------------------------------------------------------- 1 | X,Y 2 | 1,3.4 3 | 2,8.2 4 | 3,40 5 | 4,17.6 6 | 5,20.3 7 | 6,23.2 8 | 7,28.5 9 | 8,32.7 10 | 9,36.6 11 | 10,39.7 12 | -------------------------------------------------------------------------------- /exec/data-poisson-binomial.txt: -------------------------------------------------------------------------------- 1 | Y 2 | 6 3 | 5 4 | 8 5 | 2 6 | 5 7 | 7 8 | 6 9 | 3 10 | 3 11 | 7 12 | 5 13 | 6 14 | 3 15 | 3 16 | 7 17 | 4 18 | 2 19 | 2 20 | 4 21 | 4 22 | 4 23 | 3 24 | 2 25 | 2 26 | 4 27 | 4 28 | 5 29 | 9 30 | 7 31 | 5 32 | 5 33 | 6 34 | 4 35 | 5 36 | 5 37 | 2 38 | 6 39 | 4 40 | 9 41 | 5 42 | 6 43 | 5 44 | 9 45 | 5 46 | 5 47 | 4 48 | 4 49 | 3 50 | 5 51 | 9 52 | 0 53 | 1 54 | 3 55 | 7 56 | 5 57 | 7 58 | 3 59 | 3 60 | 7 61 | 7 62 | 4 63 | 6 64 | 3 65 | 2 66 | 3 67 | 2 68 | 4 69 | 2 70 | 4 71 | 4 72 | 3 73 | 3 74 | 7 75 | 5 76 | 8 77 | 8 78 | 3 79 | 4 80 | 7 81 | 5 82 | 2 83 | 8 84 | 7 85 | 6 86 | 4 87 | 5 88 | 1 89 | 8 90 | 7 91 | 4 92 | 3 93 | 9 94 | 3 95 | 6 96 | 5 97 | 5 98 | 3 99 | 5 100 | 6 101 | 9 102 | -------------------------------------------------------------------------------- /exec/data-protein.txt: -------------------------------------------------------------------------------- 1 | Y 2 | <25 3 | 32.3 4 | <25 5 | 28.3 6 | 30.8 7 | 35.2 8 | -------------------------------------------------------------------------------- /exec/data-rental.txt: -------------------------------------------------------------------------------- 1 | Y,Area 2 | 263.062,40.66 3 | 519,61.94 4 | 671.4,55.13 5 | 473.03,56.82 6 | 455.6,56.82 7 | 153.5,15.5 8 | 234,32 9 | 264.48,33.21 10 | 650,63.83 11 | 223.2,20 12 | 160.8,20 13 | 756,82.81 14 | 220.9,26.49 15 | 201.6,23.63 16 | 246,22.48 17 | 161.2,19.83 18 | 200.2,23.14 19 | 196.2,20.09 20 | 182.3,23.47 21 | 496.5,41.58 22 | 291.376,44 23 | 158,19.5 24 | 473.22,42.89 25 | 634.4,53.14 26 | 310.6,30.83 27 | 868,64.34 28 | 306.63,23.37 29 | 434.2,39.84 30 | 272,40.6 31 | 259.5,30.45 32 | 155.6,31 33 | 351,54.18 34 | 1870.5,112.82 35 | 184.2,21 36 | 179.4,15.57 37 | 184.2,21 38 | 207.6,21 39 | 364.5,37.13 40 | 235,23.08 41 | 432,57.1 42 | 183.6,33.43 43 | 297.6,24.92 44 | 124.6,11.64 45 | 282.22,31.56 46 | 311.6,35.54 47 | 247,29 48 | 1234.8,72.56 49 | 419.2,45.01 50 | 185.508,24.3 51 | 184.2,21 52 | 347.8,36.56 53 | 884.8,54.68 54 | 453,34.89 55 | 184.5,29 56 | 234,32 57 | 191.25,18.6 58 | 312.5,46.7 59 | 598.5,48.75 60 | 318.4,26.06 61 | 197.508,29.16 62 | 145.4,18 63 | 147.8,17 64 | 593.6,50.5 65 | 413.4,31.48 66 | 176.2,18.2 67 | 250.6,27.02 68 | 194,18.9 69 | 401.1,51.3 70 | 228.2,30.52 71 | 476.82,45.96 72 | 146.4,16.89 73 | 164.304,23.01 74 | 210.075,30.24 75 | 207,21.35 76 | 179,19.87 77 | 352.4,45 78 | 1053,81.46 79 | 260,38.25 80 | 390,44.28 81 | 154.86,16.61 82 | 636.3,68.24 83 | 459.2,49.14 84 | 781.2,37.81 85 | 179.8,22.72 86 | 240.6,26.42 87 | 1754.5,110.06 88 | 213.3,35.1 89 | 503.7,51.95 90 | 194.8,23.52 91 | 217.3,38.22 92 | 264,32.1 93 | 221,33 94 | 280.8,50.68 95 | 389.7,31.36 96 | 196.35,25 97 | 209.508,19.4 98 | 221,28.07 99 | 604.5,59.71 100 | 325,32.88 101 | 423,41.2 102 | -------------------------------------------------------------------------------- /exec/data-salary-2.txt: -------------------------------------------------------------------------------- 1 | X,Y,KID 2 | 7,457,1 3 | 10,482,1 4 | 16,518,1 5 | 25,535,1 6 | 5,427,1 7 | 25,603,1 8 | 26,610,1 9 | 18,484,1 10 | 17,508,1 11 | 1,380,1 12 | 5,453,1 13 | 4,391,1 14 | 19,559,1 15 | 10,453,1 16 | 21,517,1 17 | 12,553,2 18 | 17,653,2 19 | 22,763,2 20 | 9,538,2 21 | 18,708,2 22 | 21,740,2 23 | 6,437,2 24 | 15,646,2 25 | 4,422,2 26 | 7,444,2 27 | 10,504,2 28 | 2,376,2 29 | 15,522,3 30 | 27,623,3 31 | 14,515,3 32 | 18,542,3 33 | 20,529,3 34 | 18,540,3 35 | 11,411,3 36 | 26,666,3 37 | 22,641,3 38 | 25,592,3 39 | 28,722,4 40 | 24,726,4 41 | 22,728,4 42 | -------------------------------------------------------------------------------- /exec/data-salary.txt: -------------------------------------------------------------------------------- 1 | X,Y 2 | 24,472 3 | 24,403 4 | 26,454 5 | 32,575 6 | 33,546 7 | 35,781 8 | 38,750 9 | 40,601 10 | 40,814 11 | 43,792 12 | 43,745 13 | 44,837 14 | 48,868 15 | 52,988 16 | 56,1092 17 | 56,1007 18 | 57,1233 19 | 58,1202 20 | 59,1123 21 | 59,1314 22 | -------------------------------------------------------------------------------- /exec/data-shogi-player-name.txt: -------------------------------------------------------------------------------- 1 | kid kname nid 2 | 64 加藤一二三 1 3 | 77 内藤國雄 2 4 | 93 桐山清澄 3 5 | 100 森けい二 4 6 | 101 滝誠一郎 5 7 | 104 田中魁秀 6 8 | 106 佐藤義則 7 9 | 109 田丸昇 8 10 | 110 宮田利男 9 11 | 113 淡路仁茂 10 12 | 114 青野照市 11 13 | 116 前田祐司 12 14 | 123 小林健二 13 15 | 124 土佐浩司 14 16 | 126 森信雄 15 17 | 127 田中寅彦 16 18 | 128 東和男 17 19 | 130 大島映二 18 20 | 131 谷川浩司 19 21 | 135 福崎文吾 20 22 | 138 脇謙二 21 23 | 142 高橋道雄 22 24 | 143 中村修 23 25 | 144 泉正樹 24 26 | 146 島朗 25 27 | 147 南芳一 26 28 | 148 塚田泰明 27 29 | 149 神谷広志 28 30 | 150 植山悦行 29 31 | 151 西川慶二 30 32 | 152 武市三郎 31 33 | 153 室岡克彦 32 34 | 154 堀口弘治 33 35 | 155 大野八一雄 34 36 | 157 井上慶太 35 37 | 158 有森浩三 36 38 | 161 森下卓 37 39 | 162 浦野真彦 38 40 | 164 日浦市郎 39 41 | 166 伊藤博文 40 42 | 167 小林宏 41 43 | 168 富岡英作 42 44 | 171 阿部隆 43 45 | 172 所司和晴 44 46 | 173 中田宏樹 45 47 | 174 安西勝一 46 48 | 175 羽生善治 47 49 | 176 中田功 48 50 | 177 石川陽生 49 51 | 178 長沼洋 50 52 | 179 神崎健二 51 53 | 182 佐藤康光 52 54 | 183 森内俊之 53 55 | 184 中川大輔 54 56 | 185 先崎学 55 57 | 186 野田敬三 56 58 | 187 木下浩一 57 59 | 188 小倉久史 58 60 | 189 屋敷伸之 59 61 | 190 藤原直哉 60 62 | 191 高田尚平 61 63 | 192 畠山鎮 62 64 | 193 畠山成幸 63 65 | 194 丸山忠久 64 66 | 195 郷田真隆 65 67 | 196 佐藤秀司 66 68 | 197 杉本昌隆 67 69 | 198 藤井猛 68 70 | 199 平藤眞吾 69 71 | 200 豊川孝弘 70 72 | 201 深浦康市 71 73 | 202 真田圭一 72 74 | 203 飯塚祐紀 73 75 | 204 三浦弘行 74 76 | 205 伊藤能 75 77 | 206 川上猛 76 78 | 207 久保利明 77 79 | 208 行方尚史 78 80 | 209 岡崎洋 79 81 | 210 窪田義行 80 82 | 211 北浜健介 81 83 | 212 矢倉規広 82 84 | 213 鈴木大介 83 85 | 214 北島忠雄 84 86 | 215 勝又清和 85 87 | 216 松本佳介 86 88 | 217 田村康介 87 89 | 218 堀口一史座 88 90 | 219 中座真 89 91 | 220 近藤正和 90 92 | 221 野月浩貴 91 93 | 222 木村一基 92 94 | 223 小林裕士 93 95 | 224 佐藤紳哉 94 96 | 225 増田裕司 95 97 | 226 高野秀行 96 98 | 227 山崎隆之 97 99 | 228 伊奈祐介 98 100 | 229 山本真也 99 101 | 230 中尾敏之 100 102 | 231 松尾歩 101 103 | 232 金沢孝史 102 104 | 233 阿久津主税 103 105 | 234 安用寺孝功 104 106 | 235 渡辺明 105 107 | 236 飯島栄治 106 108 | 237 千葉幸生 107 109 | 238 上野裕和 108 110 | 239 橋本崇載 109 111 | 240 佐々木慎 110 112 | 241 宮田敦史 111 113 | 242 村田智弘 112 114 | 243 大平武洋 113 115 | 244 熊坂学 114 116 | 245 藤倉勇樹 115 117 | 246 横山泰明 116 118 | 247 島本亮 117 119 | 248 西尾明 118 120 | 249 村山慈明 119 121 | 250 佐藤和俊 120 122 | 251 片上大輔 121 123 | 252 中村亮介 122 124 | 253 村中秀史 123 125 | 254 阪口悟 124 126 | 255 広瀬章人 125 127 | 256 長岡裕也 126 128 | 257 高崎一生 127 129 | 258 遠山雄亮 128 130 | 259 瀬川晶司 129 131 | 260 糸谷哲郎 130 132 | 261 中村太地 131 133 | 262 戸辺誠 132 134 | 263 佐藤天彦 133 135 | 264 豊島将之 134 136 | 265 金井恒太 135 137 | 266 伊藤真吾 136 138 | 267 村田顕弘 137 139 | 268 及川拓馬 138 140 | 269 稲葉陽 139 141 | 270 田中悠一 140 142 | 271 佐藤慎一 141 143 | 272 西川和宏 142 144 | 273 吉田正和 143 145 | 274 澤田真吾 144 146 | 275 大石直嗣 145 147 | 276 永瀬拓矢 146 148 | 277 阿部健治郎 147 149 | 278 菅井竜也 148 150 | 279 牧野光則 149 151 | 280 佐々木勇気 150 152 | 281 船江恒平 151 153 | 282 門倉啓太 152 154 | 283 阿部光瑠 153 155 | 284 高見泰地 154 156 | 285 藤森哲也 155 157 | 286 斎藤慎太郎 156 158 | 287 八代弥 157 159 | 288 上村亘 158 160 | 289 石田直裕 159 161 | 290 渡辺大夢 160 162 | 291 千田翔太 161 163 | 292 竹内雄悟 162 164 | 293 石井健太郎 163 165 | 294 三枚堂達也 164 166 | 295 星野良生 165 167 | 296 宮本広志 166 168 | -------------------------------------------------------------------------------- /exec/data-ss1.txt: -------------------------------------------------------------------------------- 1 | X,Y 2 | 1,11.2 3 | 2,11 4 | 3,11.3 5 | 4,10.8 6 | 5,10.8 7 | 6,11.3 8 | 7,11.1 9 | 8,11 10 | 9,11.4 11 | 10,11.7 12 | 11,12.5 13 | 12,12.6 14 | 13,12.8 15 | 14,13 16 | 15,13 17 | 16,13.6 18 | 17,13.3 19 | 18,12.6 20 | 19,13.1 21 | 20,12.6 22 | 21,12.1 23 | -------------------------------------------------------------------------------- /exec/data-ss2.txt: -------------------------------------------------------------------------------- 1 | X,Y 2 | 1,18.073 3 | 2,23.665 4 | 3,16.41 5 | 4,14.931 6 | 5,17.106 7 | 6,22.218 8 | 7,12.22 9 | 8,15.144 10 | 9,15.821 11 | 10,19.906 12 | 11,11.27 13 | 12,13.826 14 | 13,14.518 15 | 14,20.091 16 | 15,10.884 17 | 16,14.725 18 | 17,14.978 19 | 18,21.394 20 | 19,9.81 21 | 20,14.539 22 | 21,16.709 23 | 22,21.608 24 | 23,12.96 25 | 24,14.073 26 | 25,17.349 27 | 26,22.662 28 | 27,15.906 29 | 28,15.619 30 | 29,18.117 31 | 30,26.206 32 | 31,16.147 33 | 32,17.512 34 | 33,19.674 35 | 34,30.237 36 | 35,17.283 37 | 36,18.883 38 | 37,21.11 39 | 38,30.618 40 | 39,19.179 41 | 40,20.332 42 | 41,23.278 43 | 42,31.892 44 | 43,20.276 45 | 44,22.866 46 | -------------------------------------------------------------------------------- /exec/data-usagitokame.txt: -------------------------------------------------------------------------------- 1 | Loser,Winner 2 | 1,2 3 | 1,2 4 | 2,1 5 | 1,2 6 | 1,2 7 | 1,2 8 | 1,2 9 | 1,2 10 | 1,2 11 | 1,2 12 | 1,2 13 | 1,2 14 | 2,1 15 | 1,2 16 | 1,2 17 | 2,1 18 | 1,2 19 | 1,2 20 | 1,2 21 | 1,2 22 | 1,2 23 | 1,2 24 | 1,2 25 | 1,2 26 | 1,2 27 | 1,2 28 | 2,1 29 | 1,2 30 | 1,2 31 | 1,2 32 | -------------------------------------------------------------------------------- /exec/data3a.csv: -------------------------------------------------------------------------------- 1 | y,x,f 2 | 6,8.31,C 3 | 6,9.44,C 4 | 6,9.5,C 5 | 12,9.07,C 6 | 10,10.16,C 7 | 4,8.32,C 8 | 9,10.61,C 9 | 9,10.06,C 10 | 9,9.93,C 11 | 11,10.43,C 12 | 6,10.36,C 13 | 10,10.15,C 14 | 6,10.92,C 15 | 10,8.85,C 16 | 11,9.42,C 17 | 8,11.11,C 18 | 3,8.02,C 19 | 8,11.93,C 20 | 5,8.55,C 21 | 5,7.19,C 22 | 4,9.83,C 23 | 11,10.79,C 24 | 5,8.89,C 25 | 10,10.09,C 26 | 6,11.63,C 27 | 6,10.21,C 28 | 7,9.45,C 29 | 9,10.44,C 30 | 3,9.44,C 31 | 10,10.48,C 32 | 2,9.43,C 33 | 9,10.32,C 34 | 10,10.33,C 35 | 5,8.5,C 36 | 11,9.41,C 37 | 10,8.96,C 38 | 4,9.67,C 39 | 8,10.26,C 40 | 9,10.36,C 41 | 12,11.8,C 42 | 8,10.94,C 43 | 9,10.25,C 44 | 8,8.74,C 45 | 6,10.46,C 46 | 6,9.37,C 47 | 10,9.74,C 48 | 10,8.95,C 49 | 9,8.74,C 50 | 12,11.32,C 51 | 6,9.25,C 52 | 14,10.14,T 53 | 6,9.05,T 54 | 7,9.89,T 55 | 9,8.76,T 56 | 6,12.04,T 57 | 7,9.91,T 58 | 9,9.84,T 59 | 13,11.87,T 60 | 9,10.16,T 61 | 13,9.34,T 62 | 7,10.17,T 63 | 8,10.99,T 64 | 10,9.19,T 65 | 7,10.67,T 66 | 12,10.96,T 67 | 6,10.55,T 68 | 15,9.69,T 69 | 3,10.91,T 70 | 4,9.6,T 71 | 6,12.37,T 72 | 10,10.54,T 73 | 8,11.3,T 74 | 8,12.4,T 75 | 7,10.18,T 76 | 5,9.53,T 77 | 6,10.24,T 78 | 8,11.76,T 79 | 9,9.52,T 80 | 9,10.4,T 81 | 6,9.96,T 82 | 7,10.3,T 83 | 10,11.54,T 84 | 6,9.42,T 85 | 11,11.28,T 86 | 11,9.73,T 87 | 11,10.78,T 88 | 5,10.21,T 89 | 6,10.51,T 90 | 4,10.73,T 91 | 5,8.85,T 92 | 6,11.2,T 93 | 5,9.86,T 94 | 8,11.54,T 95 | 5,10.03,T 96 | 9,11.88,T 97 | 8,9.15,T 98 | 6,8.52,T 99 | 8,10.24,T 100 | 7,10.86,T 101 | 9,9.97,T 102 | -------------------------------------------------------------------------------- /exec/data4a.csv: -------------------------------------------------------------------------------- 1 | N,y,x,f 2 | 8,1,9.76,C 3 | 8,6,10.48,C 4 | 8,5,10.83,C 5 | 8,6,10.94,C 6 | 8,1,9.37,C 7 | 8,1,8.81,C 8 | 8,3,9.49,C 9 | 8,6,11.02,C 10 | 8,0,7.97,C 11 | 8,8,11.55,C 12 | 8,0,9.46,C 13 | 8,2,9.47,C 14 | 8,0,8.71,C 15 | 8,5,10.42,C 16 | 8,3,10.06,C 17 | 8,6,11,C 18 | 8,3,9.95,C 19 | 8,4,9.52,C 20 | 8,5,10.26,C 21 | 8,8,11.33,C 22 | 8,5,9.77,C 23 | 8,8,10.59,C 24 | 8,1,9.35,C 25 | 8,4,10,C 26 | 8,1,9.53,C 27 | 8,8,12.06,C 28 | 8,4,9.68,C 29 | 8,7,11.32,C 30 | 8,5,10.48,C 31 | 8,5,10.37,C 32 | 8,8,11.33,C 33 | 8,1,9.42,C 34 | 8,7,10.68,C 35 | 8,1,7.91,C 36 | 8,3,9.39,C 37 | 8,8,11.65,C 38 | 8,6,10.66,C 39 | 8,7,11.23,C 40 | 8,7,10.57,C 41 | 8,4,10.42,C 42 | 8,7,11.73,C 43 | 8,8,12.02,C 44 | 8,8,11.55,C 45 | 8,0,8.58,C 46 | 8,6,11.08,C 47 | 8,5,10.49,C 48 | 8,8,11.12,C 49 | 8,3,8.99,C 50 | 8,8,10.08,C 51 | 8,8,10.8,C 52 | 8,0,7.83,T 53 | 8,5,8.88,T 54 | 8,5,9.74,T 55 | 8,8,9.98,T 56 | 8,3,8.46,T 57 | 8,2,7.96,T 58 | 8,7,9.78,T 59 | 8,8,11.93,T 60 | 8,3,9.04,T 61 | 8,5,10.14,T 62 | 8,8,11.01,T 63 | 8,3,8.88,T 64 | 8,6,9.68,T 65 | 8,7,9.8,T 66 | 8,8,10.76,T 67 | 8,6,9.81,T 68 | 8,5,8.37,T 69 | 8,5,9.38,T 70 | 8,0,7.68,T 71 | 8,8,10.23,T 72 | 8,8,9.83,T 73 | 8,0,7.66,T 74 | 8,6,9.33,T 75 | 8,1,8.2,T 76 | 8,8,9.54,T 77 | 8,8,10.55,T 78 | 8,6,9.88,T 79 | 8,6,9.34,T 80 | 8,6,10.38,T 81 | 8,6,9.63,T 82 | 8,8,12.44,T 83 | 8,8,10.17,T 84 | 8,7,9.29,T 85 | 8,8,11.17,T 86 | 8,6,9.13,T 87 | 8,2,8.79,T 88 | 8,0,8.19,T 89 | 8,7,10.25,T 90 | 8,8,11.3,T 91 | 8,8,10.84,T 92 | 8,8,10.97,T 93 | 8,3,8.6,T 94 | 8,7,9.91,T 95 | 8,8,11.38,T 96 | 8,8,10.39,T 97 | 8,7,10.45,T 98 | 8,0,8.94,T 99 | 8,5,8.94,T 100 | 8,8,10.14,T 101 | 8,1,8.5,T 102 | -------------------------------------------------------------------------------- /exec/data7a.csv: -------------------------------------------------------------------------------- 1 | id,y 2 | 1,0 3 | 2,2 4 | 3,7 5 | 4,8 6 | 5,1 7 | 6,7 8 | 7,8 9 | 8,8 10 | 9,1 11 | 10,1 12 | 11,4 13 | 12,0 14 | 13,1 15 | 14,4 16 | 15,7 17 | 16,8 18 | 17,7 19 | 18,0 20 | 19,2 21 | 20,2 22 | 21,1 23 | 22,1 24 | 23,5 25 | 24,7 26 | 25,8 27 | 26,3 28 | 27,8 29 | 28,4 30 | 29,6 31 | 30,0 32 | 31,8 33 | 32,7 34 | 33,8 35 | 34,0 36 | 35,2 37 | 36,6 38 | 37,7 39 | 38,8 40 | 39,2 41 | 40,1 42 | 41,1 43 | 42,0 44 | 43,0 45 | 44,7 46 | 45,8 47 | 46,5 48 | 47,7 49 | 48,2 50 | 49,8 51 | 50,1 52 | 51,5 53 | 52,7 54 | 53,3 55 | 54,8 56 | 55,0 57 | 56,8 58 | 57,6 59 | 58,3 60 | 59,2 61 | 60,0 62 | 61,0 63 | 62,1 64 | 63,2 65 | 64,8 66 | 65,7 67 | 66,7 68 | 67,7 69 | 68,8 70 | 69,0 71 | 70,0 72 | 71,0 73 | 72,5 74 | 73,1 75 | 74,0 76 | 75,0 77 | 76,0 78 | 77,8 79 | 78,1 80 | 79,8 81 | 80,4 82 | 81,7 83 | 82,2 84 | 83,1 85 | 84,4 86 | 85,7 87 | 86,0 88 | 87,8 89 | 88,1 90 | 89,8 91 | 90,7 92 | 91,6 93 | 92,2 94 | 93,8 95 | 94,6 96 | 95,6 97 | 96,1 98 | 97,0 99 | 98,4 100 | 99,7 101 | 100,0 102 | -------------------------------------------------------------------------------- /exec/requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2020.4.5.1 2 | chardet==3.0.4 3 | cmake==3.17.2 4 | cycler==0.10.0 5 | Cython==0.29.17 6 | docopt==0.6.2 7 | idna==2.9 8 | joblib==0.14.1 9 | kiwisolver==1.2.0 10 | matplotlib==3.2.1 11 | numpy==1.18.3 12 | pandas==1.0.3 13 | pipreqs==0.4.10 14 | pyparsing==2.4.7 15 | pystan==2.19.1.1 16 | python-dateutil==2.8.1 17 | pytz==2020.1 18 | requests==2.23.0 19 | scikit-learn==0.22.2.post1 20 | scipy==1.4.1 21 | seaborn==0.10.1 22 | six==1.14.0 23 | sklearn==0.0 24 | urllib3==1.25.9 25 | yarg==0.1.9 26 | -------------------------------------------------------------------------------- /images/12-exec-3-noise-0.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-3-noise-0.1.png -------------------------------------------------------------------------------- /images/12-exec-3-noise-0.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-3-noise-0.2.png -------------------------------------------------------------------------------- /images/12-exec-3-noise-0.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-3-noise-0.3.png -------------------------------------------------------------------------------- /images/12-exec-3-noise-0.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-3-noise-0.4.png -------------------------------------------------------------------------------- /images/12-exec-3-noise-0.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-3-noise-0.5.png -------------------------------------------------------------------------------- /images/12-exec-4-noise-0.5-yy-0.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-4-noise-0.5-yy-0.1.png -------------------------------------------------------------------------------- /images/12-exec-4-noise-0.5-yy-0.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-4-noise-0.5-yy-0.2.png -------------------------------------------------------------------------------- /images/12-exec-4-noise-0.5-yy-0.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-4-noise-0.5-yy-0.3.png -------------------------------------------------------------------------------- /images/12-exec-4-noise-0.5-yy-0.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-4-noise-0.5-yy-0.4.png -------------------------------------------------------------------------------- /images/12-exec-4-noise-0.5-yy-0.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-4-noise-0.5-yy-0.5.png -------------------------------------------------------------------------------- /images/12-exec-4-noise-0.5-yy-0.6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-4-noise-0.5-yy-0.6.png -------------------------------------------------------------------------------- /images/12-exec-4-noise-0.5-yy-0.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasazI/python-r-stan-bayesian-model-2/288876b31b6c3d74d523babc475d4794cd29680a/images/12-exec-4-noise-0.5-yy-0.7.png -------------------------------------------------------------------------------- /model/4-exec-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int y1_N; 3 | int y2_N; 4 | real y1[y1_N]; 5 | real y2[y2_N]; 6 | } 7 | 8 | parameters { 9 | real sigma1; 10 | real sigma2; 11 | real mu1; 12 | real mu2; 13 | } 14 | 15 | model { 16 | for (i in 1:y1_N) { 17 | y1[i] ~ normal(mu1, sigma1); 18 | } 19 | for (i in 1:y2_N) { 20 | y2[i] ~ normal(mu2, sigma2); 21 | } 22 | } -------------------------------------------------------------------------------- /model/4-exec.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int y1_N; 3 | int y2_N; 4 | real y1[y1_N]; 5 | real y2[y2_N]; 6 | } 7 | 8 | parameters { 9 | real sigma; 10 | real mu1; 11 | real mu2; 12 | } 13 | 14 | model { 15 | for (i in 1:y1_N) { 16 | y1[i] ~ normal(mu1, sigma); 17 | } 18 | for (i in 1:y2_N) { 19 | y2[i] ~ normal(mu2, sigma); 20 | } 21 | } -------------------------------------------------------------------------------- /model/5-exec-5-6.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int y[N]; 4 | real x[N]; 5 | int f[N]; 6 | } 7 | 8 | parameters { 9 | real b[3]; 10 | } 11 | 12 | transformed parameters { 13 | real lambda[N]; 14 | for (n in 1:N) { 15 | lambda[n] = b[1] + b[2]*x[n] + b[3]*f[n]; 16 | } 17 | } 18 | 19 | model { 20 | for (n in 1:N) { 21 | y[n] ~ poisson_log(lambda[n]); 22 | } 23 | } 24 | 25 | generated quantities { 26 | int y_pred[N]; 27 | for (n in 1:N) { 28 | y_pred[n] = poisson_log_rng(lambda[n]); 29 | } 30 | } -------------------------------------------------------------------------------- /model/5-exec-5-7.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int I; 3 | int y[I]; 4 | int N[I]; 5 | real x[I]; 6 | int f[I]; 7 | } 8 | 9 | parameters { 10 | real b[3]; 11 | } 12 | 13 | transformed parameters { 14 | real q[I]; 15 | for (i in 1:I) { 16 | q[i] = inv_logit(b[1] + b[2]*x[i] + b[3]*f[i]); 17 | } 18 | } 19 | 20 | model { 21 | for (i in 1:I) { 22 | y[i] ~ binomial(N[i], q[i]); 23 | } 24 | } 25 | 26 | generated quantities { 27 | real y_pred[I]; 28 | for (i in 1:I) { 29 | y_pred[i] = binomial_rng(N[i], q[i]); 30 | } 31 | } -------------------------------------------------------------------------------- /model/model-8-exec-4.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; // Person 3 | int C; // コース 4 | int I; // 授業 5 | 6 | real Score[N]; 7 | int A[N]; 8 | 9 | int PID[I]; 10 | int CID[I]; 11 | real W[I]; 12 | int Y[I]; 13 | } 14 | 15 | parameters { 16 | real b1; // 授業ごと 17 | real b2; // アルバイトの好き嫌い 18 | real b3; // スコア 19 | real b4; // 天気 20 | real bp[N]; // 学生ごと 21 | real bc[C]; // コースごと 22 | } 23 | 24 | transformed parameters { 25 | real x[I]; 26 | real xw[I]; 27 | real xp[N]; 28 | real xc[C]; 29 | real q[I]; 30 | for (n in 1:N) { 31 | xp[n] = b2*A[n] + b3*Score[n] + bp[n]; 32 | } 33 | for (c in 1:C) { 34 | xc[c] = bc[c]; 35 | } 36 | for (i in 1:I) { 37 | xw[i] = b4 * W[i]; 38 | x[i] = b1 + xp[PID[i]] + xc[CID[i]] + xw[i]; 39 | q[i] = inv_logit(x[i]); 40 | } 41 | } 42 | 43 | model { 44 | for (i in 1:I) { 45 | Y[i] ~ bernoulli(q[i]); 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /model/model-8-exec-6.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int y[N]; 4 | } 5 | 6 | parameters { 7 | real b1; 8 | real b[N]; 9 | real sigma; 10 | } 11 | 12 | transformed parameters { 13 | real q[N]; 14 | for (n in 1:N) { 15 | q[n] = inv_logit(b1 + b[n]); 16 | } 17 | } 18 | 19 | model { 20 | for (n in 1:N) { 21 | b[n] ~ normal(0, sigma); 22 | } 23 | for (n in 1:N) { 24 | y[n] ~ binomial(8, q[n]); 25 | } 26 | } 27 | 28 | generated quantities { 29 | int y_pred[N]; 30 | for (n in 1:N) { 31 | y_pred[n] = binomial_rng(9, q[n]); 32 | } 33 | } -------------------------------------------------------------------------------- /model/model-8-exec-7.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int N_Pot; 4 | int Y[N]; 5 | int F[N]; 6 | int N2P[N]; 7 | } 8 | 9 | parameters { 10 | real b[2]; 11 | real b_I[N]; 12 | real b_P[N_Pot]; 13 | real sigma_I; 14 | real sigma_P; 15 | } 16 | 17 | model { 18 | for (n in 1:N) { 19 | b_I[n] ~ normal(0, sigma_I); 20 | } 21 | for (p in 1:N_Pot) { 22 | b_P[p] ~ normal(0, sigma_P); 23 | } 24 | for (n in 1:N) { 25 | Y[n] ~ poisson_log(b[1] + b[2]*F[n] + b_I[n] + b_P[N2P[n]]); 26 | } 27 | } -------------------------------------------------------------------------------- /model/model-9-exec-1.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] score; 4 | vector[N] a; 5 | vector[N] y; 6 | } 7 | 8 | parameters { 9 | real Intercept; 10 | real b_s; 11 | real b_a; 12 | real sigma; 13 | } 14 | 15 | transformed parameters { 16 | vector[N] mu; 17 | mu = Intercept + b_s * score + b_a * a; 18 | } 19 | 20 | model { 21 | y ~ normal(mu, sigma); 22 | } 23 | 24 | generated quantities { 25 | real y_pred[N]; 26 | real noise[N]; 27 | for (i in 1:N) { 28 | y_pred[i] = normal_rng(mu[i], sigma); 29 | 30 | // 練習問題5(2) 31 | noise[i] = y[i] - mu[i]; 32 | } 33 | } -------------------------------------------------------------------------------- /model/model-9-exec-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] A; 4 | vector[N] Score; 5 | int M[N]; 6 | } 7 | 8 | parameters { 9 | real b[3]; 10 | } 11 | 12 | transformed parameters { 13 | vector[N] lambda; 14 | lambda = b[1] + b[2]*A + b[3]*Score; 15 | } 16 | 17 | model { 18 | M ~ poisson_log(lambda); 19 | } 20 | 21 | generated quantities { 22 | int m_pred[N]; 23 | for (n in 1:N) { 24 | m_pred[n] = poisson_log_rng(lambda[n]); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /model/model-9-exec-3.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] a; 4 | vector[N] b; 5 | 6 | row_vector[N] ra; 7 | } 8 | 9 | transformed parameters { 10 | real ip; 11 | real ip_op; 12 | 13 | ip = dot_product(a, b); 14 | print("ip=", ip) 15 | 16 | ip_op = ra * b; 17 | print("ip_op=", ip_op) 18 | } -------------------------------------------------------------------------------- /model/model-9-exec-4.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] Y; 4 | vector[N] X; 5 | int N_group; 6 | int N_industry; 7 | int KID[N]; 8 | int K2G[N_group]; 9 | } 10 | 11 | parameters { 12 | real a0; 13 | vector[N_industry] a1; 14 | vector[N_group] a; 15 | 16 | real b0; 17 | vector[N_industry] b1; 18 | vector[N_group] b; 19 | 20 | real sigma_a1; 21 | real sigma_b1; 22 | real sigma_a; 23 | real sigma_b; 24 | real sigma; 25 | } 26 | 27 | model { 28 | a1 ~ normal(a0, sigma_a1); 29 | b1 ~ normal(b0, sigma_b1); 30 | a ~ normal(a1[K2G], sigma_a); 31 | b ~ normal(b1[K2G], sigma_b); 32 | Y ~ normal(a[KID] + b[KID] .* X, sigma); 33 | } -------------------------------------------------------------------------------- /model/model-9-exec-5.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] x; 4 | real a; 5 | real b; 6 | } 7 | 8 | transformed parameters { 9 | real x_min; 10 | real a_b_min; 11 | 12 | x_min = min(x); 13 | a_b_min = fmin(a, b); 14 | 15 | print("x_min=", x_min, "a_b_min=", a_b_min) 16 | } -------------------------------------------------------------------------------- /model/model10-1-4.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int K; 4 | real Age[N]; 5 | real Sex[N]; 6 | real Income[N]; 7 | int Y[N]; 8 | } 9 | 10 | transformed data { 11 | row_vector[1] zero; 12 | zero = rep_row_vector(0, 1); 13 | } 14 | 15 | parameters { 16 | row_vector[K-1] b1_raw; 17 | row_vector[K-1] b2_raw; 18 | row_vector[K-1] b3_raw; 19 | row_vector[K-1] b4_raw; 20 | } 21 | 22 | transformed parameters { 23 | matrix[N, K] mu; 24 | row_vector[K] b1; 25 | row_vector[K] b2; 26 | row_vector[K] b3; 27 | row_vector[K] b4; 28 | b1 = append_col(zero, b1_raw); 29 | b2 = append_col(zero, b2_raw); 30 | b3 = append_col(zero, b3_raw); 31 | b4 = append_col(zero, b4_raw); 32 | for (n in 1:N) { 33 | mu[n,] = (b1 + b2 * Age[n] + b3 * Sex[n] + b4 * Income[n]); 34 | } 35 | } 36 | 37 | model { 38 | for (n in 1:N) { 39 | Y[n] ~ categorical(softmax(mu[n,]')); 40 | } 41 | } -------------------------------------------------------------------------------- /model/model10-1-5.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; // num of games 3 | int G; // num of groups(usagi, kame) 4 | int LW[N, 2]; 5 | } 6 | 7 | parameters { 8 | real b; 9 | ordered[2] performance[N]; 10 | } 11 | 12 | transformed parameters { 13 | real mu[G]; 14 | mu[1] = 0; 15 | mu[2] = b; 16 | } 17 | 18 | model { 19 | for (n in 1:N) { 20 | for (j in 1:2) { 21 | performance[n, j] ~ normal(mu[LW[n, j]], 1); 22 | } 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /model/model10-14-matrix.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int D; 4 | int K; 5 | matrix[N, D] X; 6 | int Y[N]; 7 | } 8 | 9 | transformed data { 10 | vector[D] zero; 11 | zero = rep_vector(0, D); 12 | } 13 | 14 | parameters { 15 | matrix[D, K-1] b_raw; 16 | } 17 | 18 | transformed parameters { 19 | matrix[N, K] mu; 20 | matrix[D, K] b; 21 | b = append_col(zero, b_raw); 22 | mu = X * b; 23 | } 24 | 25 | model { 26 | for (n in 1:N) { 27 | Y[n] ~ categorical(softmax(mu[n,]')); 28 | } 29 | } -------------------------------------------------------------------------------- /model/model10-2-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real X[N]; 4 | real Y[N]; 5 | int N_group; 6 | int KID[N]; 7 | } 8 | 9 | parameters { 10 | real a0; 11 | real ak[N_group]; 12 | real sigma_a; 13 | real b0; 14 | real bk[N_group]; 15 | real sigma_b; 16 | real sigma; 17 | } 18 | 19 | transformed parameters { 20 | real a[N_group]; 21 | real b[N_group]; 22 | for (n in 1:N_group) { 23 | a[n] = a0 + ak[n]; 24 | b[n] = b0 + bk[n]; 25 | } 26 | } 27 | 28 | model { 29 | sigma_a ~ student_t(4, 0, 100); 30 | 31 | for (n in 1:N_group) { 32 | ak[n] ~ normal(0, sigma_a); 33 | bk[n] ~ normal(0, sigma_b); 34 | } 35 | for (n in 1:N) { 36 | Y[n] ~ normal(a[KID[n]] + b[KID[n]]*X[n], sigma); 37 | } 38 | } 39 | 40 | generated quantities { 41 | real Y_pred[N]; 42 | real ak_pred[N_group]; 43 | real bk_pred[N_group]; 44 | for (n in 1:N_group) { 45 | ak_pred[n] = normal_rng(0, sigma_a); 46 | bk_pred[n] = normal_rng(0, sigma_b); 47 | } 48 | for (n in 1:N) { 49 | Y_pred[n] = normal_rng(a[KID[n]] + b[KID[n]]*X[n], sigma); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /model/model10-2-3.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int G; // the number of games. 3 | int N; // the number of player's id. 4 | int LW[G, 2]; // the list of game's results. 5 | } 6 | 7 | parameters { 8 | ordered[2] performance[G]; 9 | vector[N] sigma_pf; // 勝負ムラ 10 | real sigma_mu; // パフォーマンスの平均 11 | vector[N] mu; 12 | } 13 | 14 | model { 15 | for (g in 1:G) { 16 | for (i in 1:2) { 17 | performance[g, i] ~ normal(mu[LW[g, i]], sigma_pf[LW[g, i]]); 18 | } 19 | } 20 | 21 | mu ~ normal(0, sigma_mu); 22 | sigma_pf ~ gamma(10, 10); 23 | } 24 | -------------------------------------------------------------------------------- /model/model10-2-4-b.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] X; 4 | vector[N] Y; 5 | int N_group; 6 | int KID[N]; 7 | } 8 | 9 | parameters { 10 | vector[2] ab0; 11 | vector[2] ab[N_group]; 12 | real sigma; 13 | 14 | real s_a; 15 | real s_b; 16 | 17 | // パラメータ再設定 18 | real rho; 19 | } 20 | 21 | transformed parameters { 22 | vector[N_group] a; 23 | vector[N_group] b; 24 | 25 | matrix[2, 2] cov_ab; 26 | 27 | for (n in 1:N_group) { 28 | a[n] = ab[n, 1]; 29 | b[n] = ab[n, 2]; 30 | } 31 | 32 | // パラメータ再構成 33 | cov_ab[1, 1] = square(s_a); 34 | cov_ab[1, 2] = s_a * s_b * rho; 35 | cov_ab[2, 1] = s_a * s_b * rho; 36 | cov_ab[2, 2] = square(s_b); 37 | } 38 | 39 | model { 40 | ab0[1] ~ normal(400, 200); 41 | ab0[2] ~ normal(15, 15); 42 | 43 | s_a ~ student_t(4, 0, 200); 44 | s_b ~ student_t(4, 0, 20); 45 | 46 | ab ~ multi_normal(ab0, cov_ab); 47 | Y ~ normal(a[KID] + b[KID] .* X, sigma); 48 | } -------------------------------------------------------------------------------- /model/model10-2-4-c.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] X; 4 | vector[N] Y; 5 | int N_group; 6 | int KID[N]; 7 | real Nu; 8 | } 9 | 10 | parameters { 11 | vector[2] ab0; 12 | vector[2] ab[N_group]; 13 | real sigma; 14 | 15 | cholesky_factor_corr[2] corr_chol; 16 | vector[2] sigma_vec; 17 | } 18 | 19 | transformed parameters { 20 | vector[N_group] a; 21 | vector[N_group] b; 22 | 23 | cholesky_factor_cov[2] cov_chol; 24 | 25 | for (n in 1:N_group) { 26 | a[n] = ab[n, 1]; 27 | b[n] = ab[n, 2]; 28 | } 29 | 30 | // パラメータ再構成 31 | cov_chol = diag_pre_multiply(sigma_vec, corr_chol); 32 | } 33 | 34 | model { 35 | ab0[1] ~ normal(400, 200); 36 | ab0[2] ~ normal(15, 15); 37 | 38 | sigma_vec[1] ~ student_t(4, 0, 200); 39 | sigma_vec[2] ~ student_t(4, 0, 20); 40 | 41 | corr_chol ~ lkj_corr_cholesky(Nu); 42 | 43 | ab ~ multi_normal_cholesky(ab0, cov_chol); 44 | Y ~ normal(a[KID] + b[KID] .* X, sigma); 45 | } 46 | 47 | generated quantities { 48 | matrix[2, 2] corr; 49 | matrix[2, 2] cov; 50 | corr = multiply_lower_tri_self_transpose(corr_chol); 51 | cov = multiply_lower_tri_self_transpose(cov_chol); 52 | } -------------------------------------------------------------------------------- /model/model10-2-4.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] X; 4 | vector[N] Y; 5 | int N_group; 6 | int KID[N]; 7 | } 8 | 9 | parameters { 10 | vector[2] ab0; 11 | vector[2] ab[N_group]; 12 | cov_matrix[2] cov_ab; 13 | 14 | real sigma; 15 | } 16 | 17 | transformed parameters { 18 | vector[N_group] a; 19 | vector[N_group] b; 20 | 21 | for (n in 1:N_group) { 22 | a[n] = ab[n, 1]; 23 | b[n] = ab[n, 2]; 24 | } 25 | } 26 | 27 | model { 28 | ab ~ multi_normal(ab0, cov_ab); 29 | 30 | Y ~ normal(a[KID] + b[KID] .* X, sigma); 31 | 32 | } -------------------------------------------------------------------------------- /model/model10-3-1-b.stan: -------------------------------------------------------------------------------- 1 | parameters { 2 | real a_raw; 3 | vector[1000] r_raw; 4 | } 5 | 6 | transformed parameters { 7 | real a; 8 | vector[1000] r; 9 | 10 | a = 3.0 * a_raw; 11 | r = exp(a/2) * r_raw; 12 | } 13 | 14 | model { 15 | a_raw ~ normal(0, 1); 16 | r_raw ~ normal(0, 1); 17 | } 18 | -------------------------------------------------------------------------------- /model/model10-3-1.stan: -------------------------------------------------------------------------------- 1 | parameters { 2 | real a; 3 | vector[1000] r; 4 | } 5 | 6 | model { 7 | a ~ normal(0, 3); 8 | r ~ normal(0, exp(a/2)); 9 | } 10 | -------------------------------------------------------------------------------- /model/model10-3-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] X; 4 | vector[N] Y; 5 | int N_group; 6 | int KID[N]; 7 | } 8 | 9 | parameters { 10 | real a0; 11 | real b0; 12 | 13 | vector[N_group] a_raw; 14 | vector[N_group] b_raw; 15 | 16 | real sigma_a; 17 | real sigma_b; 18 | real sigma; 19 | } 20 | 21 | transformed parameters { 22 | vector[N_group] a; 23 | vector[N_group] b; 24 | a = a0 + sigma_a*a_raw; 25 | b = b0 + sigma_b*b_raw; 26 | } 27 | 28 | model { 29 | a_raw ~ normal(0, 1); 30 | b_raw ~ normal(0, 1); 31 | Y ~ normal(a[KID] + b[KID] .* X, sigma); 32 | } -------------------------------------------------------------------------------- /model/model11-1-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int Y[N]; 4 | } 5 | 6 | parameters { 7 | real lambda; 8 | } 9 | 10 | model { 11 | for (n in 1:N) { 12 | vector[40-Y[n]+ 1] k; 13 | for (i in Y[n]:40) { 14 | k[i-Y[n]+1] = poisson_lpmf(i | lambda) + binomial_lpmf(Y[n] | i, 0.5); 15 | } 16 | target += log_sum_exp(k); 17 | } 18 | } -------------------------------------------------------------------------------- /model/model11-1-2b.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int Y[N]; 4 | } 5 | 6 | parameters { 7 | real lambda; 8 | } 9 | 10 | model { 11 | for (n in 1:N) { 12 | Y[n] ~ poisson(lambda*0.5); 13 | } 14 | } -------------------------------------------------------------------------------- /model/model11-1.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int Y[N]; 4 | } 5 | 6 | parameters { 7 | real q; 8 | } 9 | 10 | model { 11 | for (n in 1:N) { 12 | target += log_sum_exp( 13 | log(0.5) + bernoulli_lpmf(Y[n] | q), 14 | log(0.5) + bernoulli_lpmf(Y[n] | 1) 15 | ); 16 | } 17 | } -------------------------------------------------------------------------------- /model/model11-2-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int K; 4 | vector[N] Y; 5 | } 6 | 7 | parameters { 8 | simplex[K] a; 9 | ordered[K] mu; 10 | vector[K] sigma; 11 | real sigma_mu; 12 | } 13 | 14 | model { 15 | mu ~ normal(mean(Y), sigma_mu); 16 | sigma ~ gamma(1.5, 1.0); 17 | for (n in 1:N) { 18 | vector[K] lp; 19 | for (k in 1:K) { 20 | lp[k] = log(a[k]) + normal_lpdf(Y[n] | mu[k], sigma[k]); 21 | } 22 | target += log_sum_exp(lp); 23 | } 24 | } -------------------------------------------------------------------------------- /model/model11-2-2b.stan: -------------------------------------------------------------------------------- 1 | functions { 2 | real normal_mixture_lpdf(real Y, int K, vector a, vector sigma) { 3 | vector[K] lp; 4 | for (k in 1:K) { 5 | lp[k] = log(a[k]) + normal_lpdf(Y[n] | mu[k], sigma[k]); 6 | } 7 | return log_sum_exp(lp); 8 | } 9 | } 10 | 11 | data { 12 | int N; 13 | int K; 14 | vector[N] Y; 15 | } 16 | 17 | parameters { 18 | simplex[K] a; 19 | ordered[K] mu; 20 | vector[K] sigma; 21 | real sigma_mu; 22 | } 23 | 24 | model { 25 | mu ~ normal(mean(Y), sigma_mu); 26 | sigma ~ gamma(1.5, 1.0); 27 | for (n in 1:N) { 28 | Y[n] ~ normal_mixture(K, a, mu, sigma); 29 | } 30 | } -------------------------------------------------------------------------------- /model/model11-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] Y; 4 | } 5 | 6 | parameters { 7 | real a; 8 | ordered[2] mu; 9 | vector[2] sigma; 10 | } 11 | 12 | model { 13 | for (n in 1:N) { 14 | target += log_sum_exp( 15 | log(a) + normal_lpdf(Y[n] | mu[1], sigma[1]), 16 | log1m(a) + normal_lpdf(Y[n] | mu[2], sigma[2]) 17 | ); 18 | } 19 | } -------------------------------------------------------------------------------- /model/model11-3.stan: -------------------------------------------------------------------------------- 1 | functions { 2 | real ZIP_lpmf(int Y, real q, real lambda) { 3 | if (Y == 0) { 4 | return log_sum_exp( 5 | bernoulli_lpmf(0 | q), 6 | bernoulli_lpmf(1 | q) + poisson_log_lpmf(0 | lambda) 7 | ); 8 | } else { 9 | return bernoulli_lpmf(1 | q) + poisson_log_lpmf(Y | lambda); 10 | } 11 | } 12 | } 13 | 14 | data { 15 | int N; 16 | int D; 17 | matrix[N, D] X; 18 | int Y[N]; 19 | } 20 | 21 | parameters { 22 | vector[D] b[2]; 23 | } 24 | 25 | transformed parameters { 26 | vector[N] q; 27 | vector[N] lambda; 28 | 29 | lambda = X * b[2]; 30 | 31 | // ロジスティック関数によるゆるい制約 32 | // inv_logitはvector化に非対応 33 | for (n in 1:N) { 34 | q[n] = inv_logit((X * b[1])[n]); 35 | } 36 | } 37 | 38 | model { 39 | for (n in 1:N) { 40 | Y[n] ~ ZIP(q[n], lambda[n]); 41 | } 42 | } 43 | 44 | 45 | -------------------------------------------------------------------------------- /model/model11-4.stan: -------------------------------------------------------------------------------- 1 | functions { 2 | real CateCate_lpmf(int Y, int K, vector theta, vector[] phi) { 3 | vector[K] lp; 4 | for (k in 1:K) { 5 | lp[k] = log(theta[k]) + log(phi[k, Y]); 6 | } 7 | return log_sum_exp(lp); 8 | } 9 | } 10 | 11 | data { 12 | int E; 13 | int N; 14 | int K; 15 | int I; 16 | int PersonID[E]; 17 | int ItemID[E]; 18 | vector[I] Alpha; 19 | } 20 | 21 | parameters { 22 | simplex[K] theta[N]; 23 | simplex[I] phi[K]; 24 | } 25 | 26 | model { 27 | for (k in 1:K) { 28 | phi[k] ~ dirichlet(Alpha); 29 | } 30 | for (e in 1:E) { 31 | ItemID[e] ~ CateCate(K, theta[PersonID[e]], phi); 32 | } 33 | } -------------------------------------------------------------------------------- /model/model11-exec-1.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] X; 4 | vector[N] Y; 5 | int N_group; 6 | int KID[N]; 7 | } 8 | 9 | parameters { 10 | real a0; 11 | real b0; 12 | 13 | vector[N_group] a; 14 | vector[N_group] b; 15 | 16 | real sigma_a; 17 | real sigma_b; 18 | real sigma; 19 | } 20 | 21 | model { 22 | a ~ normal(a0, sigma_a); 23 | b ~ normal(b0, sigma_b); 24 | 25 | for (n in 1:N) { 26 | target += normal_lpdf(Y[n] | a[KID[n]] + b[KID[n]] * X[n], sigma); 27 | } 28 | } -------------------------------------------------------------------------------- /model/model11-exec-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int Y[N]; 4 | } 5 | 6 | parameters { 7 | real q; 8 | } 9 | 10 | model { 11 | for (n in 1:N) { 12 | target += log_sum_exp( 13 | log(1.0/6) + bernoulli_lpmf(Y[n] | q), 14 | log(5.0/6) + bernoulli_lpmf(Y[n] | 1) 15 | ); 16 | } 17 | } -------------------------------------------------------------------------------- /model/model11-exec-3.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int Y[N]; 4 | } 5 | 6 | parameters { 7 | real q; 8 | } 9 | 10 | model { 11 | for (n in 1:N) { 12 | vector[4] lp; 13 | lp[1] = log(0.5) + log(0.4) + bernoulli_lpmf(Y[n] | q); 14 | lp[2] = log(0.5) + log(0.6) + bernoulli_lpmf(Y[n] | 1); 15 | lp[3] = log(0.5) + log(0.4) + bernoulli_lpmf(Y[n] | 1); 16 | lp[4] = log(0.5) + log(0.6) + bernoulli_lpmf(Y[n] | 1); 17 | target += log_sum_exp(lp); 18 | } 19 | } -------------------------------------------------------------------------------- /model/model11-exec-3b.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int Y[N]; 4 | } 5 | 6 | parameters { 7 | real q; 8 | real p_coin; 9 | } 10 | 11 | model { 12 | for (n in 1:N) { 13 | vector[4] lp; 14 | lp[1] = log(0.5) + log(p_coin) + bernoulli_lpmf(Y[n] | q); 15 | lp[2] = log(0.5) + log1m(p_coin) + bernoulli_lpmf(Y[n] | 1); 16 | lp[3] = log(0.5) + log(p_coin) + bernoulli_lpmf(Y[n] | 1); 17 | lp[4] = log(0.5) + log1m(p_coin) + bernoulli_lpmf(Y[n] | 1); 18 | target += log_sum_exp(lp); 19 | } 20 | } -------------------------------------------------------------------------------- /model/model11-exec-5.stan: -------------------------------------------------------------------------------- 1 | functions{ 2 | real Coinbar_lpmf(int Y, real q) { 3 | return log_sum_exp(log(0.5) + bernoulli_lpmf(Y | q), log(0.5) + bernoulli_lpmf(Y | 1)); 4 | } 5 | } 6 | 7 | data { 8 | int N; 9 | int Y[N]; 10 | } 11 | 12 | parameters { 13 | real q; 14 | } 15 | 16 | model { 17 | for (n in 1:N) { 18 | Y[n] ~ Coinbar(q); 19 | } 20 | } -------------------------------------------------------------------------------- /model/model11-exec-6.stan: -------------------------------------------------------------------------------- 1 | functions { 2 | real CateCate_lpmf(int Y, int K, vector theta, vector[] phi) { 3 | vector[K] lp; 4 | for (k in 1:K) { 5 | lp[k] = log(theta[k]) + log(phi[k, Y]); 6 | } 7 | return log_sum_exp(lp); 8 | } 9 | } 10 | 11 | data { 12 | int E; 13 | int N; 14 | int K; 15 | int I; 16 | int PersonID[E]; 17 | int ItemID[E]; 18 | int C[E]; 19 | vector[I] Alpha; 20 | } 21 | 22 | parameters { 23 | simplex[K] theta[N]; 24 | simplex[I] phi[K]; 25 | } 26 | 27 | model { 28 | for (k in 1:K) { 29 | phi[k] ~ dirichlet(Alpha); 30 | } 31 | for (e in 1:E) { 32 | target += C[e] * CateCate_lpmf(ItemID[e] | K, theta[PersonID[e]], phi); 33 | } 34 | } -------------------------------------------------------------------------------- /model/model12-1-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int N_pred; 4 | vector[N] X; 5 | vector[N] Y; 6 | } 7 | 8 | parameters { 9 | vector[N] mu; 10 | real sigma_mu; 11 | real sigma_y; 12 | } 13 | 14 | model { 15 | for (n in 3:N) { 16 | mu[n] ~ normal(2*mu[n-1] - mu[n-2], sigma_mu); 17 | Y[n] ~ normal(mu[n], sigma_y); 18 | } 19 | } 20 | 21 | generated quantities { 22 | vector[N+N_pred] mu_pred; 23 | vector[N_pred] Y_pred; 24 | 25 | mu_pred[1:N] = mu; 26 | for (n in 1:N_pred) { 27 | mu_pred[N+n] = normal_rng(2*mu_pred[N+n-1]-mu_pred[N+n-2], sigma_mu); 28 | Y_pred[n] = normal_rng(mu_pred[N+n], sigma_y); 29 | } 30 | } -------------------------------------------------------------------------------- /model/model12-1.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int N_pred; 4 | vector[N] X; 5 | vector[N] Y; 6 | } 7 | 8 | parameters { 9 | vector[N] mu; 10 | real sigma_mu; 11 | real sigma_y; 12 | } 13 | 14 | model { 15 | for (n in 2:N) { 16 | mu[n] ~ normal(mu[n-1], sigma_mu); 17 | Y[n] ~ normal(mu[n], sigma_y); 18 | } 19 | } 20 | 21 | generated quantities { 22 | vector[N+N_pred] mu_pred; 23 | vector[N_pred] Y_pred; 24 | 25 | mu_pred[1:N] = mu; 26 | for (n in 1:N_pred) { 27 | mu_pred[N+n] = normal_rng(mu_pred[N+n-1], sigma_mu); 28 | Y_pred[n] = normal_rng(mu_pred[N+n], sigma_y); 29 | } 30 | } -------------------------------------------------------------------------------- /model/model12-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int N_pred; 4 | int L; 5 | vector[N] Y; 6 | } 7 | 8 | parameters { 9 | vector[N] mu; 10 | vector[N] season; 11 | real sigma_mu; 12 | real sigma_season; 13 | real sigma_y; 14 | } 15 | 16 | transformed parameters { 17 | vector[N] y_mean; 18 | y_mean = mu + season; 19 | } 20 | 21 | model { 22 | for (n in 2:N) { 23 | mu[n] ~ normal(mu[n-1], sigma_mu); 24 | } 25 | for (n in L:N) { 26 | season[n] ~ normal(-sum(season[(n-(L-1)):(n-1)]), sigma_season); 27 | Y[n] ~ normal(y_mean[n], sigma_y); 28 | } 29 | } 30 | 31 | generated quantities { 32 | vector[N+N_pred] mu_pred; 33 | vector[N+N_pred] season_pred; 34 | vector[N+N_pred] y_mean_pred; 35 | vector[N_pred] y_pred; 36 | 37 | mu_pred[1:N] = mu; 38 | season_pred[1:N] = season; 39 | y_mean_pred[1:N] = mu+season; 40 | for (n in 1:N_pred) { 41 | mu_pred[N+n] = normal_rng(mu_pred[N+n-1], sigma_mu); 42 | season_pred[N+n] = normal_rng(-sum(season_pred[(N+n-(L-1)):(N+n-1)]), sigma_season); 43 | y_mean_pred[N+n] = mu_pred[N+n]+season_pred[N+n]; 44 | y_pred[n] = normal_rng(y_mean_pred[n], sigma_y); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /model/model12-3-re.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] Y; 4 | } 5 | 6 | parameters { 7 | real beta0; 8 | real beta_unif[N]; 9 | real sigma_c; 10 | real sigma_y; 11 | } 12 | 13 | transformed parameters { 14 | real beta[N]; 15 | beta[1] = beta0; 16 | for (n in 2:N) { 17 | beta[n] = beta[n-1] + sigma_c * tan(beta_unif[n-1]); // beta[n] ~ cauchy(beta[n-1], sigma_c) 18 | } 19 | } 20 | 21 | model { 22 | for (n in 1:N) { 23 | Y[n] ~ normal(beta[n], sigma_y); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /model/model12-3.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] Y; 4 | } 5 | 6 | parameters { 7 | vector[N] mu; 8 | real sigma_c; 9 | real sigma_y; 10 | } 11 | 12 | model { 13 | for (n in 2:N) { 14 | mu[n] ~ cauchy(mu[n-1], sigma_c); 15 | } 16 | for (n in 1:N) { 17 | Y[n] ~ normal(mu[n], sigma_y); 18 | } 19 | } -------------------------------------------------------------------------------- /model/model12-6.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int I; 3 | int Y[I]; 4 | } 5 | 6 | parameters { 7 | vector[I] r; 8 | real sigma_r; 9 | } 10 | 11 | model { 12 | target += normal_lpdf(r[2:I] | r[1:(I-1)], sigma_r); 13 | Y ~ poisson_log(r); 14 | } 15 | 16 | generated quantities { 17 | vector[I] Y_mean; 18 | Y_mean = exp(r); 19 | } 20 | -------------------------------------------------------------------------------- /model/model12-7.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int I; 3 | int J; 4 | real Y[I, J]; 5 | int T; 6 | int TID[I, J]; 7 | } 8 | 9 | parameters { 10 | real r[I, J]; 11 | vector[T] beta; 12 | real sigma_r; 13 | real sigma_b; 14 | real sigma_y; 15 | } 16 | 17 | model { 18 | for (i in 1:I) { 19 | for (j in 3:J) { 20 | target += normal_lpdf(r[i,j] | 2*r[i,j-1] - r[i,j-2], sigma_r); 21 | } 22 | } 23 | for (i in 3:I) { 24 | for (j in 1:J) { 25 | target += normal_lpdf(r[i,j] | 2*r[i-1,j] - r[i-2,j], sigma_r); 26 | } 27 | } 28 | 29 | beta ~ student_t(6, 0, sigma_b); 30 | 31 | for (i in 1:I) { 32 | for (j in 1:J) { 33 | Y[i, j] ~ normal(beta[TID[i, j]] + r[i, j], sigma_y); 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /model/model12-8.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int I; 4 | real Y[N]; 5 | int To[I]; 6 | int From[I]; 7 | } 8 | 9 | parameters { 10 | vector[N] r; 11 | real sigma_r; 12 | real sigma_y; 13 | } 14 | 15 | model { 16 | target += normal_lpdf(r[To] | r[From], sigma_r); 17 | Y ~ normal(r, sigma_y); 18 | sigma_y ~ normal(0, 0.1); 19 | } -------------------------------------------------------------------------------- /model/model12-exec-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int N_pred; 4 | int L; 5 | vector[N] Y; 6 | } 7 | 8 | parameters { 9 | vector[N] mu; 10 | vector[N] season; 11 | real sigma_mu; 12 | real sigma_season; 13 | real sigma_y; 14 | } 15 | 16 | transformed parameters { 17 | vector[N] y_mean; 18 | y_mean = mu + season; 19 | } 20 | 21 | model { 22 | for (n in 2:N) { 23 | mu[n] ~ normal(mu[n-1], sigma_mu); 24 | } 25 | for (n in L:N) { 26 | season[n] ~ normal(-sum(season[(n-(L-1)):(n-1)]), sigma_season); 27 | Y[n] ~ normal(y_mean[n], sigma_y); 28 | } 29 | } 30 | 31 | generated quantities { 32 | vector[N+N_pred] mu_pred; 33 | vector[N+N_pred] season_pred; 34 | vector[N+N_pred] y_mean_pred; 35 | vector[N_pred] y_pred; 36 | 37 | mu_pred[1:N] = mu; 38 | season_pred[1:N] = season; 39 | y_mean_pred[1:N] = mu+season; 40 | for (n in 1:N_pred) { 41 | mu_pred[N+n] = normal_rng(mu_pred[N+n-1], sigma_mu); 42 | season_pred[N+n] = normal_rng(-sum(season_pred[(N+n-(L-1)):(N+n-1)]), sigma_season); 43 | y_mean_pred[N+n] = mu_pred[N+n]+season_pred[N+n]; 44 | y_pred[n] = normal_rng(y_mean_pred[n], sigma_y); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /model/model12-exec-3.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int I; 3 | int J; 4 | real Y[I, J]; 5 | int T; 6 | int TID[I, J]; 7 | } 8 | 9 | parameters { 10 | real r[I, J]; // 位置の影響(yのnoiseが増えると位置の関連性を保とうとするために平坦にになる) 11 | vector[T] beta; // 処理の影響 12 | real sigma_r; 13 | real sigma_b; 14 | real sigma_y; 15 | } 16 | 17 | model { 18 | for (i in 1:I) { 19 | for (j in 3:J) { 20 | target += normal_lpdf(r[i,j] | 2*r[i,j-1] - r[i,j-2], sigma_r); 21 | } 22 | } 23 | for (i in 3:I) { 24 | for (j in 1:J) { 25 | target += normal_lpdf(r[i,j] | 2*r[i-1,j] - r[i-2,j], sigma_r); 26 | } 27 | } 28 | 29 | beta ~ student_t(6, 0, sigma_b); 30 | 31 | for (i in 1:I) { 32 | for (j in 1:J) { 33 | Y[i, j] ~ normal(beta[TID[i, j]] + r[i, j], sigma_y); 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /model/model12-exec-4.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int I; 3 | int J; 4 | real Y[I, J]; 5 | int T; 6 | int TID[I, J]; 7 | real sigma_yy; //事前情報を与えて位置の影響が平坦になることを防ぐ 8 | } 9 | 10 | parameters { 11 | real r[I, J]; // 位置の影響(yのnoiseが増えると位置の関連性を保とうとするために平坦にになる) 12 | vector[T] beta; // 処理の影響 13 | real sigma_r; 14 | real sigma_b; 15 | real sigma_y; 16 | } 17 | 18 | model { 19 | for (i in 1:I) { 20 | for (j in 3:J) { 21 | target += normal_lpdf(r[i,j] | 2*r[i,j-1] - r[i,j-2], sigma_r); 22 | } 23 | } 24 | for (i in 3:I) { 25 | for (j in 1:J) { 26 | target += normal_lpdf(r[i,j] | 2*r[i-1,j] - r[i-2,j], sigma_r); 27 | } 28 | } 29 | 30 | beta ~ student_t(6, 0, sigma_b); 31 | 32 | sigma_y ~ normal(0, sigma_yy); 33 | 34 | for (i in 1:I) { 35 | for (j in 1:J) { 36 | Y[i, j] ~ normal(beta[TID[i, j]] + r[i, j], sigma_y); 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /model/model4-4.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real X[N]; 4 | real Y[N]; 5 | 6 | int N_new; 7 | real X_new[N_new]; 8 | } 9 | 10 | parameters { 11 | real sigma; 12 | real Intercept; 13 | real b; 14 | } 15 | 16 | transformed parameters { 17 | real y_base[N]; 18 | for (i in 1:N) { 19 | y_base[i] = Intercept + b * X[i]; 20 | } 21 | } 22 | 23 | model { 24 | for (i in 1:N) { 25 | Y[i] ~ normal(y_base[i], sigma); 26 | } 27 | } 28 | 29 | generated quantities { 30 | real y_base_new[N_new]; 31 | real y_new[N_new]; 32 | for (i in 1:N_new) { 33 | y_base_new[i] = Intercept + b * X_new[i]; 34 | y_new[i] = normal_rng(y_base_new[i], sigma); 35 | } 36 | } -------------------------------------------------------------------------------- /model/model4-5.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real X[N]; 4 | real Y[N]; 5 | } 6 | 7 | parameters { 8 | real sigma; 9 | real Intercept; 10 | real b; 11 | } 12 | 13 | model { 14 | for (i in 1:N) { 15 | Y[i] ~ normal(Intercept + b * X[i], sigma); 16 | } 17 | } -------------------------------------------------------------------------------- /model/model5-3.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real score[N]; 4 | int a[N]; 5 | real y[N]; 6 | } 7 | 8 | parameters { 9 | real Intercept; 10 | real b_s; 11 | real b_a; 12 | real sigma; 13 | } 14 | 15 | transformed parameters { 16 | vector[N] mu; 17 | for (i in 1:N) { 18 | mu[i] = Intercept + b_s * score[i] + b_a * a[i]; 19 | } 20 | } 21 | 22 | model { 23 | for (i in 1:N) { 24 | y[i] ~ normal(mu[i], sigma); 25 | } 26 | } 27 | 28 | generated quantities { 29 | real y_pred[N]; 30 | real noise[N]; 31 | for (i in 1:N) { 32 | y_pred[i] = normal_rng(mu[i], sigma); 33 | 34 | // 練習問題5(2) 35 | noise[i] = y[i] - mu[i]; 36 | } 37 | } -------------------------------------------------------------------------------- /model/model5-4.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int A[N]; 4 | real Score[N]; 5 | int M[N]; 6 | int Y[N]; 7 | } 8 | 9 | parameters { 10 | real b1; 11 | real b2; 12 | real b3; 13 | } 14 | 15 | transformed parameters { 16 | real q[N]; 17 | for (n in 1:N) { 18 | q[n] = inv_logit(b1 + b2*A[n] + b3*Score[n]); 19 | } 20 | } 21 | 22 | model { 23 | for (n in 1:N) { 24 | Y[n] ~ binomial(M[n], q[n]); 25 | } 26 | } 27 | 28 | generated quantities { 29 | real y_pred[N]; 30 | for (n in 1:N) { 31 | y_pred[n] = binomial_rng(M[n], q[n]); 32 | } 33 | } -------------------------------------------------------------------------------- /model/model5-5-exec-4.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int A[N]; 4 | real Score[N]; 5 | int Weather[N]; 6 | int Y[N]; 7 | } 8 | 9 | parameters { 10 | real b[3]; 11 | real bw1; 12 | real bw2; 13 | real bw3; 14 | } 15 | 16 | transformed parameters { 17 | real bw[3]; 18 | real q[N]; 19 | 20 | bw[1] = bw1; 21 | bw[2] = bw2; 22 | bw[3] = bw3; 23 | for (n in 1:N){ 24 | q[n] = b[1] + b[2]*A[n] + b[3]*Score[n] + bw[Weather[n]]; 25 | } 26 | 27 | } 28 | 29 | model { 30 | for (n in 1:N) { 31 | Y[n] ~ bernoulli_logit(q[n]); 32 | } 33 | } -------------------------------------------------------------------------------- /model/model5-5.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int A[N]; 4 | real Score[N]; 5 | real Weather[N]; 6 | int Y[N]; 7 | } 8 | 9 | parameters { 10 | real b1; 11 | real b2; 12 | real b3; 13 | real b4; 14 | } 15 | 16 | transformed parameters { 17 | real q[N]; 18 | for (n in 1:N) { 19 | q[n] = inv_logit(b1 + b2*A[n] + b3*Score[n] + b4*Weather[n]); 20 | } 21 | } 22 | 23 | model { 24 | for (n in 1:N) { 25 | Y[n] ~ bernoulli(q[n]); 26 | } 27 | } -------------------------------------------------------------------------------- /model/model5-6.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int A[N]; 4 | real Score[N]; 5 | int M[N]; 6 | } 7 | 8 | parameters { 9 | real b[3]; 10 | } 11 | 12 | transformed parameters { 13 | real lambda[N]; 14 | for (n in 1:N) 15 | lambda[n] = exp(b[1] + b[2]*A[n] + b[3]*Score[n]); 16 | } 17 | 18 | model { 19 | for (n in 1:N) 20 | M[n] ~ poisson(lambda[n]); 21 | } 22 | 23 | generated quantities { 24 | int m_pred[N]; 25 | for (n in 1:N) { 26 | m_pred[n] = poisson_rng(lambda[n]); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /model/model7-1.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real Y[N]; 4 | real Area[N]; 5 | int N_new; 6 | real Area_new[N_new]; 7 | } 8 | 9 | parameters { 10 | real b1; 11 | real b2; 12 | real sigma; 13 | } 14 | 15 | transformed parameters { 16 | real mu[N]; 17 | for (n in 1:N) { 18 | mu[n] = b1 + b2 * Area[n]; 19 | } 20 | } 21 | 22 | model { 23 | for (n in 1:N) { 24 | Y[n] ~ normal(mu[n], sigma); 25 | } 26 | } 27 | 28 | generated quantities { 29 | real Y_pred[N]; 30 | real Y_new[N_new]; 31 | for (n in 1:N) { 32 | Y_pred[n] = normal_rng(mu[n], sigma); 33 | } 34 | for (n in 1:N_new) { 35 | Y_new[n] = normal_rng(b1 + b2*Area_new[n], sigma); 36 | } 37 | } -------------------------------------------------------------------------------- /model/model7-2-log.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real Y[N]; 4 | real Area[N]; 5 | int N_new; 6 | real Area_new[N_new]; 7 | } 8 | 9 | parameters { 10 | real b1; 11 | real b2; 12 | real sigma; 13 | } 14 | 15 | transformed parameters { 16 | real mu[N]; 17 | for (n in 1:N) { 18 | mu[n] = b1 + b2 * Area[n]; 19 | } 20 | } 21 | 22 | model { 23 | for (n in 1:N) { 24 | Y[n] ~ normal(mu[n], sigma); 25 | } 26 | } 27 | 28 | generated quantities { 29 | real Y_pred[N]; 30 | real Y_new[N_new]; 31 | for (n in 1:N) { 32 | Y_pred[n] = normal_rng(mu[n], sigma); 33 | } 34 | for (n in 1:N_new) { 35 | Y_new[n] = normal_rng(b1 + b2*Area_new[n], sigma); 36 | } 37 | } -------------------------------------------------------------------------------- /model/model7-3-aircon.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real X[N]; 4 | real Y[N]; 5 | int N_new; 6 | real X_new[N_new]; 7 | } 8 | 9 | parameters { 10 | real b1; 11 | real b2; 12 | real x0; 13 | real sigma; 14 | } 15 | 16 | transformed parameters { 17 | real mu[N]; 18 | for (n in 1:N){ 19 | mu[n] = b1 + b2 * (X[n] - x0)^2; 20 | } 21 | } 22 | 23 | model { 24 | for (n in 1:N) { 25 | Y[n] ~ normal(mu[n], sigma); 26 | } 27 | } 28 | 29 | generated quantities { 30 | real Y_pred[N]; 31 | real Y_new[N_new]; 32 | 33 | for (n in 1:N) { 34 | Y_pred[n] = normal_rng(mu[n], sigma); 35 | } 36 | for (n in 1:N_new) { 37 | Y_new[n] = normal_rng(b1 + b2 * (X_new[n] - x0)^2, sigma); 38 | } 39 | } -------------------------------------------------------------------------------- /model/model7-3-conc.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real time[N]; 4 | real Y[N]; 5 | 6 | int N_new; 7 | real time_new[N_new]; 8 | } 9 | 10 | parameters { 11 | real a; 12 | real b; 13 | real sigma; 14 | } 15 | 16 | model { 17 | for (n in 1:N) { 18 | Y[n] ~ normal(a*(1 - exp(-b*time[n])), sigma); 19 | } 20 | } 21 | 22 | generated quantities { 23 | real Y_pred[N]; 24 | real Y_new[N_new]; 25 | for (n in 1:N) { 26 | Y_pred[n] = normal_rng(a*(1 - exp(-b*time[n])), sigma); 27 | } 28 | for (n in 1:N_new) { 29 | Y_new[n] = normal_rng(a*(1 - exp(-b*time_new[n])), sigma); 30 | } 31 | } -------------------------------------------------------------------------------- /model/model7-5.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real Y[N]; 4 | real Weight[N]; 5 | int Age[N]; 6 | 7 | int N_new; 8 | real Age_new[N_new]; 9 | } 10 | 11 | parameters { 12 | real c1; 13 | real c2; 14 | real sigma_c; 15 | real b1; 16 | real b2; 17 | real b3; 18 | real sigma_b; 19 | } 20 | 21 | model { 22 | for (n in 1:N) { 23 | Weight[n] ~ normal(c1 + c2*Age[n], sigma_c); 24 | Y[n] ~ normal(b1 + b2*Age[n] + b3*Weight[n], sigma_b); 25 | } 26 | } 27 | 28 | generated quantities { 29 | real Weight_new[N_new]; 30 | real Y_new[N_new]; 31 | for (n in 1:N_new) { 32 | Weight_new[n] = normal_rng(c1 + c2*Age_new[n], sigma_c); 33 | Y_new[n] = normal_rng(b1 + b2*Age_new[n] + b3*Weight_new[n], sigma_b); 34 | } 35 | } -------------------------------------------------------------------------------- /model/model7-7.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int X[N]; 4 | real Y[N]; 5 | } 6 | 7 | parameters { 8 | real a; 9 | real b; 10 | real sigma; 11 | real x_true[N]; 12 | } 13 | 14 | model { 15 | for (n in 1:N) { 16 | X[n] ~ normal(x_true[n], 2.5); 17 | Y[n] ~ normal(a + b*x_true[n], sigma); 18 | } 19 | } -------------------------------------------------------------------------------- /model/model7-8.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N_obs; 3 | int N_cens; 4 | real Y_obs[N_obs]; 5 | real L; 6 | } 7 | 8 | parameters { 9 | real mu; 10 | real sigma; 11 | } 12 | 13 | model { 14 | for (n in 1:N_obs) { 15 | Y_obs[n] ~ normal(mu, sigma); 16 | } 17 | target += N_cens * normal_lcdf(L | mu, sigma); 18 | } -------------------------------------------------------------------------------- /model/model7-9.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real Y[N]; 4 | real X[N]; 5 | 6 | int N_new; 7 | real X_new[N_new]; 8 | } 9 | 10 | parameters { 11 | real a; 12 | real b; 13 | real sigma; 14 | } 15 | 16 | model { 17 | for (n in 1:N) { 18 | Y[n] ~ cauchy(a + b * X[n], sigma); 19 | } 20 | } 21 | 22 | generated quantities { 23 | real Y_new[N_new]; 24 | for (n in 1:N_new) { 25 | Y_new[n] = cauchy_rng(a + b * X_new[n], sigma); 26 | } 27 | } -------------------------------------------------------------------------------- /model/model8-1-eq.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real X[N]; 4 | real Y[N]; 5 | int N_group; 6 | int KID[N]; 7 | } 8 | 9 | parameters { 10 | real a0; 11 | real b0; 12 | 13 | real a[N_group]; 14 | real b[N_group]; 15 | 16 | real sigma_a; 17 | real sigma_b; 18 | real sigma; 19 | } 20 | 21 | model { 22 | for (n in 1:N_group){ 23 | a[n] ~ normal(a0, sigma_a); 24 | b[n] ~ normal(b0, sigma_b); 25 | } 26 | for (n in 1:N) { 27 | Y[n] ~ normal(a[KID[n]] + b[KID[n]]*X[n], sigma); 28 | } 29 | } -------------------------------------------------------------------------------- /model/model8-1-group.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real X[N]; 4 | real Y[N]; 5 | int KID[N]; 6 | int N_group; 7 | } 8 | 9 | parameters { 10 | real a[N_group]; 11 | real b[N_group]; 12 | real sigma; 13 | } 14 | 15 | model { 16 | for (n in 1:N) { 17 | Y[n] ~ normal(a[KID[n]] + b[KID[n]]*X[n], sigma); 18 | } 19 | } 20 | 21 | generated quantities { 22 | real Y_pred[N]; 23 | for (n in 1:N) { 24 | Y_pred[n] = normal_rng(a[KID[n]] + b[KID[n]]*X[n], sigma); 25 | } 26 | } -------------------------------------------------------------------------------- /model/model8-1-hie.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real X[N]; 4 | real Y[N]; 5 | int N_group; 6 | int KID[N]; 7 | } 8 | 9 | parameters { 10 | real a0; 11 | real ak[N_group]; 12 | real sigma_a; 13 | real b0; 14 | real bk[N_group]; 15 | real sigma_b; 16 | real sigma; 17 | } 18 | 19 | transformed parameters { 20 | real a[N_group]; 21 | real b[N_group]; 22 | for (n in 1:N_group) { 23 | a[n] = a0 + ak[n]; 24 | b[n] = b0 + bk[n]; 25 | } 26 | } 27 | 28 | model { 29 | for (n in 1:N_group) { 30 | ak[n] ~ normal(0, sigma_a); 31 | bk[n] ~ normal(0, sigma_b); 32 | } 33 | for (n in 1:N) { 34 | Y[n] ~ normal(a[KID[n]] + b[KID[n]]*X[n], sigma); 35 | } 36 | } 37 | 38 | generated quantities { 39 | real Y_pred[N]; 40 | real ak_pred[N_group]; 41 | real bk_pred[N_group]; 42 | for (n in 1:N_group) { 43 | ak_pred[n] = normal_rng(0, sigma_a); 44 | bk_pred[n] = normal_rng(0, sigma_b); 45 | } 46 | for (n in 1:N) { 47 | Y_pred[n] = normal_rng(a[KID[n]] + b[KID[n]]*X[n], sigma); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /model/model8-1.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real X[N]; 4 | real Y[N]; 5 | 6 | int N_new; 7 | real X_new[N_new]; 8 | } 9 | 10 | parameters { 11 | real a; 12 | real b; 13 | real sigma; 14 | } 15 | 16 | model { 17 | for (n in 1:N) { 18 | Y[n] ~ normal(a + b*X[n], sigma); 19 | } 20 | } 21 | 22 | generated quantities { 23 | real Y_pred[N]; 24 | real Y_new[N_new]; 25 | for (n in 1:N) { 26 | Y_pred[n] = normal_rng(a + b*X[n], sigma); 27 | } 28 | for (n in 1:N_new) { 29 | Y_new[n] = normal_rng(a + b*X_new[n], sigma); 30 | } 31 | } -------------------------------------------------------------------------------- /model/model8-2-sd.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real Y[N]; 4 | real X[N]; 5 | int N_group; 6 | int N_industry; 7 | int KID[N]; 8 | int K2G[N_group]; 9 | int GID[N]; 10 | } 11 | 12 | parameters { 13 | real a0; 14 | real a1[N_industry]; 15 | real a[N_group]; 16 | 17 | real b0; 18 | real b1[N_industry]; 19 | real b[N_group]; 20 | 21 | real sigma_a1; 22 | real sigma_b1; 23 | real sigma_a[N_industry]; 24 | real sigma_b[N_industry]; 25 | real sigma[N_industry]; 26 | } 27 | 28 | model { 29 | for (n in 1:N_industry) { 30 | a1[n] ~ normal(a0, sigma_a1); 31 | b1[n] ~ normal(b0, sigma_b1); 32 | } 33 | for (n in 1:N_group) { 34 | a[n] ~ normal(a1[K2G[n]], sigma_a[K2G[n]]); 35 | b[n] ~ normal(b1[K2G[n]], sigma_b[K2G[n]]); 36 | } 37 | for (n in 1:N) { 38 | Y[n] ~ normal(a[KID[n]] + b[KID[n]]*X[n], sigma[GID[n]]); 39 | } 40 | } -------------------------------------------------------------------------------- /model/model8-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | real Y[N]; 4 | real X[N]; 5 | int N_group; 6 | int N_industry; 7 | int KID[N]; 8 | int K2G[N_group]; 9 | } 10 | 11 | parameters { 12 | real a0; 13 | real a1[N_industry]; 14 | real a[N_group]; 15 | 16 | real b0; 17 | real b1[N_industry]; 18 | real b[N_group]; 19 | 20 | real sigma_a1; 21 | real sigma_b1; 22 | real sigma_a; 23 | real sigma_b; 24 | real sigma; 25 | } 26 | 27 | model { 28 | for (n in 1:N_industry) { 29 | a1[n] ~ normal(a0, sigma_a1); 30 | b1[n] ~ normal(b0, sigma_b1); 31 | } 32 | for (n in 1:N_group) { 33 | a[n] ~ normal(a1[K2G[n]], sigma_a); 34 | b[n] ~ normal(b1[K2G[n]], sigma_b); 35 | } 36 | for (n in 1:N) { 37 | Y[n] ~ normal(a[KID[n]] + b[KID[n]]*X[n], sigma); 38 | } 39 | } -------------------------------------------------------------------------------- /model/model8-3-log-b.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int T; 4 | real Time[T]; 5 | real Y[N,T]; 6 | int T_new; 7 | real Time_new[T_new]; 8 | } 9 | 10 | parameters { 11 | real a0; 12 | real b0; 13 | real log_a[N]; 14 | real log_b[N]; 15 | real s_a; 16 | real s_b; 17 | real s_Y; 18 | } 19 | 20 | transformed parameters { 21 | real a[N]; 22 | real b[N]; 23 | for (n in 1:N) { 24 | a[n] = exp(log_a[n]); 25 | b[n] = exp(log_b[n]); 26 | } 27 | } 28 | 29 | model { 30 | for (n in 1:N) { 31 | log_a[n] ~ normal(a0, s_a); 32 | log_b[n] ~ normal(b0, s_b); 33 | } 34 | for (n in 1:N) 35 | for (t in 1:T) 36 | Y[n,t] ~ normal(a[n]*(1 - exp(-b[n]*Time[t])), s_Y); 37 | } 38 | 39 | generated quantities { 40 | real y_new[N,T_new]; 41 | for (n in 1:N) 42 | for (t in 1:T_new) 43 | y_new[n,t] = normal_rng(a[n]*(1 - exp(-b[n]*Time_new[t])), s_Y); 44 | } -------------------------------------------------------------------------------- /model/model8-3-log.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int T; 4 | real Time[T]; 5 | real Y[N, T]; 6 | 7 | int T_new; 8 | real Time_new[T_new]; 9 | } 10 | 11 | parameters { 12 | real log_a[N]; 13 | real log_b[N]; 14 | 15 | real a0; 16 | real b0; 17 | real sigma_a; 18 | real sigma_b; 19 | real sigma; 20 | } 21 | 22 | transformed parameters { 23 | real a[N]; 24 | real b[N]; 25 | for (n in 1:N) { 26 | a[n] = exp(log_a[n]); 27 | b[n] = exp(log_b[n]); 28 | } 29 | } 30 | 31 | model { 32 | for (n in 1:N) { 33 | log_a[n] ~ normal(a0, sigma_a); 34 | log_b[n] ~ normal(b0, sigma_b); 35 | } 36 | 37 | for (n in 1:N) { 38 | for (t in 1:T) { 39 | Y[n, t] ~ normal(a[n]*(1 - exp(-b[n]*Time[t])), sigma); 40 | } 41 | } 42 | } 43 | 44 | generated quantities { 45 | real y_new[N, T_new]; 46 | for (n in 1:N) { 47 | for (t in 1:T_new) { 48 | y_new[n, t] = normal_rng(a[n]*(1 - exp(-b[n]*Time_new[t])), sigma); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /model/model8-3.stan: -------------------------------------------------------------------------------- 1 | // Stan的に間違ったモデリング 2 | data { 3 | int N; 4 | int T; 5 | real Time[T]; 6 | real Y[N, T]; 7 | 8 | int T_new; 9 | real Time_new[T_new]; 10 | } 11 | 12 | parameters { 13 | real a[N]; 14 | real b[N]; 15 | real a0; 16 | real b0; 17 | real sigma_a; 18 | real sigma_b; 19 | real sigma; 20 | } 21 | 22 | 23 | model { 24 | for (n in 1:N) { 25 | a[n] ~ lognormal(a0, sigma_a); 26 | b[n] ~ lognormal(b0, sigma_b); 27 | } 28 | 29 | for (n in 1:N) { 30 | for (t in 1:T) { 31 | Y[n, t] ~ normal(a[n]*(1 - exp(-b[n]*Time[t])), sigma); 32 | } 33 | } 34 | } 35 | 36 | generated quantities { 37 | real y_new[N, T_new]; 38 | for (n in 1:N) { 39 | for (t in 1:T_new) { 40 | y_new[n, t] = normal_rng(a[n]*(1 - exp(-b[n]*Time_new[t])), sigma); 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /model/model8-4-org.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int C; 4 | int I; 5 | int A[N]; 6 | real Score[N]; 7 | int PID[I]; 8 | int CID[I]; 9 | real W[I]; 10 | int Y[I]; 11 | } 12 | 13 | parameters { 14 | real b[4]; 15 | real b_P[N]; 16 | real b_C[C]; 17 | real s_P; 18 | real s_C; 19 | } 20 | 21 | transformed parameters { 22 | real x_P[N]; 23 | real x_C[C]; 24 | real x_J[I]; 25 | real x[I]; 26 | real q[I]; 27 | for (n in 1:N) 28 | x_P[n] = b[2]*A[n] + b[3]*Score[n] + b_P[n]; 29 | for (c in 1:C) 30 | x_C[c] = b_C[c]; 31 | for (i in 1:I) { 32 | x_J[i] = b[4]*W[i]; 33 | x[i] = b[1] + x_P[PID[i]] + x_C[CID[i]] + x_J[i]; 34 | q[i] = inv_logit(x[i]); 35 | } 36 | } 37 | 38 | model { 39 | for (n in 1:N) 40 | b_P[n] ~ normal(0, s_P); 41 | for (c in 1:C) 42 | b_C[c] ~ normal(0, s_C); 43 | for (i in 1:I) 44 | Y[i] ~ bernoulli(q[i]); 45 | } -------------------------------------------------------------------------------- /model/model8-4.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; // Person 3 | int C; // コース 4 | int I; // 授業 5 | 6 | real Score[N]; 7 | int A[N]; 8 | 9 | int PID[I]; 10 | int CID[I]; 11 | real W[I]; 12 | int Y[I]; 13 | } 14 | 15 | parameters { 16 | real b1; // 授業ごと 17 | real b2; // アルバイトの好き嫌い 18 | real b3; // スコア 19 | real b4; // 天気 20 | real bp[N]; // 学生ごと 21 | real bc[C]; // コースごと 22 | real sigma_p; // 人ごとのばらつき 23 | real sigma_c; // コースごとのばらつき 24 | } 25 | 26 | transformed parameters { 27 | real x[I]; 28 | real xw[I]; 29 | real xp[N]; 30 | real xc[C]; 31 | real q[I]; 32 | for (n in 1:N) { 33 | xp[n] = b2*A[n] + b3*Score[n] + bp[n]; 34 | } 35 | for (c in 1:C) { 36 | xc[c] = bc[c]; 37 | } 38 | for (i in 1:I) { 39 | xw[i] = b4 * W[i]; 40 | x[i] = b1 + xp[PID[i]] + xc[CID[i]] + xw[i]; 41 | q[i] = inv_logit(x[i]); 42 | } 43 | } 44 | 45 | model { 46 | for (n in 1:N) { 47 | bp[n] ~ normal(0, sigma_p); 48 | } 49 | for (c in 1:C) { 50 | bc[c] ~ normal(0, sigma_c); 51 | } 52 | for (i in 1:I) { 53 | Y[i] ~ bernoulli(q[i]); 54 | } 55 | } 56 | 57 | -------------------------------------------------------------------------------- /model/model9-2-1.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] X; 4 | vector[N] Y; 5 | 6 | int N_new; 7 | vector[N_new] X_new; 8 | } 9 | 10 | parameters { 11 | real sigma; 12 | real Intercept; 13 | real b; 14 | } 15 | 16 | transformed parameters { 17 | vector[N] y_base; 18 | y_base = Intercept + b * X; 19 | } 20 | 21 | model { 22 | Y ~ normal(y_base, sigma); 23 | } 24 | 25 | generated quantities { 26 | vector[N_new] y_base_new; 27 | vector[N_new] y_new; 28 | for (n in 1:N_new) { 29 | y_base_new[n] = Intercept + b * X_new[n]; 30 | y_new[n] = normal_rng(y_base_new[n], sigma); 31 | } 32 | } -------------------------------------------------------------------------------- /model/model9-2-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | vector[N] X; 4 | vector[N] Y; 5 | int N_group; 6 | int KID[N]; 7 | } 8 | 9 | parameters { 10 | real a0; 11 | real b0; 12 | 13 | vector[N_group] a; 14 | vector[N_group] b; 15 | 16 | real sigma_a; 17 | real sigma_b; 18 | real sigma; 19 | } 20 | 21 | model { 22 | a ~ normal(a0, sigma_a); 23 | b ~ normal(b0, sigma_b); 24 | Y ~ normal(a[KID] + b[KID] .* X, sigma); 25 | } 26 | -------------------------------------------------------------------------------- /model/model9-2-3.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int T; 4 | real Time[T]; 5 | matrix[N, T] Y; 6 | 7 | int T_new; 8 | real Time_new[T_new]; 9 | } 10 | 11 | parameters { 12 | vector[N] log_a; 13 | vector[N] log_b; 14 | 15 | real a0; 16 | real b0; 17 | real sigma_a; 18 | real sigma_b; 19 | real sigma; 20 | } 21 | 22 | transformed parameters { 23 | vector[N] a; 24 | vector[N] b; 25 | matrix[N, T] mu; 26 | 27 | a = exp(log_a); 28 | b = exp(log_b); 29 | 30 | for (t in 1:T) { 31 | for (n in 1:N) { 32 | mu[n, t] = a[n]*(1 - exp(-b[n].*Time[t])); 33 | } 34 | } 35 | } 36 | 37 | model { 38 | log_a ~ normal(a0, sigma_a); 39 | log_b ~ normal(b0, sigma_b); 40 | 41 | to_vector(Y) ~ normal(to_vector(mu), sigma); 42 | } 43 | 44 | generated quantities { 45 | real y_new[N, T_new]; 46 | for (n in 1:N) { 47 | for (t in 1:T_new) { 48 | y_new[n, t] = normal_rng(a[n]*(1 - exp(-b[n]*Time_new[t])), sigma); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /model/model9-3-1-vec.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int D; 4 | vector[D] Y[N]; 5 | } 6 | 7 | parameters { 8 | vector[D] mu; 9 | cov_matrix[D] cov; 10 | } 11 | 12 | model { 13 | Y ~ multi_normal(mu, cov); 14 | } -------------------------------------------------------------------------------- /model/model9-3-1.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int D; 4 | vector[D] Y[N]; 5 | } 6 | 7 | parameters { 8 | vector[D] mu; 9 | cov_matrix[D] cov; 10 | } 11 | 12 | model { 13 | for (n in 1:N) { 14 | Y[n] ~ multi_normal(mu, cov); 15 | } 16 | } -------------------------------------------------------------------------------- /model/model9-3-2.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int D; 4 | matrix[N, D] X; 5 | vector[N] Y; 6 | } 7 | 8 | parameters { 9 | vector[D] b; 10 | real sigma; 11 | } 12 | 13 | transformed parameters { 14 | vector[N] mu; 15 | mu = X * b; 16 | } 17 | 18 | model { 19 | Y ~ normal(mu, sigma); 20 | } 21 | 22 | generated quantities { 23 | real y_pred[N]; 24 | for (i in 1:N) { 25 | y_pred[i] = normal_rng(mu[i], sigma); 26 | } 27 | } -------------------------------------------------------------------------------- /model/model9-4-1-b.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int N; 3 | int K; 4 | int Y[N]; 5 | } 6 | 7 | parameters { 8 | simplex[K] theta; 9 | } 10 | 11 | model { 12 | for (n in 1:N) { 13 | Y[n] ~ categorical(theta); 14 | } 15 | } -------------------------------------------------------------------------------- /model/model9-4-1.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int K; 3 | int Y[K]; 4 | } 5 | 6 | parameters { 7 | simplex[K] theta; 8 | } 9 | 10 | model { 11 | Y ~ multinomial(theta); 12 | } -------------------------------------------------------------------------------- /model/model9-5.stan: -------------------------------------------------------------------------------- 1 | data { 2 | int I; // サンプル数 3 | int N; // 患者人数 4 | int T; // 時刻インデックスの数 5 | int PersonID[I]; // サンプルの人ID 6 | int TimeID[I]; // サンプルの時間ID 7 | real Time[T]; // 時刻インデックスごとの時刻値 8 | real Y[I]; // サンプルごとの薬剤血中濃度 9 | int T_new; 10 | real Time_new[T_new]; 11 | } 12 | 13 | parameters { 14 | vector[N] log_a; 15 | vector[N] log_b; 16 | 17 | real a0; 18 | real b0; 19 | real sigma_a; 20 | real sigma_b; 21 | real sigma; 22 | } 23 | 24 | transformed parameters { 25 | vector[N] a; 26 | vector[N] b; 27 | matrix[N, T] mu; 28 | 29 | a = exp(log_a); 30 | b = exp(log_b); 31 | 32 | for (t in 1:T) { 33 | for (n in 1:N) { 34 | mu[n, t] = a[n]*(1 - exp(-b[n].*Time[t])); 35 | } 36 | } 37 | } 38 | 39 | model { 40 | log_a ~ normal(a0, sigma_a); 41 | log_b ~ normal(b0, sigma_b); 42 | 43 | for (i in 1:I) 44 | Y[i] ~ normal(mu[PersonID[i], TimeID[i]], sigma); 45 | } 46 | 47 | generated quantities { 48 | real y_new[N, T_new]; 49 | for (n in 1:N) { 50 | for (t in 1:T_new) { 51 | y_new[n, t] = normal_rng(a[n]*(1 - exp(-b[n]*Time_new[t])), sigma); 52 | } 53 | } 54 | } --------------------------------------------------------------------------------