从中提取并可视化整齐的绘图rstanam模型

马修·凯

2024-09-15

介绍

这个小插曲描述了如何使用河豚ggdist(ggdist)要提取和可视化的包整齐的的数据帧从模型变量、平均值和预测来自圣塔那主义。有关更一般的介绍河豚及其在通用贝叶斯上的使用建模语言(如Stan和JAGS),请参见渐晕(“tidybayes”).

安装程序

运行此vignette需要以下库:

图书馆(马格里特)
图书馆(dplyr)
图书馆(咕噜声)
图书馆(适用于猫)
图书馆(第三年)
图书馆(建模师)
图书馆(ggdist)
图书馆(河豚)
图书馆(ggplot2)
图书馆(牛头图)
图书馆(第一个)
图书馆(r无政府主义)
图书馆(R彩色啤酒)

主题集(theme_tidybayes乐队()+ 面板_订单())

这些选项有助于斯坦跑得更快:

rstan_options(选项)(自动写入(_W)= 真的)
选项(mc.孔=平行::检测核心())

示例数据集

为了证明河豚,我们将使用一个简单的数据集分别从5种条件下进行10次观察:

设置种子(5)
n个= 10
n条件= 5
基础知识=
  易怒的(
    条件= 代表(c(c)(“A”,“B”,“C”,“D”,“E”),n),
    响应= rnorm公司(n)* 5,c(c)(0,1,2,1,-1),0.5)
)

数据快照如下所示:

(美国广播公司,10)
条件 响应
A类 -0.4204277
B类 1.6921797
C类 1.3722541
D类 1.0350714
E类 -0.1442796
A类 -0.3014540
B类 0.7639168
C类 1.6823143
D类 0.8571132
E类 -0.9309459

这是一个典型的整洁格式的数据帧:每行一个观察值。图形化:

基础知识%>%
  ggplot图(原子发射光谱(年=条件,x个=响应))+
  地理点()

模型

让我们拟合一个收缩到全局的层次模型平均值:

= 标准_分子(回应~(1|条件),数据=ABC,
  先前= 正常的(0,1,自动缩放= 错误的),
  前_辅助= 学生_t(,0,1,自动缩放= 错误的),
  自适应_斜率=.99)

结果如下:

##标准_分子##族:高斯[身份]##公式:响应~(1|条件)##观察值:50## ------##中位数MAD_SD##(截距)0.6 0.5## ##辅助参数:##中位数MAD_SD##σ0.6 0.1## ##错误术语:##组名称标准偏差。##条件(截距)1.14##剩余0.56##级别数:条件5## ## ------##*有关解释打印输出的帮助,请参阅?打印.stanreg##*有关使用的先前版本的信息,请参阅?前摘要.stanreg

使用从潮汐格式中的拟合提取绘制展开_绘制

现在我们有了结果,乐趣开始了:抽奖以整洁的格式!首先,我们将使用获取变量()函数获取原始模型变量名称列表,以便我们知道我们可以从模型中提取的变量:

获取变量(米)
##[1]“(拦截)”“b[(拦截)条件:A]”##[3]“b[(截取)条件:b]”“b[[(截获)条件:C]”##[5]“b[(截获)条件:D]”“b[[(截取)条件:E]”##[7]“sigma”“sigma[条件:(拦截),(拦截)]”##[9]“accept_stat__”“步长__”##[11]“treedepth__”“n_leapfrog__”##[13]“发散_”“能量_”

在这里,(截距)是全球平均值b条参数是相对于每个条件的平均值的偏移量。给定这些参数:

我们可能需要一个数据帧,其中每一行都是来自其中之一b[(截距)条件:A],b[(截距)条件:b],…:C],…:D],或…:E],以及列的位置索引来自哪个链/迭代/绘制行以及哪个条件(A类E类)它是为了。这将允许我们可以轻松计算按条件分组的数量,或生成绘图根据条件使用ggplot,甚至将绘图与原始数据合并到绘制数据和后验概率。

的主力河豚spread_draws()函数,它为我们进行此提取。它包括一个简单的规范格式,我们可以使用它来提取将变量及其索引建模为潮汐格式的数据帧。

以整洁的格式将变量索引收集到单独的列中数据帧

给定这样的参数:

b[(截距)条件:D]

我们可以提供spread_draws()带有一列规范如下:

