def fit(self, stan_data: Dict[str, str], init: Dict): mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123) mcmc_sample = mcmc_result.extract() return mcmc_sample
def fit(self, stan_data): mcmc_result = mcmc_tools.sampling( self.model_file, stan_data, n_jobs=4, seed=1234, init=lambda: dict(r=self.data['Y'], sigma_r=1, sigma_y=0.1)) return mcmc_result.extract()
def fit(self, stan_data): mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=1234, iter=5200, warmup=200) return mcmc_result.extract()
def salary_modeling(salary, filename): Y = salary['Y'] X = salary['X'] N = len(Y) N_group = 4 KID = salary['KID'] stan_data = {'Y': Y, 'X': X, 'N': N, 'N_group': N_group, 'KID': KID} # コンパイル mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) mcmc_sample = mcmc_result.extract() return mcmc_sample
# ペアプロットの表示 sns.pairplot(attendance_1, hue="A", diag_kind='hist') plt.show() # スケーリング score = attendance_1['Score'] / 200 y = attendance_1['Y'] a = attendance_1['A'] sample_num = len(y) stan_data = {'N': sample_num, 'score': score, 'a': a, 'y': y} # 正の整数を正規分布で推定する例(データの特性によっては二項分布でなくて計算が高速な正規分布を利用することがある) # 説明はP.66 filename = '../model/model-exec9-1' mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4) mcmc_sample = mcmc_result.extract() # 練習問題 (1) # 各サンプリング結果からYを引き算したサンプリング結果を生成 y_sample = y.values.reshape((50, 1)) * np.ones((1, len(mcmc_sample['mu']))) mu_sample = mcmc_sample['mu'].T ipsilon = y_sample - mu_sample print("ipsilon length: %d" % len(ipsilon)) ipsilon_mean = np.mean(ipsilon, axis=1) noise = mcmc_sample['noise'].T print("noise length: %d" % len(noise)) noise_mean = np.mean(noise, axis=1)
'I': I, 'Y': Y, 'W': W, 'PID': PID, 'CID': CID, 'Score': Score, 'A': A } # 保存する変数 variables = ['b1', 'b2', 'b3', 'b4', 'bp', 'bc', 'q'] filename = '../model/model-8-exec-4' mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123, pars=variables) mcmc_sample = mcmc_result.extract() # 正規分布のときと同様のグラフを描いて確認 # 各変数の応答変数に対する影響度を確認する。 fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.violinplot([ mcmc_sample['b1'], mcmc_sample['b2'], mcmc_sample['b3'], mcmc_sample['b4'] ]) ax.set_xticks([1, 2, 3, 4, 5, 6]) ax.set_xticklabels(['b1', 'b2', 'b3', 'b4']) ax.set_xlabel('parameters')
def fit(self, stan_data): mcmc_result = mcmc_tools.sampling(self.model_file, stan_data, n_jobs=4, seed=123) return mcmc_result.extract()
} # # コンパイル # filename = 'model10-2-4' # mcmc_result_b = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) # mcmc_sample = mcmc_result_b.extract() # # # # コンパイル # # パラメータを再構成して制約を与えたパターン # # ただし、この方法はパラメータが増えた場合に制約を設定しにくい。 # filename = 'model10-2-4-b' # mcmc_result_b = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) # mcmc_sample_b = mcmc_result_b.extract() # コンパイル # LKJ相関分布を使う方法 # 知らないと適用が難しいが、変数間の相関を事前分布として設定するのによく使われるとのこと。 filename = '../model/model10-2-4-c' stan_data_c = { 'Y': Y, 'N': N, 'X': X, 'KID': KID, 'N_group': N_group, 'Nu': 2 } mcmc_result_c = mcmc_tools.sampling(filename, stan_data_c, n_jobs=4, seed=123) mcmc_sample_c = mcmc_result_c.extract() # このモデリングでは、相関行列と分散共分散行列を求める方法も示している。 # a と b の関係を得ることができる。
K2G = salary3.drop_duplicates(subset=['KID', 'GID'])['GID'] stan_data = { 'Y': Y, 'X': X, 'N': N, 'N_group': N_group, 'N_industry': N_industry, 'KID': KID, 'K2G': K2G, 'GID': GID } # コンパイル filename = '../model/model8-2' mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) mcmc_sample = mcmc_result.extract() # このモデリングでは、業界ごとに変化するのは平均のみと仮定しているが、 # 分散も変化すると仮定するモデリングを行う。 # filename = '../model/model8-2-sd' mcmc_result_sd = mcmc_tools.sampling(filename, stan_data, n_jobs=4, seed=123) mcmc_sample_sd = mcmc_result.extract() # もしモデルが収束しない場合、複雑さに比べてデータが少ないことが原因が考えられる。 # 練習問題8(3) # 会社ごとの年収のベイズ予測区間 # ※ 書籍ではmodel8-5.stanがここではmodel8-2.stan # a業界平均[g]とb業界平均[g]の事後分布を描く N_mcmc = mcmc_sample['lp__'].size
# vector同士の内積計算をStanで行う。 import numpy as np import mcmc_tools a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) ra = np.array([1, 2, 3]) stan_data = {'N': 3, 'a': a, 'b': b, 'ra': ra} # コンパイル filename = '../model/model-exec9-3' mcmc_result = mcmc_tools.sampling(filename, stan_data, n_jobs=4, algorithm='Fixed_param') mcmc_sample = mcmc_result.extract() ip = np.inner(a, b) print(ip)
'N': N, 'T': T, 'T_new': T_new, 'Time_new': Time_new } print(Y) # コンパイル filename = '../model/model8-3-log' start = time.time() mcmc_result = mcmc_tools.sampling(filename, stan_data, adapt_delta=0.99, n_jobs=4, warmup=2000, iter=4000, seed=1234579) elapsed_time = time.time() - start print("elapsed_time:{0}".format(elapsed_time) + "[sec]") mcmc_sample = mcmc_result.extract() # モデリングをそのままStanにすると非線形関数を左辺にもってくることになってwarningが出る。 # それだけでなく、サンプリング不能になってしまう。 # そのため、Stanで計算するときは、変数変換項で、非線形関数の変換は終わらせて、サンプリングの左辺には # 非線形関数の結果をもってこないようにすることが必要である。 # そのためmodel8-3を書き換えて、model8-3-logのように記述する。 # このwarningの別の解決方法にはlognormal関数を使うという手がある。