跳到内容

mjskay/tidybayes公司

文件夹和文件

姓名姓名
上次提交消息
上次提交日期

最新提交

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

存储库文件导航

tidybayes:贝叶斯分析+整理数据+地理信息

R构建状态 覆盖率状态 CRAN状态 下载计数 内政部

tidybays图预览

tidybays图预览

河豚是一个R包旨在将流行的贝叶斯建模方法轻松集成到整洁的数据+ggplot工作流。它建立在(和重新导出)之上几个函数用于可视化其姊妹包中的不确定性,ggdist(ggdist)

整洁数据帧(一个每行观察)特别方便用于各种R数据操作和可视化包。但是,当使用贝叶斯建模函数,如JAGS或R中的Stan,我们通常必须将这些数据转换为模型能够理解的形式,然后运行模型,将结果样本(或预测)转换为与其他R函数一起使用的更整洁的格式。河豚旨在简化这两种常见(通常是繁琐的)操作:

  • 正在编写数据用于模型。这通常意味着从转换数据数据帧列表,确保因素编码为数字数据,添加变量以存储索引的长度等。这个包有助于自动化这些操作使用compose_data()函数,它自动处理数据类型如数字,符合逻辑的,因素,以及依次的,并允许将其他数据类型转换为格式的简单扩展模型通过提供您自己的泛型实现来理解as_data_list().

  • 提取整齐的绘图来自模型。这通常意味着提取从名称如下的参数中创建索引“b[1,1]”,“b[1,2]”进入之内数据帧的单独列,如i=c(1,1,…)j=c(1,2,…)更乏味的是,有时这些指数实际上对应于原始数据中某一因子的水平;例如“x[1]”可能对应于值x个对于某些因素的第一层次。我们提供了几种从变量,并将索引转换为有用的长格式(“整齐的“)数据帧,带有通用数据类型(因子、逻辑)的自动反向转换使用spread_draws()gather_draws()功能,包括自动恢复与可变指数对应的因子水平。在大多数情况下,这种长格式数据更易于使用其他数据操作和绘图包(例如。,数字播放器,第三年,ggplot2)而不是模型默认提供的格式。请参见渐晕(“tidybayes”)例如。

河豚还为数据提供了一些附加功能许多模型通用的操作和可视化任务:

  • 提取整齐的拟合和预测来自模型。对于以下型号由提供的圣塔那主义业务风险管理系统,河豚提供整洁的模拟后_epred(),后向预测(),以及后_linprid()函数,调用添加_预先绘制(),添加预测图纸(),以及add_linpred_draws()。这些功能根据建模器::add_predictions()函数,然后转动将预测网格转换为一个长格式的数据框架,该数据框架由以下两种数据组成:模型的拟合或预测。这些功能使它直接从模型生成任意拟合线。请参见渐晕(“tidy-brms”)小插曲(“整洁的rstanarm”)例如。

  • 总结后验分布来自模型。河豚重新导出ggdist::点interval()函数族(中位数_qi(),mean_qi(),mode_hdi()等),这些是用于生成设计为整洁的点摘要和间隔工作流程。它们可以生成点摘要和任意概率区间数整齐的绘图数据帧返回整理数据帧尊重数据帧组.河豚还提供和实施后部::summare_draws()用于分组数据帧,例如作为由tidybayes::XXX_draws功能。

  • 可视化先验和后验.对整洁数据的关注使tidybayes的输出易于使用可视化ggplot图.同时现有的地理s(类似ggdist::geom_pointrange()ggdist::geom_linerange())可以提供有用的输出河豚设计用于与中的多个地理信息和统计数据协同工作它的姊妹套餐,ggdist(ggdist)。这些几何体具有合理的默认值适合可视化后点总结和间隔(ggdist::地理点间隔(),ggdist::stat_pointerval()),用点汇总和区间可视化分布(ggdist::stat_sample_slabinterval()统计数据系列,包括眼睛图、半目图、CCDF条形图、梯度图、点图和直方图),并可视化具有任意数量的拟合线不确定度带(ggdist::geom_lineribbon()ggdist::stat_lineribbon()). 也可以在使用相同的方法ggdist::stat_slabinterval()统计数据系列。这个ggdist::geom_dotsingeval()家庭也会自动找到好的点图的装箱参数,可用于轻松构建后验分位数点图(参见本文档中的示例)。对于方便,河豚重新导出ggdist(ggdist)统计数据和地理信息。

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

    请参见渐晕(“slabinterval”,package=“ggdist”)了解更多信息。

  • 随机变量数据帧的提取和可视化模型。河豚还提供了XXX_变量功能为替代方案XXX_图纸功能,例如spread_rvars(),添加预测值()等。这些函数返回整洁的数据第帧,共帧后部::rvar()s、 一种矢量化随机变量数据类型(请参见渐晕(“rvar”,package=“posteral”)有关的更多信息rvar公司s) ●●●●。ggdist::stat_slabinterval()ggdist::stat_lineribbon()几何图形,这些函数使其变得简单从分布中提取样本,对其进行操作,并可视化他们;这种格式在内存方面可能有显著优势对于大型模型是必需的。请参见渐晕(“潮后”)对于示例。

  • 跨因子级别比较变量,这通常意味着首先生成一个因子的成对水平(根据所需的比较集),然后通过这些级别对的比较变量的值。假设您的数据采用返回的格式展开_绘制,的比较级别函数允许跨级别进行比较很容易。