b[术语,组]

在哪里?学期对应于(截距)条件:D.什么也没有神奇的是什么spread_draws()用这个做规范:在引擎盖下,它用逗号分隔参数索引和空格(可以通过更改九月参数)。它允许您将列分配给结果按顺序索引。所以b[(截距)条件:D]具有索引(截距)条件:D、和spread_draws()让我们将这些索引提取为中的列由此产生的整齐的绘图数据帧b条:

%>%
  展开_绘制(b[术语,组])%>%
  (10)
学期 b条 .链条 .迭代 .绘制
(截距) 条件:A -1.2677915 1 1 1
(截距) 条件:A -0.2132916 1 2 2
(截距) 条件:A 0.0192337 1
(截距) 条件:A -0.4226583 1 4 4
(截距) 条件:A -0.4007204 1 5 5
(截距) 条件:A 0.0275432 1 6 6
(截距) 条件:A -0.3184563 1 7 7
(截距) 条件:A -0.4145287 1 8 8
(截距) 条件:A -0.5637111 1 9 9
(截距) 条件:A -1.1462066 1 10 10

我们可以为索引列选择任何名称;例如。:

%>%
  展开_绘制(b[t,g])%>%
  (10)
t吨 b条 .链条 .迭代 .绘制
(拦截) 条件:A -1.2677915 1 1 1
(截距) 条件:A -0.2132916 1 2 2
(截距) 条件:A 0.0192337 1
(截距) 条件:A -0.4226583 1 4 4
(截距) 条件:A -0.4007204 1 5 5
(截距) 条件:A 0.0275432 1 6 6
(截距) 条件:A -0.3184563 1 7 7
(截距) 条件:A -0.4145287 1 8 8
(截距) 条件:A -0.5637111 1 9 9
(截距) 条件:A -1.1462066 1 10 10

但之前的名字更具描述性,也不那么神秘举个例子可能更好。

在这个特定的模型中,只有一个术语((截距)),因此我们可以将该索引全部省略为每个都要以及b条对于相应条件:

%>%
  展开_绘制(b[,组])%>%
  (10)
b条 .链条 .迭代 .绘制
条件:A -1.2677915 1 1 1
条件:A -0.2132916 1 2 2
条件:A 0.0192337 1
条件:A -0.4226583 1 4 4
条件:A -0.4007204 1 5 5
条件:A 0.0275432 1 6 6
条件:A -0.3184563 1 7 7
条件:A -0.4145287 1 8 8
条件:A -0.5637111 1 9 9
条件:A -1.1462066 1 10 10

由于本例中的所有组都来自条件因子,我们可能还想分离出一列,该列只包含相应条件(A类,B类,C类,等)。我们可以使用tidyr::单独:

%>% 
  展开_绘制(b[,组])%>%
  分离(组,c(c)(“组”,“条件”),":")%>%
  (10)
条件 b条 .链条 .迭代 .绘制
条件 A类 -1.2677915 1 1 1
条件 A类 -0.2132916 1 2 2
条件 A类 0.0192337 1
条件 A类 -0.4226583 1 4 4
条件 A类 -0.4007204 1 5 5
条件 A类 0.0275432 1 6 6
条件 A类 -0.3184563 1 7 7
条件 A类 -0.4145287 1 8 8
条件 A类 -0.5637111 1 9 9
条件 A类 -1.1462066 1 10 10

或者,我们可以更改九月的参数spread_draws()也要拆分:(九月是正则表达式)。注:这个在本例中有效,但在rstanam模型中效果不佳因素之间的相互作用被用作多级中的分组级别模型,因此:不包括在默认值中分离器。

%>% 
  展开_绘制(b[,组,条件],9月= "[, :]")%>%
  (10)
条件 b条 .链条 .迭代 .绘制
条件 A类 -1.2677915 1 1 1
条件 A类 -0.2132916 1 2 2
条件 A类 0.0192337 1
条件 A类 -0.4226583 1 4 4
条件 A类 -0.4007204 1 5 5
条件 A类 0.0275432 1 6 6
条件 A类 -0.3184563 1 7 7
条件 A类 -0.4145287 1 8 8
条件 A类 -0.5637111 1 9 9
条件 A类 -1.1462066 1 10 10

