概率编程使我们能够实现统计模型,而无需担心技术细节。它对基于MCMC采样的贝叶斯模型特别有用。
视频:R语言中RStan贝叶斯层次模型分析示例
stan简介
Stan是用于贝叶斯推理的C ++库。它基于No-U-Turn采样器(NUTS),该采样器用于根据用户指定的模型和数据估计后验分布。使用Stan执行分析涉及以下步骤:
- 使用Stan建模语言指定统计模型。通过专用的.stan 文件完成此操作 。
- 准备要提供给模型的数据。
- 使用该
stan
函数从后验分布中采样 。 - 分析结果。
在本文中,我将通过两个层次模型展示Stan的用法。我将使用第一个模型讨论Stan的基本功能,并使用第二个示例演示更高级的应用。
学校数据集
我们要使用的第一个数据集是 学校的数据集 。该数据集衡量了教练计划对大学入学考试(在美国使用的学业能力测验(SAT))的影响。 数据集如下所示:
正如我们所看到的:对于八所学校中的大多数,短期教练计划的确提高了SAT分数 。对于此数据集,我们有兴趣估算与每所学校相关的真实教练计划效果大小。我们考虑两种替代方法。首先,我们可以假设所有学校彼此独立。但是,这将难以解释,因为学校的后验区间由于高标准差而在很大程度上重叠。第二,假设所有学校的真实效果都相同,则可以汇总所有学校的数据。但是,这也是不合理的,因为该计划有针对学校的不同效果(例如,不同的老师和学生应该有不同的计划)。
因此,需要另一个模型。分层模型的优点是可以合并来自所有八所学校的信息,而无需假定它们具有共同的真实效果。我们可以通过以下方式指定层次贝叶斯模型:
根据该模型,教练的效果遵循正态分布,其均值是真实效果θj,其标准偏差为σj(从数据中得知)。真正的影响θj遵循参数μ和τ的正态分布。
定义Stan模型文件
在指定了要使用的模型之后,我们现在可以讨论如何在Stan中指定此模型。在为上述模型定义Stan程序之前,让我们看一下Stan建模语言的结构。
变量
在Stan中,可以通过以下方式定义变量:
int<lower=0> n; # 下界是0
int<upper=5> n; # 上限是5
int<lower=0,upper=5> n; # n 的范围是 [0,5]
注意,如果先验已知变量,则应指定变量的上下边界。
多维数据可以通过方括号指定:
vector[n] numbers; // 长度为n的向量
real[n] numbers; // 长度为n的浮点数组
matrix[n,n] matrix; // n乘n矩阵
程序
Stan中使用以下程序 :
- data:用于指定以贝叶斯规则为条件的数据
- 转换后的数据:用于预处理数据
- 参数 (必填):用