最后,河豚旨在通过以下方式融入通用工作流与其他软件包的兼容性:

  • 它的核心功能是返回整洁的绘图数据帧在的顶部后部::as_draws_df().

  • 用于转换使用的整洁列名的插入函数河豚其他通用包和函数使用的目标/目标名称,包括使用的列名ggmcmc::ggs(通过到ggmcmc_names来自ggmcmc_names)和使用的列名扫帚::整洁(通过至房间名称来自_房间_名称),与其他模型的结果很直观。

  • 这个未读_绘制ungather_图纸函数反转展开_绘制gather_图纸,有助于与其他贝叶斯绘图软件包(特别是贝叶斯图).

  • 这个gather_emmens_draws公司函数将输出从em表示::em表示(原名ls表示)转换为长格式数据帧(当应用于支持的模型类型时,如MCMCglmm公司圣塔那主义型号)。

支持的模型类型

河豚旨在使用统一的接口。当前支持的模型包括rstan公司,指挥棒,业务风险管理系统,圣塔那主义,runjags公司,rjags公司,jagsUI,尾码::mcmc和尾码::mcmc.list,后部::绘制,MCMCglmm公司,什么都可以用它自己的as.mcmc.list实施。如果您安装tidybays.重新思考包,模型来自重新思考包装也包括支持。

安装

您可以使用此R从CRAN安装当前发布的版本命令:

安装程序包("河豚")

或者,您可以从安装最新的开发版本GitHub使用以下R命令:

安装程序包("开发工具")开发工具::安装github("mjskay/tidybayes女士")

示例

这个例子展示了tidybays与Stan建模语言的使用;然而,tidybayes支持许多其他模型类型,例如JAGS、brm、,rstanam,以及(理论上)支持的任何模型类型尾码::as.mcmc.list.

图书馆(马格里特)图书馆(数字播放器)图书馆(ggplot2)图书馆(rstan公司)图书馆(河豚)图书馆(emmeans公司)图书馆(扫帚)图书馆(业务风险管理系统)图书馆(建模师)图书馆(对于猫)图书馆(奶牛场)图书馆(R彩色啤酒)图书馆(gganimate(gg动画))主题集(theme_tidybayes()+面板_订单())

想象一下这个数据集:

设置种子(5)n个 = 10
n条件 = 5
基础知识 =易怒的(条件 = 因素(代表(c)("A类","B类","C类","D类","E类"),n个)),响应 =rnorm公司(n个 * 5,c(0,1,2,1,-1),0.5))基础知识%>%ggplot(aes)图(x个 = 响应, = 条件))+地理点(阿尔法 = 0.5)+伊拉布("条件")