注:如果您使用过spread_draws()对于Stan或JAGS的原始样本,您可能习惯于使用恢复类型()之前spread_draws()得到索引列值返回(例如,如果索引是一个因子)。这不是使用时需要spread_draws()圣塔那主义模型,因为这些模型已经包含了变量名中的信息。有关更多信息恢复类型(),请参阅渐晕(“tidybayes”).

点总结和间隔

使用简单的模型变量

河豚提供了一系列用于生成以整洁的格式对绘图进行点总结和间隔。这些函数遵循命名方案[median|means|mode]_[qi|hdi]例如,中位数_qi(),mean_qi(),mode_hdi(),依此类推。名字(在_)表示积分汇总的类型,第二个名称指示间隔的类型。产生分位数间隔(也称为等尾间隔、中心间隔或百分位数间隔)和高密度指数产生最高(后部)密度间隔。自定义点或间隔函数也可以使用这个点间隔()功能。

例如,我们可以提取与总平均数和标准差的后验分布观察:

%>%
  展开_绘制(`(截距)`,西格玛)%>%
  (10)
.链条 .迭代 .绘制 (截距) 西格玛
1 1 1 1.4707274 0.7488978
1 2 2 0.2947973 0.5082004
1 0.3301366 0.5640631
1 4 4 0.5871531 0.5641068
1 5 5 0.5221652 0.5328644
1 6 6 0.6041039 0.5441214
1 7 7 0.3356784 0.6227631
1 8 8 0.5821142 0.5585193
1 9 9 1.0652540 0.6601671
1 10 10 1.1857010 0.5061982

喜欢与b[术语,组],这给了我们一个整洁的数据框架。如果我们想要变量的中位数和95%分位数区间,我们可以申请中位数_qi():

%>%
  展开_绘制(`(截距)`,西格玛)%>%
  中天_qi(`(截距)`,西格玛)
(截距) (截距).降低 (截距).上部 西格玛 信号低 sigma.上部 .宽度 .间隔
0.6068899 -0.524025 1.576127 0.5602622 0.4564012 0.6969076 0.95 中值的

我们可以指定要从中获取中值和间隔的列,或者如果我们省略列列表,中位数_qi()将使用不是分组列或特殊列的每个列(比如.链条,.迭代,或.绘制). 因此,在上述示例中,(截距)西格玛是多余的参数中位数_qi()因为他们也是我们唯一的专栏从模型中收集。因此,我们可以将其简化为:

%>%
  展开_绘制(`(截距)`,西格玛)%>%
  中天_qi()
(截距) (截距).降低 (截距).上部 西格玛 低σ sigma.上部 .宽度 .间隔
0.6068899 -0.524025 1.576127 0.5602622 0.4564012 0.6969076 0.95 中值的

如果您希望有一个长格式的间隔列表,请使用gather_draws()而是:

%>%
  gather_图纸(`(截距)`,西格玛)%>%
  中天_qi()
.变量 .值 .下部 .上部 .宽度 .间隔
(截距) 0.6068899 -0.5240250 1.5761274 0.95 中值的
西格玛 0.5602622 0.4564012 0.6969076 0.95 中值的

有关更多信息gather_draws(),请参阅渐晕(“tidybayes”).

带索引变量

当我们有一个具有一个或多个索引的模型变量时,例如b条,我们可以申请中位数_qi()(或其他中的函数点间隔()家人)之前:

%>%
  展开_绘制(b[,组])%>%
  中天_qi()
b条 .下部 .上部 .宽度 .间隔
条件:A -0.4102281 -1.4183344 0.7046325 0.95 中值的
条件:B 0.3896187 -0.6296754 1.4930599 0.95 中值的
条件:C 1.2022309 0.2573044 2.3650248 0.95 中值的
条件:D 0.4018216 -0.5885280 1.5544478 0.95 中值的
条件:E -1.4852268 -2.5159162 -0.3674834 0.95 中值的

是怎么做到的中位数_qi()知道要聚合什么吗?数据帧由返回spread_draws()按全部自动分组传递给它的索引变量;在这种情况下,这意味着spread_draws()将结果分组.中位数_qi()尊重这些群体,并计算积分所有小组的总结和间隔。然后,因为没有列传递给中位数_qi(),它作用于唯一的非特定(.-前缀)和非组列,b条.所以上述缩短的语法相当于这个更详细的调用:

%>%
  展开_绘制(b[,组])%>%
  分组方式(_B)(组)%>%       #此行不需要(由spreaddraws完成)
  中天_qi(b)#b不是必需的(它是唯一的非组列)
b条 .下部 .上部 .宽度 .间隔
条件:A -0.4102281 -1.4183344 0.7046325 0.95 中值的
条件:B 0.3896187 -0.6296754 1.4930599 0.95 中值的
条件:C 1.2022309 0.2573044 2.3650248 0.95 中值的
条件:D 0.4018216 -0.5885280 1.5544478 0.95 中值的
条件:E -1.4852268 -2.5159162 -0.3674834 0.95 中值的

河豚还提供了后部::summare_draws()用于分组数据帧(tidybayes::summaries_draws.grouped_df()),你可以用于快速获得收敛诊断:

%>%
  展开_绘制(b[,组])%>%
  summary_draws(总结_绘制)()
变量 意思是 中值的 标准偏差 疯狂的 问题5 第95季度 拉赫特 ess_块 ess_邮件
条件:A b条 -0.4057347 -0.4102281 0.5213397 0.4740819 -1.2175166 0.4292458 1.002752 990.7069 1027.350
条件:B b条 0.3957880 0.3896187 0.5212000 0.4695902 -0.4213188 1.2533932 1.000767 1001.1480 1102.292
条件:C b条 1.2274826 1.2022309 0.5196388 0.4718675 0.4325652 2.0988210 1.000360 977.6632 1216.769
条件:D b条 0.4112236 0.4018216 0.5228306 0.4726678 -0.4119806 1.2704465 1.001687 998.9768 1186.863
条件:E b条 -1.4807896 -1.4852268 0.5237237 0.4739114 -2.3220879 -0.6362849 1.001618 1010.0193 1154.908

以单一整洁的格式组合具有不同索引的变量数据帧

spread_draws()gather_draws()支持将具有不同索引的变量提取到同一数据中框架。具有相同名称的索引将自动匹配,并且根据需要复制值,以便为所有值生成一行所有指标水平的组合。例如,我们可能想计算每个条件的平均值(称为条件_平均值). 在这个模型中,这意味着截距((截距))加上给定条件下的影响(b条).

我们可以从(截距)b条在单个数据帧中:

%>% 
  展开_绘制(`(截距)`,b[,组])%>%
  (10)
.链条 .迭代 .绘制 (截距) b条
1 1 1 1.4707274 条件:A -1.2677915
1 1 1 1.4707274 条件:B -0.1775179
1 1 1 1.4707274 条件:C 0.4365900
1 1 1 1.4707274 条件:D -0.4126736
1 1 1 1.4707274 条件:E -2.1516102
1 2 2 0.2947973 条件:A -0.2132916
1 2 2 0.2947973 条件:B 0.8856697
1 2 2 0.2947973 条件:C 1.6586191
1 2 2 0.2947973 条件:D 0.7126382
1 2 2 0.2947973 条件:E -1.2611341

在每次绘图中,(截距)根据需要重复对应的每个索引b条因此突变可以使用dplyr的函数来求它们的和,条件_平均值(这是每个条件的平均值):

%>%
  展开_绘制(`(截距)`,b[,组])%>%
  突变(条件_平均值= `(截距)` +b)%>%
  中天_qi(条件平均值)
条件_平均值 .下部 .上部 .宽度 .间隔
条件:A 0.2003063 -0.1513986 0.5383789 0.95 中值的
条件:B 0.9939281 0.6536902 1.3569765 0.95 中值的
条件:C 1.8278779 1.4791869 2.1835717 0.95 中值的
条件:D 1.0148093 0.6663604 1.3755843 0.95 中值的
条件:E -0.8775708 -1.2361596 -0.5211076 0.95 中值的

中位数_qi()使用整洁的评估(参见vignette(“tidy-evaluation”,package=“rlang”)),所以它可以采用列表达式,而不仅仅是列名。因此,我们可以简化上述示例通过移动计算条件_平均值突变进入之内中位数_qi():

%>%
  展开_绘制(`(拦截)`,b[,组])%>%
  中天_qi(条件_平均值= `(截距)` +b)
