原文链接:http://tecdat.cn/?p=11161
原文出处:拓端数据部落公众号
概率编程使我们能够实现统计模型,而不必担心技术细节。这对于基于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 n; # 下界是0
int n; # 上限是5
int n; # n 的范围是 \[0,5\]
注意,如果先验已知变量,则应指定变量的上下边界。
多维数据可以通过方括号指定:
vector\[n\] numbers; // 长度为n的向量
real\[n\] numbers; // 长度为n的浮点数组
matrix\[n,n\] matrix; // n乘n矩阵
程序
Stan中使用以下程序 :
_data_:用于指定以贝叶斯规则为条件的数据
_转换后的数据_:用于预处理数据
参数 (必填):用于指定模型的参数
_转换后的参数_:用于计算后验之前的参数处理
模型 (必填):用于指定模型
_生成数量_:用于对结果进行后处理