原文连贯:http://tecdat.cn/?p=6252
R的Stan
能够从许多统计软件包中运行Stan。到目前为止,我始终在从R运行Stan。
简略线性回归
第一步是为Stan模型编写文件。这蕴含一个文件linreg.stan:
data { int N; vector[N] x; vector[N] y;}model { y ~ normal(alpha + beta * x, sigma);}
该文件的第一局部称为数据,它申明了将作为输出传递给Stan的标量,向量和矩阵。
接下来,咱们能够通过运行以下R代码来模仿数据集,并应用Stan和咱们的文件linreg.stan来拟合模型:
stan(file = 'linreg. ', data = mydata, iter = 1000, = 4)
第一次装置Stan模型时,模型编译成C ++时会有几秒钟的提早。然而,一旦编译了模型,就能够将其利用于新的数据集而无需反复编译过程(执行模仿钻研具备很大的劣势)。
在下面的代码中,咱们要求Stan运行4个独立的链,每个链有1000次迭代。运行后,咱们能够通过以下形式汇总输入:
Inference for Stan model: linreg.4 chains, each with iter=1000; warmup=500; thin=1; post-warmup draws per chain=500, total post-warmup draws=2000. mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhatalpha -0.10 0.00 0.10 -0.29 -0.16 -0.10 -0.04 0.09 1346 1beta 0.95 0.00 0.11 0.75 0.88 0.95 1.02 1.17 1467 1sigma 0.98 0.00 0.07 0.85 0.93 0.98 1.03 1.12 1265 1lp__ -47.54 0.06 1.24 -50.77 -48.02 -47.24 -46.68 -46.17 503 1Samples were drawn using NUTS(diag_e) at Mon Jun 08 18:35:58 2015.For each parameter, n_eff is a crude measure of effective sample size,and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat=1).
对于回归斜率,咱们的后验均值为0.95(靠近用于模仿数据的实在值1)。为了造成95%的后验置信区间,咱们简略地采纳取样后验的2.5%和97.5%的百分位数,这里是0.75到1.17。
您能够从拟合的模型中获取各种其余数量。一种是绘制其中一个模型参数的后验散布。要取得回归斜率,咱们能够执行以下操作:
hist(result$beta)
后验散布直方图
当初让咱们应用规范一般最小二乘拟合线性模型:
Residuals: Min 1Q Median 3Q Max -1.9073 -0.6835 -0.0875 0.5806 3.2904 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.10280 0.09755 -1.054 0.295 x 0.94753 0.10688 8.865 3.5e-14 ***---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 0.9707 on 98 degrees of freedomMultiple R-squared: 0.4451, Adjusted R-squared: 0.4394 F-statistic: 78.6 on 1 and 98 DF, p-value: 3.497e-14
这给出了咱们对斜率0.95的预计,与Stan的后验平均值相差2位小数,标准误差为0.11,这与Stan的后验SD雷同。
stan和贝叶斯推理
有趣味摸索Stan并应用它来执行贝叶斯推理,这是出于测量误差和数据缺失的问题。正如WinBUGS和作者所形容的,贝叶斯办法在解决不同的不确定性起源问题时十分天然,这些不确定性起源超出参数不确定性,例如缺失数据或用误差测量的协变量。实际上,对于风行的缺失数据多重插补办法是在贝叶斯范式内倒退的。