条件_平均值 .下部 .上部 .宽度 .间隔
条件:A 0.2003063 -0.1513986 0.5383789 0.95 中值的
条件:B 0.9939281 0.6536902 1.3569765 0.95 中值的
条件:C 1.8278779 1.4791869 2.1835717 0.95 中值的
条件:D 1.0148093 0.6663604 1.3755843 0.95 中值的
条件:E -0.8775708 -1.2361596 -0.5211076 0.95 中值的

绘制具有多个概率级别的间隔

中位数_qi()其姊妹函数可以生成通过设置.宽度=参数:

%>%
  展开_绘制(`(截距)`,b[,组])%>%
  中天_qi(条件_平均值= `(截距)` +b、,.宽度= c(c)(.95, .8, .5))
条件_平均值 .下部 .上部 .宽度 .间隔
条件:A 0.2003063 -0.1513986 0.5383789 0.95 中值的
条件:B 0.9939281 0.6536902 1.3569765 0.95 中值的
条件:C 1.8278779 1.4791869 2.1835717 0.95 中值的
条件:D 1.0148093 0.6663604 1.3755843 0.95 中值的
条件:E -0.8775708 -1.2361596 -0.5211076 0.95 中值的
条件:A 0.2003063 -0.0265966 0.4099263 0.80 中值的
条件:B 0.9939281 0.7693012 1.2269503 0.80 中值的
条件:C 1.8278779 1.6017549 2.0600395 0.80 中值的
条件:D 1.0148093 0.7787016 1.2419448 0.80 中值的
条件:E -0.8775708 -1.1100043 -0.6524442 0.80 中值的
条件:A 0.2003063 0.0841624 0.3098411 0.50 中值的
条件:B 0.9939281 0.8746343 1.1187394 0.50 中值的
条件:C 1.8278779 1.7088599 1.9502243 0.50 中值的
条件:D 1.0148093 0.8891992 1.1319223 0.50 中值的
条件:E -0.8775708 -1.0004814 -0.7593338 0.50 中值的

结果格式简洁:每组一行,不确定性间隔宽度(.宽度). 这有助于绘图。对于示例,分配-.宽度线宽美学将显示所有间隔,使粗线条与间隔较小。这个ggdist::地理点间隔()地理自动设置线宽适当的美学基于.宽度数据中要生成绘图的列具有多个概率级别的点:

%>%
  展开_绘制(`(截距)`,b[,组])%>%
  中天_qi(条件_平均= `(截距)` +b、,.宽度= c(c)(.95, .66))%>%
  ggplot图(原子发射光谱(年=组,x个=条件平均值,克敏=.降低,x最大值=.上部))+
  地理点间隔()

具有密度的间隔

要查看密度和间隔,我们可以使用ggdist::stat_eye()(“眼图”,结合间隔小提琴情节),或ggdist::stat_halfeye()(间隔+密度图):