此数据的层次模型可能适合条件(总体平均值),条件的标准偏差手段(条件平均值),每个条件的平均值(条件_平均值[条件])和标准偏差给定条件的响应意味着(响应_sd):

数据{整数<降低=1>n;整数<降低=1>n条件;整数<降低=1,上面的=n_条件>条件[n];真实的响应[n];}参数{真实的总体平均值;矢量[n_condition]条件zoffset;真实的<降低=0>响应sd;真实的<降低=0>条件平均值;}变换后的参数{矢量[n_condition]条件平均值;条件_平均值=总体平均值+条件zoffset*条件平均值;}模型{响应_sd~ 柯西(0,1);//=>半柯西(0,1)条件平均值~ 柯西(0,1);//=>半柯西(0,1)总体平均值~ 正常的(0,5);条件zoffset~ 正常的(0,1);//=>条件平均值~正常值(总平均值,条件平均值)
  对于(i)在里面 1:n){响应[i]~ 正常的(条件_平均[条件[i]],响应_sd);}}

合成数据以输入模型:合成数据(_D)

我们已经编译并将此模型加载到变量中澳大利亚银行(_stan).与其把数据整理成Stan喜欢的格式,我们会使用tidybayes::compose_data()函数,它需要我们的基础知识数据框架并自动生成以下元素的列表:

  • n个:数据框中的观察数
  • n条件:条件因子的级别数
  • 条件:一个整数向量,表示每个条件观察
  • 响应:观察矢量

所以我们可以直接跳到建模:

 =取样(澳大利亚银行(_stan),数据 =合成数据(_D)(基础知识),控制 = 列表(自适应_斜率 = 0.99))

从模型中获得整洁的绘图:展开_绘制

我们使用tidybayes::recover_types(),其中将确保数字索引(如条件)是反向翻译的当我们提取数据时,回到因子:

%<>%恢复类型(基础知识)

现在我们可以使用展开_绘制,其中自动解析索引,将其转换回原始索引格式化,并将其转换为数据帧列。此函数接受使用相同的语法对Stan变量进行符号规范索引Stan中的列。例如,我们可以提取条件平均值和剩余标准偏差:

%>%展开_绘制(条件_平均值[条件],响应_sd) %>%头部(15)#只显示前几行
###A台:15×6###组:条件[1]##条件condition_mean.chain.interration.draw responsesd##<fct><dbl><int><int><int><dbl>##1安0.00544 1 1 1 0.576##2安-0.0836 1 2 2 0.576##3安0.0324 1 3 3 0.551##4安0.113 1 4 4 0.576##5 A 0.157 1 5 5 0.583##6安0.218 1 6 6 0.621##7安0.276 1 7 7 0.641##8安0.0130 1 8 8 0.637##9安0.152 1 9 9 0.609##10安0.192 1 10 10 0.521##11安0.154 1 11 11 0.558##12安0.298 1 12 12 0.552##13 A 0.349 1 13 13 0.531##14安0.471 1 14 14 0.566##15安0.313 1 15 15 0.568

条件编号会自动转换回文本(“A”、“B”、,“C”,…)并拆分为各自的列。长格式数据帧是每次平局都会赢一排$\次$各种指数组合在给定的所有变量中展开_绘制; 例如,因为响应_sd此处未被索引条件,在同一平局内它对每一行具有相同的值,对应于不同的条件(支持的其他一些格式河豚进行了讨论在里面渐晕(“tidybayes”); 特别是,返回的格式gather_图纸).

将后视绘制为眼图:stat_eye()

将索引自动拆分为列,可以轻松绘制条件意味着这里。我们将使用ggdist::stat_eye()地理,它结合了小提琴图的后部密度、中间值、66%和95%分位数间隔给出后部的“眼图”。重点和间隔类型可以使用点间隔()家庭的函数。也可以使用“半眼”图(非镜像密度)作为ggdist::stat_halfeye().所有潮滩几何体自动检测它们的适当方向,尽管可以用覆盖这个方向参数(如果检测失败)。

