Path: blob/master/site/zh-cn/probability/examples/HLM_TFP_R_Stan.ipynb
25118 views
Copyright 2018 The TensorFlow Probability Authors.
Licensed under the Apache License, Version 2.0 (the "License");
{TF Probability, R, Stan} 中的线性混合效应回归
1 简介
在此 colab 中,我们将线性混合效应回归模型拟合到流行的小数据集。我们将使用 R 的 lme4
、Stan 的混合效应软件包和 TensorFlow Probability (TFP) 基元对此进行三次拟合。我们通过显示全部三次拟合均给出大致相同的拟合参数和后验分布来得出结论。
我们的主要结论是,TFP 具有拟合类 HLM 模型所需的通用部分,并且它产生的结果与其他软件包(即 lme4
和 rstanarm
)一致。此 colab 并不能准确反映所比较的任何软件包的计算效率。
2 分层线性模型
为了比较 R、Stan 和 TFP,我们将分层线性模型 (HLM) 拟合到 Gelman 等人编写的 Bayesian Data Analysis(第二版第 559 页;第三版第 250 页)中常用的 Radon 数据集。
我们假设以下生成模型:
在 R 的 lme4
“波浪符号”中,此模型相当于:
log_radon ~ 1 + floor + (0 + log_uranium_ppm | county)
我们将使用 的后验分布(以证据为条件)找到 的 MLE。
3 数据整理
在本部分中,我们获得 radon
数据集并进行一些最少的预处理以使其符合我们假设的模型。
3.1 了解您的数据
在本部分中,我们将探索 radon
数据集,以便更好地了解所提出模型为何合理。
结论:
存在 85 个县的长尾。(在 GLMM 中很常见。)
实际上 是不受约束的。(因此线性回归可能有意义。)
读数大多在第 层;没有读数高于第 层。(因此我们的固定效应只有两个权重。)
4 R 中的 HLM
在本部分中,我们使用 R 的 lme4
软件包来拟合上述概率模型。
注:要执行此部分,您必须切换到 R
colab 运行时。
5 Stan 中的 HLM
在本部分中,我们使用 rstanarm 来拟合 Stan 模型,采用的公式/语法与上述 lme4
模型相同。
与 lme4
和下面的 TF 模型不同的是,rstanarm
是一个完全贝叶斯模型,即所有参数都假定从正态分布中抽取,而参数本身则从分布中抽取。
注:要执行此部分,您必须切换到 R
colab 运行时。
注:运行时来自单个 CPU 内核。(此 colab 并不适合忠实表示 Stan 或 TFP 运行时。)
注:切换回 Python TF 内核运行时。
从 lme4 检索组随机效应的点估计值和条件标准差,以便稍后呈现。
使用 lme4 估计均值和标准差为县权重抽取样本。
我们还从 Stan 拟合中检索县权重的后验样本。
此 Stan 示例展示了如何以更接近 TFP 的方式(即通过直接指定概率模型)实现 LMER。
6 TF Probability 中的 HLM
在本部分中,我们将使用低级 TensorFlow Probability 基元 (Distributions
) 来指定我们的分层线性模型并拟合未知参数。
6.1 指定模型
在本部分中,我们使用 TFP 基元指定氡线性混合效应模型。为此,我们指定了两个函数来产生两个 TFP 分布:
make_weights_prior
:随机权重的多元正态先验(乘以 以计算线性预测因子)。make_log_radon_likelihood
:每个观察到的 因变量的一批Normal
分布。
由于我们将拟合每个分布的参数,因此必须使用 TF 变量(即 tf.get_variable
)。不过,由于我们希望使用无约束优化,必须找到一种方法来约束实数值以实现必要的语义,例如,表示标准差的正数。
以下函数构建构造我们的先验 ,其中 表示随机效应权重, 表示标准差。
我们使用 tf.make_template
来确保对此函数的第一次调用会实例化它使用的 TF 变量,并且所有后续调用都会重用变量的当前值。
以下函数构造我们的似然 ,其中 表示响应和证据, 表示固定和随机效应权重, 表示标准差。
这里我们再次使用 tf.make_template
来确保在各调用之间重用 TF 变量。
最后,我们使用先验和似然生成器来构造联合对数密度。
6.2 训练(期望最大化的随机逼近)
为了拟合我们的线性混合效应回归模型,我们将使用随机逼近版本的期望最大化算法 (SAEM)。基本理念是使用来自后验的样本来逼近预期的联合对数密度 (E-step)。随后,我们找到使此计算最大化的参数 (M-step)。更具体地说,通过以下公式给出定点迭代:
其中 表示证据, 是一些需要被边缘化的潜在变量,而 是可能的参数化。
有关更详尽的解释,请参阅 Bernard Delyon、Marc Lavielle、Eric 和 Moulines 编写的随机逼近版本的 EM 算法的收敛(Ann. Statist.,1999 年)。
有关更详尽的解释,请参阅 Bernard Delyon、Marc Lavielle、Eric 和 Moulines 编写的随机逼近版本的 EM 算法的收敛(Ann. Statist.,1999 年)。
要计算 E-step,我们需要从后验抽样。由于不太容易从我们的后验中抽样,因此我们使用汉密尔顿蒙特卡洛 (HMC)。HMC 是一种马尔科夫链蒙特卡洛程序,它使用非归一化后验对数密度的梯度(wrt 状态,而不是参数)来提出新样本。
指定非归一化后验对数密度十分简单,它只是我们希望以任何条件“固定”的联合对数密度。
我们现在通过创建 HMC 转换内核来完成 E-step 设置。
注释:
我们使用
state_stop_gradient=True
来防止 M-step 通过从 MCMC 抽取进行反向传播。(回想一下,我们不需要反向传播,因为我们的 E-step 是在之前最知名的 estimator 中有意参数化的。)我们使用
tf.placeholder
,这样当我们最终执行 TF 计算图时,可以提供前一次迭代的随机 MCMC 样本作为下一次迭代的链值。我们使用 TFP 的自适应
step_size
启发式算法,tfp.mcmc.hmc_step_size_update_fn
。
我们现在设置 M-step。这本质上与可能在 TF 中进行的优化相同。
我们以一些内务处理任务结束。我们必须告诉 TF 所有变量都已初始化。此外,我们还为 TF 变量创建了句柄,以便可以在程序的每次迭代中 print
它们的值。
6.3 执行
在本部分中,我们执行 SAEM TF 计算图。这里的主要技巧是将我们从 HMC 内核中最后一次抽取的数据馈送到下一次迭代中。我们通过在 sess.run
调用中使用 feed_dict
来实现此目的。
看起来在大约 1500 步之后,我们对参数的估计已经稳定下来。
6.4 结果
现在,我们已经拟合了参数,我们来生成大量后验样本并研究结果。
我们现在构造 随机效应的盒须图。我们将通过降低县频率来对随机效应排序。
从这张盒须图中,我们观察到县级 随机效应的方差随着该县在数据集中的代表性减少而增大。从直觉上说,这是有道理的,如果针对某个县的证据较少,那么我们对该县影响的确定性应当会降低。
7 并排比较
我们现在比较全部三个程序的结果。为此,我们将计算由 Stan 和 TFP 生成的后验样本的非参数估计。此外,我们还将与 R 的 lme4
软件包产生的参数(逼近)估计进行比较。
下图描绘了明尼苏达州每个县的每个权重的后验分布。我们显示了 Stan(红色)、TFP(蓝色)和 R 的 lme4
(橙色)的结果。我们给 Stan 和 TFP 的结果加上阴影,因此预期在两者一致时会看到紫色。为简单起见,我们不给 R 的结果加上阴影。每个子图代表一个县,按光栅扫描顺序(即从左到右,然后从上到下)降序排列。
8 结论
在此 colab 中,我们将线性混合效应回归模型拟合到氡数据集。我们尝试了三种不同的软件包:R、Stan 和 TensorFlow Probability。我们最后绘制了由三个不同软件包计算的 85 个后验分布。
附录 A:替代氡 HLM(添加随机截距)
在本部分中,我们会介绍一种替代 HLM,它也具有与每个县相关联的随机截距。
在 R 的 lme4
“波浪符号”中,此模型相当于:
log_radon ~ 1 + floor + (1 + log_county_uranium_ppm | county)
附录 B:广义线性混合效应模型
在本部分中,我们将给出正文中使用的分层线性模型的一种更一般的表征。这种更一般的模型被称为广义线性混合效应模型 (GLMM)。
GLMM 是广义线性模型 (GLM) 的一般化。GLMM 通过在预测的线性响应中加入样本特定的随机噪声来扩展 GLM。这在一定程度上很有用,因为它允许罕见的特征与更常见的特征共享信息。
作为一个生成式过程,广义线性混合效应模型 (GLMM) 的表征为:
ParseError: KaTeX parse error: Expected 'EOF', got '#' at position 70: …e{2.45cm}\text{#̲ 对于每个随机效应组}\ &a…其中:
$$ \begin{align} R &= \text{随机效应组的数量}\ |C_r| &= \text{$rParseError: KaTeX parse error: Expected 'EOF', got '}' at position 8: 组的类别数量}̲\ N &= \tex…irParseError: KaTeX parse error: Expected 'EOF', got '}' at position 5: 组下)}̲\ z_{r,i} &…rParseError: KaTeX parse error: Expected 'EOF', got '}' at position 12: 组相关的随机效应数量}̲\ \Sigma_{r} &a…$
换句话说,这意味着每个组的每个类别都与一个 iid MVN 相关联。尽管 抽样始终是独立的,但它们只对 组有相同的分布;请注意,每个 有且只有一个 。
当以仿射的方式与样本的组的特征 组合时,结果是第 个预测线性响应的样本特定噪声(否则为 )。
当我们估计 时,我们本质上是在估计随机效应组携带的噪声量,否则这些噪声会淹没 中存在的信号。