%>%
  展开_绘制(`(截距)`,b[,组])%>%
  突变(条件_平均值= `(截距)` +b)%>%
  ggplot图(原子发射光谱(年=组,x个=条件(平均值))+
  统计_半眼()

或者说你想用颜色标注密度的一部分;这个填满在所有地理环境中,板坯的美学可以不同中的统计数据ggdist::geom_slabinterval()家庭,包括ggdist::stat_halfeye()例如,如果您想注释特定领域的实际等效区域(ROPE),您可以这样做:

%>%
  展开_绘制(`(拦截)`,b[,组])%>%
  突变(条件_平均值= `(截距)` +b)%>%
  ggplot图(原子发射光谱(年=组,x个=条件平均值,填充= 后统计(防抱死制动系统(x)<.8)))+
  统计_半眼()+
  地理vline(辛特西普= c(c)(-.8, .8),线型= “虚线”)+
  缩放填充手动(值= c(c)(“灰色80”,“天蓝色”))

分布的其他可视化:统计_不稳定间隔

有多种其他统计信息可用于可视化分布在中ggdist::geom_slabinterval()统计数据和几何图形:

地理和统计的斯拉宾特瓦尔家族

请参见渐晕(“slabinterval”,package=“ggdist”)对于概述。

后验均值和预测

而不是像前面那样手动计算条件平均值例如,我们可以使用添加_预先绘制(),这是类似的rstanam::posterrior_epred()(从后面抽出后验预测的期望;即后部条件平均数的分布),但使用整洁的数据格式。我们可以将其与建模器::data_grid()首先生成网格描述我们想要的预测,然后将该网格转换为从条件均值中提取的长格式数据帧:

基础知识%>%
  数据网格(条件)%>%
  添加_预先绘制(米)%>%
  (10)
条件 .行 .链条 .迭代 .绘制 .epred(.epred)
A类 1 不适用 不适用 1 0.2029359
A类 1 不适用 不适用 2 0.0815057
A类 1 不适用 不适用 0.3493703
A类 1 不适用 不适用 4 0.1644948
A类 1 不适用 不适用 5 0.1214448
A类 1 不适用 不适用 6 0.6316470
A类 1 不适用 不适用 7 0.0172222
A类 1 不适用 不适用 8 0.1675855
A类 1 不适用 不适用 9 0.5015429
A类 1 不适用 不适用 10 0.0394944

为了绘制这个示例,我们还将展示ggdist::stat_pointerval()而不是ggdist::地理点间隔(),它总结了对ggplot中的点汇总和间隔:

基础知识%>%
  数据网格(条件)%>%
  添加_预先绘制(米)%>%
  ggplot图(原子发射光谱(x个=.epred、,年=条件))+
  统计点间隔(.宽度= c(c)(.66, .95))

分位数点图

如果alpha级别正好与无论你想做什么决定,都要做一个后部更好(因此上面的眼图)。另一方面从密度图推断不准确(估计一个密度图的面积形状与另一个形状的比例是一项艰巨的感知任务)。推理关于频率格式的概率更容易,激励分位数点图(凯伊(Kay et)2016年,费尔南德斯等人2018年),它还允许精确估计任意间隔(向下至绘图的点分辨率,示例中为100(见下文)。

在tidybays的slabinterval geoms家族中dotsinteval公司家庭,其中自动确定点图的适当箱子大小,并可以根据样本计算分位数以构建分位数点图。ggdist::stat_dotsingeval()是水平变量设计用于样品:

基础知识%>%
  数据网格(条件)%>%
  添加_预先绘制(米)%>%
  ggplot图(原子发射光谱(x个=.epred、,年=条件))+
  统计时间间隔(分位数= 100)

这个想法是为了避免把后面的表示一个标准点或区间,但表示它比如说100个近似相等的点。

后验预测

在哪里?添加_预先绘制()类似于rstanam::posterrior_epred(),添加预测图纸()类似于rstanam::posterrior_predict(),从后验预测分布。

我们可以使用tidybayes::stat_interval()绘制预测带与数据和后验分布指:

网格=基础知识%>%
  数据网格(条件)

方法=网格%>%
  添加_预先绘制(米)

预放电=网格%>%
  添加预测图纸(米)

基础知识%>%
  ggplot图(原子发射光谱(年=条件,x个=响应))+
  统计间隔(_I)(原子发射光谱(x个=预测),数据=preds)+
  统计点间隔(原子发射光谱(x个=.epred),数据=意味着,.宽度= c(c)(.66, .95),位置= 位置_预算(年= -0.3))+
  地理点()+
  缩放彩色打印机()

拟合/预测曲线

为了演示绘制具有不确定性的拟合曲线,让我们拟合略显幼稚的模型地铁车厢数据集:

m_mpg(英里/加仑)= 锡合金(英里/加仑~马力*气缸,数据=mtcars)

我们可以用概率带绘制拟合曲线:

地铁车厢%>%
  分组方式(_B)(气缸)%>%
  数据网格(马力= 序列范围(_R)(马力,n个= 51))%>%
  添加_预先绘制(百万加仑)%>%
  ggplot图(原子发射光谱(x个=马力,年=英里/加仑,颜色= 命令(气缸))+
  stat_lineribbon状态(原子发射光谱(年=.epred))+
  地理点(数据=mtcars)+
  规模灌装机(调色板= “灰色”)+
  缩放彩色打印机(调色板= “设置2”)

或者我们可以抽样合理数量的拟合线(比如100条)覆盖它们:

地铁车厢%>%
  分组方式(_B)(气缸)%>%
  数据网格(马力= 序列范围(_R)(马力,n个= 101))%>%
  #注释:这显示了使用ndraws在add_epred_draws()中进行子采样
  #只有当你计划制作意大利面条等时,才可以这样做。
  #绝不要对小样本进行二次采样,以绘制间隔、密度等。
  添加_预先绘制(m_mpg,ndraws公司= 100)%>%
  ggplot图(原子发射光谱(x个=马力,年=英里/加仑,颜色= 命令(气缸))+
  地理线(原子发射光谱(年=.epred、,组= 粘贴(气缸拉伸),阿尔法=.1)+
  地理点(数据=mtcars)+
  缩放彩色打印机(调色板= “深色2”)

或者我们可以绘制后验预测(而不是平均值)。为了这个我们还将使用的示例阿尔法让它更容易看到重叠带:

地铁车厢%>%
  分组方式(_B)(气缸)%>%
  数据网格(马力= 序列范围(_R)(马力,n个= 101))%>%
  添加预测图纸(百万加仑)%>%
  ggplot图(原子发射光谱(x个=马力,年=英里/加仑,颜色= 命令(气缸),填充= 命令(气缸))+
  stat_lineribbon状态(原子发射光谱(年=预测),.宽度= c(c)(.95, .80, .50),阿尔法= 1/4)+
  地理点(数据=mtcars)+
  缩放_缩放_缩放(调色板= “设置2”)+
  缩放彩色打印机(调色板= “深色2”)

请参见渐晕(“tidy-brms”)有关配合的其他示例线条,包括动画假设结果图.

比较因子的级别

如果我们想比较每个条件的平均值,比较级别()有助于比较某个因素的不同层次的一些变量。默认情况下,它计算所有成对差异。

让我们演示一下比较级别()具有ggdist::stat_halfeye().我们还将通过以下方式重新订购差异:

%>%
  展开_绘制(b[,,条件],9月= "[, :]")%>%
  比较级别(b,由=条件)%>%
  取消分组()%>%
  突变(条件= 重新排序(条件b)%>%
  ggplot图(原子发射光谱(年=条件,x个=b) )+
  统计_半眼()+
  地理vline(辛特西普= 0,线型= “虚线”)

顺序模型

具有分类预测器的有序模型

下面是一个带有分类预测因子的序数模型:

数据(食管)
m_esoph_rs= 标准普尔(托布普~年龄gp,数据=食管,先前= R2级(0.25),前计数=圣塔那主义::迪里克莱(1))

这个rstanam::posterrior_linpred()序数函数rstanam中的回归模型返回每个模型的链接级预测绘制(与brms::后验_epred(),返回序数模型的每个类别一个预测,参见序数中的回归示例渐晕(“tidy-brms”)).不幸的是,rstanam::posterrior_epred()不提供这种格式。哲学河豚就是整理无论模型输出什么格式,因此要与之保持一致哲学,当应用于序数时圣塔那主义模型,我们将使用示例add_linpred_draws()并演示如何将它们转换为预测的每类概率。

例如,下面是链接级别匹配的绘图:

食管%>%
  数据网格(年龄)%>%
  添加_禁止绘制(m_esoph_rs)%>%
  ggplot图(原子发射光谱(x个= as.数字(agegp),年=.linpred))+
  stat_lineribbon状态()+
  规模灌装机(调色板= “灰色”)

这可能很难解释。将其转化为预测基于每个类别的概率,我们必须使用有序logistic回归定义了类别\(j) 或更少作为:

\[\textrm{logit}\left[Pr(Y\le j)\right]=\alpha_j-\beta x\]

因此,类别的概率\(j)是:

\[\开始{align}Pr(Y=j)&=Pr(Y \le j)-Pr(Y \ le j-1)\\&=\textrm{logit}^{-1}(\alpha_j-\beta x)-\textrm{logit}^{-1}(\alpha{j-1}-\betax)\结束{对齐}\]

要获得这些值,我们需要两件事:

中的阈值圣塔那主义是带名称的系数包含|,指示它们属于哪些类别阈值介于之间。我们可以在变量列表中看到这些参数在模型中:

获取变量(m_esoph_rs)
##[1]“agegp.L”“agegp.Q”“agegp.C”“age gp^4”“age GP^5”“0-9g/天|10-19”##[7]“10-19|20-29”“20-29|30+”“accept_stat__”“stepsize__”“treedepth__”“n_leapfrog__”##[13]“发散_”“能量_”

我们可以使用正则表达式=真的参数gather_draws()查找包含|字符。我们会的使用dplyr::summarie_all(列表)扭转这些门槛添加到列表列中,并添加一个等于\(+\infty\)(代表最高类别):

阈值=m_esoph_rs%>%
  gather_图纸(`.*[|].*`,正则表达式= 真的)%>%
  分组方式(_B)(.绘制)%>%
  选择(.绘制,阈值=.值)%>%
  summary_all(汇总_全部)(列表)%>%
  突变(阈值= 地图(阈值,~ c(c)(.,Inf公司)))

(阈值,10)
.绘制 门槛
1 -0.9705395、0.1546626、1.0081490,Inf
2 -0.9440384、0.4085346、1.3570899,输入
-0.9003523、0.3782366、1.2743608,Inf
4 -1.2188781、0.0994917、1.3055824,Inf
5 -0.9174891、0.2009267、1.2257299,Inf
6 -1.09787791、0.08797248、1.18605543,Inf
7 -0.87089841,0.09926307,1.47029966,Inf公司
8 -1.0844373、0.4159425、1.2738333,Inf
9 -0.5233614、0.4653772、1.6083016,Inf
10 -1.2770482,0.2212309,1.0815977,Inf公司

例如,来自此数据帧的一行的阈值向量(即从后面抽签)如下所示:

阈值[1,]$门槛
## [[1]]##[1]-0.9705395 0.1546626 1.0081490信息

我们可以组合这些阈值(\(\alpha_j\)上述公式中的值)使用.linpred公司来自的列add_linpred_draws()(\(\βx \)根据上述公式)计算每类概率:

食管%>%
  数据网格(年龄)%>%
  添加_输入_绘图(m_esoph_rs)%>%
  inner_join(内部联接)(阈值,由= “.绘制”,多重= “全部”)%>%
  突变(`P(Y=类别)` = 微管相关蛋白2(阈值,.linpred,功能(α,βx)
      #这部分是logit^-1(alphaj-beta*x)-logit^-1
      普洛吉斯(阿尔法-β_x)- 
      普洛吉斯(滞后(α,默认= -Inf公司)-β_x)
))%>%
  突变(.类别= 列表(水平(食管$tobgp)))%>%
  使不安(c(c)(阈值,`P(Y=类别)`,.类别))%>%
  ggplot图(原子发射光谱(x个=年龄gp,年= `P(Y=类别)`,颜色=.类别))+
  统计点间隔(位置= 位置_对象(宽度=.4))+
  缩放_大小_连续(指南= “无”)+
  刻度-颜色-手动(值= 酿酒商.pal(6,“蓝色”)[-c(c)(1,2)])

很难看到上述图中类别的变化;让我们试着做一些能更好地说明每个分布的要点的事情年份:

食管裂孔=食管%>%
  数据网格(年龄)%>%
  添加_输入_绘图(m_esoph_rs)%>%
  inner_join(内部联接)(阈值,由= “.绘制”,多重= “全部”)%>%
  突变(`P(Y=类别)` = 微管相关蛋白2(阈值,.linpred,功能(α,βx)
      #这部分是logit^-1(alphaj-beta*x)-logit^-1
      普洛吉斯(阿尔法-β_x)- 
      普洛吉斯(滞后(α,默认= -Inf公司)-β_x)
))%>%
  突变(.类别= 列表(水平(埃索夫$tobgp)))%>%
  使不安(c(c)(阈值,`P(Y=类别)`,.类别))%>%
  ggplot图(原子发射光谱(x个= `P(Y=类别)`,年=.类别))+
  坐标_自流(展开= 错误的)+
  面_网格(.~年龄gp,交换机= “x”)+
  主题_经典()+
  主题(带状背景= 元素_blank(),条带放置= “外部”)+
  gg标题(“P(烟草消费类别|年龄组)”)+
  xlab公司(“年龄组”)

食管裂孔+
  统计摘要(有趣=中值的,地理= “酒吧”,填充= “灰色65”,宽度= 1,颜色= “白色”)+
  统计点间隔()

这种情况下的条形图可能会产生错误的精确度,因此我们也可以尝试CCDF条形图:

食管裂孔+
  统计_ccdfinterval()+
  expand_limits(扩展限制)(x个= 0)#确保条变为0

该输出应与相应的m_esoph_brm(电子邮件)中的模型渐晕(“tidy-brms”)(模数不同的先验值),尽管生产需要更多的工作圣塔那主义与相比业务风险管理系统.