%>%扩展绘图(条件_平均值[条件]) %>%ggplot(aes)图(x个 = 条件_平均值, = 条件))+stat_eye()

或者可以使用类似的“半目”图:

%>%展开_绘制(条件_平均值[条件]) %>%ggplot(aes)图(x个 = 条件_平均值, = 条件))+stat_halfeye()

用于可视化先验和后验的各种其他统计和地理信息可用;看见渐晕(“slabinterval”,package=“ggdist”)对于概述。

将后验值绘制为分位数点图

如果alpha级别恰好与任何值一致,则间隔很好你正试图做出决定,但要得到背部的形状更好(如上所示的眼图)。另一方面,进行推断从密度图来看是不精确的(将一个形状的面积估计为另一个比例是一项艰巨的感知任务)。推理频率格式的概率更容易,激励分位数点图(Kay等人,2016年,费尔南德斯等2018年),这也允许精确估计任意间隔(直至点分辨率图中100)。

在tidybays的slabinterval geoms家族中dotsinteval公司系列,自动确定合适的垃圾箱点图的大小,可以从样本中计算分位数来构造分位数点图。ggdist::stat_dots()变体是为使用而设计的吗样品上:

%>%展开_绘制(条件_平均值[条件]) %>%ggplot(aes)图(x个 = 条件_平均值, = 条件))+统计_点(分位数 = 100)

这样做的目的是为了避免把后面的东西当作指示一个标准点或区间,但将其表示为(例如)100个大致相同的点。

点和间隔摘要

功能ggdist::median_qi(),ggdist::mean_qi(),ggdist::mode_hdi()等(点_间隔功能)提供整洁点汇总和间隔的输出:

%>%展开_绘制(条件_平均值[条件]) %>%中天_qi(条件_平均值)
###A台:5×7##条件condition_mean.lower.upper.width.point.interval##<fct><dbl><dbl##1 A 0.199-0.142 0.549 0.95中位数qi##2 B 1.01 0.651 1.34 0.95中气##3 C 1.84 1.48 2.19 0.95中位数qi##4 D 1.02 0.681 1.37 0.95中位数qi##5 E-0.890-1.23-0.529 0.95中气

通过与的兼容性与其他型号进行比较扫帚

翻译功能如ggdist::to_broom_name(),ggdist::from_broom_name(),ggdist::to_ggmcmc_names()等可以是用于在具有不同命名方案。例如,这使得比较点变得容易摘要和间隔河豚输出和模型由支持扫帚::整洁.

例如,让我们比较一下普通最小二乘法(OLS)回归:

线性_结果 =流明(响应 ~ 条件,数据 = 基础知识) %>% emmeans公司(~ 条件) %>% 整洁(conf.int软件 = 真的) %>%突变(模型 = "OLS公司")线性_结果
###A台:5×9##条件估计标准误差df conf.低conf.高统计p值模型##<chr><dbl><dbl##1安0.182 0.173 45-0.167 0.530 1.05 3.00e-1 OLS##2 B 1.01 0.173 45 0.665 1.36 5.85 5.13e-7 OLS##3 C 1.87 0.173 45 1.53 2.22 10.8 4.15e-14 OLS##4 D 1.03 0.173 45 0.678 1.38 5.93 3.97 e-7 OLS##5东-0.935 0.173 45-1.28-0.586-5.40 2.41e-6 OLS

使用ggdist::to_broom_name(),我们将输出从中天_qi(使用名称.下部.上部)使用来自的名称扫帚(conf.low(低)conf.高)因此,与扫帚::整洁很简单:

