2017-01-05 11 views
0

チュートリアルモデルが8schools.stanだったとき、私は数年前にSTANを勉強しました。その後、数年間他のもので忙しくなりました。私は今、STANを再学習しようとしています。今チュートリアルモデルは単にschools.stanです。同じ基本モデルのこれらの2つのバージョンを実行して、シードを同じ値に設定しました。私は全く同じではありませんが、同一ではない2つの結果を得ますが、lp__の値は非常に異なっています。Rsanの8schools.stanとschools.stanの差

8schools.stanとschools.stanの唯一の違いはモデルセクションです。 2つのファイルのdiffは次のとおりです。

[c:\Larry\R-Spaces\STAN]# diff 8schools.stan school.stan 
7,18c17,18 
    eta ~ normal(0, 1); 
    y ~ normal(theta, sigma); 
-- 
    target += normal_lpdf(eta | 0, 1); 
    target += normal_lpdf(y | theta, sigma); 
9a20 

私が理解しているように、これら2つのモデル文は同等です。チュートリアルで与えられた同じschools_datデータセットを使用して、2つのモデルを実行しました。次のSTAN呼び出しを使用し、fit1のみをfit2に変更し、STANファイルを8schools.stanからschools.stanに変更しました。 8schoolsため

fit2 <- stan(
file = "schools.stan", # Stan program 
data = schools_dat,  # named list of data 
chains = 4,    # number of Markov chains 
warmup = 1000,   # number of warmup iterations per chain 
iter = 2000,   # total number of iterations per chain 
cores = 4,    # number of cores (using 2 just for the vignette) 
refresh = 1000,   # show progress every 'refresh' iterations 
seed = 5 
) 

結果:

  mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat 
mu  8.07 0.12 5.12 -1.57 4.73 7.92 11.25 19.01 1839 1 
tau  6.54 0.14 5.55 0.20 2.45 5.19 9.06 21.00 1491 1 
eta[1] 0.37 0.01 0.92 -1.45 -0.24 0.39 0.98 2.12 4000 1 
... 
... 
theta[8] 8.68 0.14 8.03 -5.68 3.79 8.15 12.92 26.57 3403 1 
lp__  -4.79 0.07 2.51 -10.25 -6.37 -4.57 -3.04 -0.41 1202 1 

とschools.stan用:

 mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat 
mu  8.04 0.19 5.25 -2.05 4.76 7.84 11.20 18.65 730 1.00 
tau  6.34 0.20 5.46 0.22 2.33 5.00 8.86 21.39 724 1.01 
eta[1] 0.35 0.02 0.94 -1.56 -0.28 0.38 0.99 2.12 3071 1.00 
... 
... 
theta[8]8.43 0.15 7.63 -6.59 3.78 8.13 12.63 25.05 2742 1.00 
lp__ -39.67 0.07 2.60 -45.31 -41.23 -39.45 -37.81 -35.25 1336 1.00 

二つのモデルの結果はlp__を除いて、非常に近いが、同一ではありませんこれは全く異なっています。私は、2つのモデルがわずかに異なってコンパイルされていると思われるので、種子は同じ値を与えませんでした。しかし、これら2つのモデルステートメントは本当に同一ですか?推定されたパラメータのマイナーな違いを除いて - サンプリングから予想される変動性(ただし同一のシードに注意してください)の範囲内では、顕著な違いはlp__の値にあります。
ここでは何が起こっていますか?私のためにこの問題を明確にすることができる人には、事前に感謝します。

答えて

1

最近では、密度関数では~のバージョンではすべての定数(通常の場合は2の平方根)が削除され、+=のバージョンではそれを保持します。擬似乱数ジェネレータシードを設定しないと、パラメータ推定値には系統的な違いはありませんが、同一ではありません。