贝叶斯结果 = %>%扩展绘图(条件_平均值[条件]) %>%中天_qi(估计 = 条件_平均值) %>%to_broom_name()%>%突变(模型 = "贝叶斯")贝叶斯结果
###A台:5×8##条件估计conf.低conf.高.宽.点.区间模型##<fct><dbl><dbl><dbl><dbl><chr><chr##1 A 0.199-0.142 0.549 0.95中位数qi Bayes##2 B 1.01 0.651 1.34 0.95中位数qi Bayes##3 C 1.84 1.48 2.19 0.95中位数qi Bayes##4 D 1.02 0.681 1.37 0.95中位数qi Bayes##5 E-0.890-1.23-0.529 0.95中位数qi Bayes

这样可以很容易地将两个结果绑定在一起并绘制它们:

绑定行(_R)(线性_结果,贝叶斯结果) %>%ggplot(aes)图( = 条件,x个 = 估计,克敏 = conf.low(低),x最大值 = conf.高,颜色 = 模型))+地理点间隔(位置 =位置_对象(宽度 = .3))

贝叶斯结果中可以看到总体平均值的收缩。

后验预测和复杂自定义图

返回的整洁数据格式展开_绘制也有助于对变量进行附加计算,然后构造more复杂的自定义打印。例如,我们可以生成后验预测轻松,并使用.宽度参数(内部传递给中天_qi)根据后验预测生成任意数量的区间,然后将它们与点总结和数据一起绘制:

%>%展开_绘制(条件_平均值[条件],响应_sd) %>%突变(预测 =rnorm(n(),条件_平均值,响应_sd)) %>%ggplot(aes( = 条件))+
  
  #后验预测区间统计间隔(aes(x个 = 预测),.宽度 =c(c)(.5,.8,.95))+scale_color_brewer()+
  
  #条件平均值的中位数和分位数区间统计点间隔(aes(x个 = 条件_平均值),.宽度 =c(c)(.66,.95),位置 =位置_预算( = -0.2))+
  
  #数据地理点(aes(x个 = 响应),数据 = 基础知识)

该图显示了66%和95%的后部可信区间每种情况的中位数(点+黑线);95%、80%和50%后预测区间(蓝色);和数据。

拟合曲线

对于支持它的型号(如圣塔那主义业务风险管理系统模型),我们可以也可以使用添加_预先绘制()添加预测图纸()函数到生成后验均值或预测的分布。来自的函数建模师包,这使得生成更容易拟合曲线。

让我们将一个稍微简单的模型与每加仑英里数与马力进行比较在中地铁车厢数据集:

m_mpg(英里/加仑) =商业风险管理(英里/加仑 ~日志(马力),数据 = 地铁车厢,家庭 = 对数正态分布,文件 = "阅读ME_models/m_mpg.rds" #缓存模型(可以删除))

现在我们将使用建模器::data_grid,tidybayes::add_predicted_draws(),ggdist::stat_lineribbon()生成具有多条曲线的拟合曲线概率带:

地铁车厢%>%数据网格(马力 =序列范围(_R)(马力,n个 = 101)) %>%添加预测图纸(m_mpg(英里/加仑)) %>%ggplot(aes(x个 = 马力, = 英里/加仑))+stat_lineribbon(aes( = .预测),.宽度 =c(c)(.99,.95,.8,.5),颜色 = "#08519C号")+地理点(数据 = 地铁车厢,大小 = 2)+scale_fill_brewer()

ggdist::stat_lineribbon(aes(y=.prediction),.width=c(.99,.95,.8,.5))是几个简化常见组合的快捷geom之一河豚功能和ggplot图乔治。它大致相当于以下内容:

统计摘要(原子发射光谱( = .预测,填满 = 对于猫::fct_rev(已订购(状态后(.宽度))), = -后统计(.宽度)),地理 = "丝带",点_间隔 = 中天_qi,函数args = 列表(.宽度 =c(c)(.99,.95,.8,.5)))+统计摘要(aes( = .预测),很有趣。 = 中值的,地理 = "线",颜色 = "红色",线宽 = 1.25)

因为这些都是整洁的数据,如果您想用不同类别变量之间的相互作用自动和手动变速器的曲线),您可以轻松生成预测在该变量上分面(例如,不同的曲线不同的传输类型)。然后可以使用现有的镶嵌面内置于ggplot中的功能用于绘制它们。

这样的模型可能是:

m_mpg_am(分钟_分钟) =商业风险管理(英里/加仑 ~日志(马力)* ,数据 = 地铁车厢,家庭 = 对数正态,文件 = "README_模型/m_mpg_am.rds" #缓存模型(可以删除))

然后我们可以像以前一样生成和绘制预测(与以上内容突出显示为注释):

地铁车厢%>%数据网格(马力 =序列范围(_R)(马力,n个 = 101),) %>%#将am添加到预测网格添加预测图纸(m_mpg_am(分钟_分钟)) %>%ggplot(aes)图(x个 = 马力, = 英里/加仑))+stat_lineribbon(aes( = .预测),.宽度 =c(c)(.99,.95,.8,.5),颜色 = "#08519C号")+地理点(数据 = 地铁车厢)+scale_fill_brewer()+facet_wrap(面覆盖)(~ )#由am刻面

或者,如果您想覆盖绘制的后拟合线,可以使用tidybayes::add_epred_draws()从有条件的方法中获得提款(对后验预测的期望,因此电子脉冲雷达),选择一些合理数量(比如ndraws=100),然后绘制它们:

地铁车厢%>%数据网格(马力 =序列范围(_R)(马力,n个 = 200),) %>%#注意:这显示了使用ndraws在add_epred_draws()中进行子采样
  #只有当你计划制作意大利面条等时,才可以这样做。
  #绝不要对小样本进行二次采样,以绘制间隔、密度等。添加_预先绘制(m_mpg_am(分钟_分钟),ndraws公司 = 100) %>%#样品100是指从后面ggplot(aes)图(x个 = 马力, = 英里/加仑))+几何线(aes( = .epred(.epred), = .绘制),阿尔法 = 1/20,颜色 = "#08519C号")+地理点(数据 = 地铁车厢)+facet_wrap(面覆盖)(~ )

动画假设结果图(HOP)也可以很容易地通过使用构造gganimate(gg动画):

设置种子(12345)ndraws公司 = 50

第页 = 地铁车厢%>%数据网格(马力 =序列范围(_R)(马力,n个 = 50),) %>%#注意:这显示了使用ndraws在add_epred_draws()中进行子采样
  #只有当你计划制作意大利面条等时,才可以这样做。
  #绝不要对小样本进行二次采样,以绘制间隔、密度等。添加_预先绘制(m_mpg_am(分钟_分钟),ndraws公司 = ndraws公司) %>%ggplot(aes)图(x个 = 马力, = 英里/加仑))+几何线(aes( = .epred(.epred), = .绘制),颜色 = "#08519C号")+地理点(数据 = 地铁车厢)+facet_wrap(面覆盖)(~ ,贴标机 = 标签_两者)+过渡状态(.绘制,0,1)+阴影标记(_M)(过去的 = 真的,未来 = 真的,阿尔法 = 1/20,颜色 = "灰色50")设置动画(第页,n帧 = ndraws公司,fps(英尺/秒) = 2.5,宽度 = 672,高度 = 480,单位 = "二甲苯",物件 = 100,开发 = "抹布(_png)")

请参见渐晕(“tidybayes”)用于各种其他示例和对其工作原理的更多解释。

反馈、问题和贡献

欢迎反馈、建议、问题和贡献!联系我mjskay@northestern.edu。如果您发现了错误,请将其归档在这里使用最少的代码复制问题。应针对开发分支。

河豚源于我编写的帮助函数来进行自己的分析管道更加整洁。随着时间的推移,它已经扩展到涵盖更多用例I遇到过,但我很想让它覆盖更多!

引用河豚

马修·凯(2024)。tidybayes:Bayesian的潮汐数据和地理信息模型.R软件包版本3.0.7,https://mjskay.github.io/tidybayes网站/.内政部:10.5281/zenodo.1308151.