带连续预测器的序数模型
我们将使用地铁车厢
预测的数据集给定汽车里程数的汽车气缸数(单位:英里/加仑)。虽然这有点倒退因果关系(大概是气缸数导致里程(如果有的话),这并不意味着这不是一个很好的预测任务(我可能会告诉某人对汽车的MPG有一定的了解,他们可以做得很合理善于猜测发动机中的气缸数)。
在拟合模型之前,让我们通过将气缸
列一个有序因子(默认情况下,它只是一个编号):
mtcars_清洁=地铁车厢%>%
突变(气缸= 命令(气缸)
头(mtcars_clean)
马自达RX4 |
21 |
6 |
160 |
110 |
3.90 |
2.620 |
16.46 |
0 |
1 |
4 |
4 |
马自达RX4旅行车 |
21 |
6 |
160 |
110 |
3.90 |
2.875 |
17.02 |
0 |
1 |
4 |
4 |
达特桑710 |
22.8 |
4 |
108 |
93 |
3.85 |
2.320 |
18.61 |
1 |
1 |
4 |
1 |
大黄蜂4号驱动器 |
21.4 |
6 |
258 |
110 |
3.08 |
3.215 |
19.44 |
1 |
0 |
三 |
1 |
大黄蜂运动会 |
18.7 |
8 |
360 |
175 |
3.15 |
3.440 |
17.02 |
0 |
0 |
三 |
2 |
勇敢的 |
18.1 |
6 |
225 |
105 |
2.76 |
3.460 |
20.22 |
1 |
0 |
三 |
1 |
然后我们将拟合一个序数回归模型:
m气缸= 商业风险管理(
气缸~英里/加仑,
数据=mtcars_清洁,
家庭=累计,
种子= 58393,
文件= “型号/tidy-brms_m_cyl.rds” #缓存模型(可以删除)
)
添加_预先绘制()
将包括一个.类别
列,和.epred(.epred)
将包含来自后部的抽签响应属于该类别的概率分布。例如,以下是数据集中第一行的拟合度:
易怒的(英里/加仑= 21)%>%
添加_预先绘制(m_cyl)%>%
中天_qi(.epred)
21 |
1 |
4 |
0.3462689 |
0.0951898 |
0.7103225 |
0.95 |
中值的 |
气 |
21 |
1 |
6 |
0.6198780 |
0.2634698 |
0.8916873 |
0.95 |
中值的 |
气 |
21 |
1 |
8 |
0.0135699 |
0.0002870 |
0.1237972 |
0.95 |
中值的 |
气 |
注:对于.类别
变量以保留其原始值必须使用的因子级别名称业务风险管理系统
大于或等同于版本2.15.9。
我们可以根据预测的概率绘制拟合线数据集:
数据块=mtcars_清洁%>%
ggplot图(原子发射光谱(x个=英里/加仑,年=气缸,颜色=气缸)+
地理点()+
缩放彩色打印机(调色板= “深色2”,姓名= “气缸”)
fit插槽=mtcars_清洁%>%
数据网格(英里/加仑= 序列范围(_R)(英里/加仑,n个= 101))%>%
添加_预先绘制(m气缸,价值= “P(气缸|mpg)”,类别= “气缸”)%>%
ggplot图(原子发射光谱(x个=英里/加仑,年= `P(气缸|mpg)`,颜色=气缸)+
stat_lineribbon状态(原子发射光谱(填充=气缸),阿尔法= 1/5)+
缩放彩色打印机(调色板= “深色2”)+
规模灌装机(调色板= “深色2”)
绘图网格(ncol公司= 1,对齐= “v”,
数据块,
配件_批次
)
上面的显示无法让您看到P(气缸|mpg)
对于不同的值气缸
位于的特定值英里/加仑
例如,在后面的位置P(气缸=6|mpg=20)
很高,P(气缸=4|mpg=20)
和P(气缸=8|mpg=20)
必须为低(因为这些必须加起来为1)。
查看这种相关性的一种方法可能是假设结果图(HOP)仅适用于拟合线,将其从色带上“分离”(另一种选择是在线路信号群顶部使用HOP,如在本文档前面进行了演示)。通过使用动画,您可以看看这些线是如何串联或相互对立的,揭示了它们是如何相互关联的一些模式:
#注释:使用少量绘图保留此示例
#小,但实际上你可能想要50或100
ndraws公司= 20
第页=mtcars_清洁%>%
数据网格(英里/加仑= 序列范围(_R)(英里/加仑,n个= 101))%>%
添加_预先绘制(m气缸,价值= “P(气缸|mpg)”,类别= “气缸”)%>%
ggplot图(原子发射光谱(x个=英里/加仑,年= `P(气缸|mpg)`,颜色=气缸)+
#我们从statlineribbon的数据中删除了`.draw`列,以便使用相同的色带
#在每一帧上绘制(因为我们使用.draw来确定下面的变换)
stat_lineribbon状态(原子发射光谱(填充=气缸),阿尔法= 1/5,颜色= 不适用,数据=.%>% 选择(-.绘制)+
#我们使用sampledraws在geomline级别进行子采样(而不是对完整数据集进行子采样
#与前面的HOP示例一样),因为我们需要上面stat_lineribbon的全套抽签
地理线(原子发射光谱(组= 粘贴(.draw,气缸)),线宽= 1,数据=.%>% 示例_图纸(ndraws))+
缩放彩色打印机(调色板= “深色2”)+
规模灌装机(调色板= “深色2”)+
手动转换(.绘制)
使有生气(第页,n帧=ndraws,fps(英尺/秒)= 2.5,宽度= 576,高度= 192,单位= “像素”,资源= 96,开发= “ragg_png”)
注意这些线是如何一起移动的,以及它们是如何上下移动的一起或对立。我们可以在上图中的x位置(例如,英里/加仑=20
)然后看使用散点图矩阵确定它们之间的相关性:
易怒的(英里/加仑= 20)%>%
添加_预先绘制(m气缸,价值= “P(气缸|mpg=20)”,类别= “气缸”)%>%
取消分组()%>%
选择(.拉伸,气缸,`P(气缸|mpg=20)`)%>%
gather_pairs(聚会_聚会)(气缸,`P(气缸|mpg=20)`,三角形= “两者”)%>%
滤波器(.行!=.col)%>%
ggplot图(原子发射光谱(.x,.y))+
地理点(阿尔法= 1/50)+
面_网格(.行~.col)+
伊拉布(“P(cyl=row | mpg=20)”)+
xlab公司(“P(cyl=col | mpg=20)”)
当谈论序数分布的平均值时没有道理,在这种特殊情况下,人们可能会认为根据每加仑汽油的英里数,预计汽车的气缸数为有意义的数量。我们可以为给定每英里特定里程的汽车平均气缸数加仑,如下所示:
\[\textrm{E}[\textrm{cyl}|\textrm{mpg}=m]=\sum_{c\in\{4,6,8\}}c\cdot\textrm{P}(\textrm{cyl}=c|\textrm{mpg}=m)\]我们可以使用上述公式推导出一个后验公式分配\(\textrm{E}[\textrm{cyl}|\textrm}mpg}=m]\)来自模型。该模型为我们提供了\(\textrm{P}(\textrma{cyl}=c|\textrm{mpg}=m):什么时候英里/加仑
=\(米\),的响应标度线性预测器(.epred(.epred)
来自的列添加_预先绘制()
)的气缸
(又名.类别
) =\(c)是\(\textrm{P}(\textrma{cyl}=c|\textrm{mpg}=m).因此,我们可以在.绘制
然后使用总结
计算期望值:
标签数据函数=.%>%
取消分组()%>%
滤波器(英里/加仑== 分位数(英里/加仑。47))%>%
summary_if(总结_if)(即数字,平均值)
带平均值的数据包=mtcars_清洁%>%
数据网格(英里/加仑= 序列范围(_R)(英里/加仑,n个= 101))%>%
#注释:这显示了使用ndraws在add_epred_draws()中进行子采样
#只有当你计划制作意大利面条等时,才可以这样做。
#绝不要对小样本进行二次采样,以绘制间隔、密度等。
添加_预先绘制(m气缸,价值= “P(气缸|mpg)”,类别= “气缸”,ndraws公司= 100)%>%
分组方式(_B)(mpg,.draw)%>%
#计算预期气缸值
突变(气缸= as.数字(as字符(气缸))%>%
总结(气缸= 总和(气缸* `P(气缸|mpg)`),.个组= “下降”)%>%
ggplot图(原子发射光谱(x个=英里/加仑,年=气缸)+
地理线(原子发射光谱(组=.绘制),阿尔法= 5/100)+
地理点(原子发射光谱(年= as.数字(as字符(气缸)),填充=气缸),数据=mtcars_清洁,形状= 21,尺寸= 2)+
地理文本(原子发射光谱(x个=英里/加仑+ 4),标签= “E[cyl|mpg]”,数据=标签数据函数,他只是= 0)+
地理段(原子发射光谱(日元=气缸,X射线=英里/加仑+ 3.9),数据=标签数据函数)+
规模灌装机(调色板= “设置2”,姓名= “气缸”)
绘图_网格(ncol公司= 1,对齐= “v”,
带有平均值的数据块,
fit插槽
)
现在让我们做一些后验预测检查:做后验预测看起来像数据?为此,我们将在相同的值英里/加仑
如原件所示数据集(灰色圆圈),并用观察到的数据(彩色圆圈):
mtcars_清洁%>%
#我们在这里使用“select”而不是“datagrid”,因为我们想进行后验预测
#与原始数据中的观测结果完全相同
选择(英里/加仑)%>%
添加预测图纸(m气缸,种子= 1234)%>%
#恢复原始因子标签
突变(气缸= 水平(mtcars_清洁$cyl)[预测])%>%
ggplot图(原子发射光谱(x个=英里/加仑,年=气缸)+
地理计数(颜色= “灰色75”)+
地理点(原子发射光谱(填充=气缸),数据=mtcars_清洁,形状= 21,尺寸= 2)+
规模灌装机(调色板= “深色2”)+
地理标签(
数据=.%>% 取消分组()%>% 滤波器(气缸== "8")%>% 滤波器(英里/加仑== 最大值(英里/加仑)%>%数字播放器::片(1),
标签= “后验预测”,xlim公司= c(c)(26,不适用),伊林= c(c)(不适用,2.8),点.添加= 0.3,
标签.尺寸= 不适用,颜色= “灰色50”,分段.颜色= “灰色75”
)+
地理标签(
数据=mtcars_清洁%>% 滤波器(气缸== "6")%>% 滤波器(英里/加仑== 最大值(英里/加仑)%>%数字播放器::片(1),
标签= “观测数据”,xlim公司= c(c)(26,不适用),伊林= c(c)(2.2,不适用),点.添加= 0.2,
标签.尺寸= 不适用,分段.颜色= “灰色35”
)
这个看起来不错。让我们用另一个典型的后部检查预测检验图:响应的许多模拟分布(气缸
)相对于观察到的响应分布。对于连续响应变量,通常使用密度情节;在这里,我们将绘制每个箱子中的后验预测数作为线图,因为响应变量是离散的:
mtcars_清洁%>%
选择(英里/加仑)%>%
添加预测图纸(m气缸,ndraws公司= 100,种子= 12345)%>%
#恢复原始因子标签
突变(气缸= 水平(mtcars_清洁$cyl)[预测])%>%
ggplot图(原子发射光谱(x个=气缸)+
统计_计数(原子发射光谱(组= 不适用),地理= “线路”,数据=mtcars_清洁,颜色= “红色”,线宽= 三,阿尔法=.5)+
统计_计数(原子发射光谱(组=.绘制),地理= “线路”,位置= “身份”,阿尔法=.05)+
地理标签(数据= 数据帧(气缸= "4"),年= 9.5,标签= “后面\n个预测”,
他只是= 1,颜色= “灰色50”,线条高度= 1,标签.尺寸= 不适用)+
地理标签(数据= 数据帧(气缸= "8"),年= 14,标签= “观察到\n个数据”,
他只是= 0,颜色= “红色”,线条高度= 1,标签.尺寸= 不适用)
这看起来也不错。
另一种看待这些后验预测的方法可能是散点图矩阵。gather_pairs()
很容易做到生成适合创建自定义的长格式数据帧散点图矩阵(或真正的任意矩阵式小倍数plot)在ggplot中使用ggplot2::面网格()
:
设置种子(12345)
mtcars_清洁%>%
选择(英里/加仑)%>%
添加预测图纸(m_cyl)%>%
#恢复原始因子标签。必须先取消分组,以便
#在所有组中以相同的方式创建因子;这是一个变通办法
#因为brms不再返回标记的预测(希望是
#已修复,则不再需要此功能)
取消分组()%>%
突变(气缸= 命令(水平(mtcars_清洁$cyl)[预测],水平(mtcars_清洁$气缸))%>%
#need.drop=FALSE以确保0计数不被丢弃
分组方式(_B)(.绘制,.下降= 错误的)%>%
计数(气缸)%>%
gather_pairs(聚会_聚会)(气缸,n)%>%
ggplot图(原子发射光谱(.x,.y))+
地理计数(颜色= “灰色75”)+
地理点(数据=mtcars_清洁%>% 计数(气缸)%>% gather_pairs(聚会_聚会)(气缸,n),颜色= “红色”)+
面_网格(变量(.行),变量(.col))+
xlab公司(“cyl=col的观察次数”)+
伊拉布(“cyl=行的观测数”)
具有分类预测器的有序模型
下面是一个带有分类预测因子的序数模型:
数据(食管)
m_esoph_brm(电子邮件)= 商业风险管理(
托布普~年龄gp,
数据=食管,
家庭= 累计(),
文件= “型号/tidy-brms_m_esoph_brm.rds”
)
然后我们可以绘制每个结果类别的预测概率在预测的每个级别内:
食管%>%
数据网格(年龄)%>%
添加_预先绘制(m_esoph_brm,数据保护器= 真的,类别= “托布普”)%>%
ggplot图(原子发射光谱(x个=年龄gp,年=.epred、,颜色=tobgp))+
统计点间隔(位置= 位置_对象(宽度=.4))+
缩放_大小_连续(指南= “无”)+
刻度-颜色-手动(值= 酿酒商.pal(6,“蓝色”)[-c(c)(1,2)])
很难看到上述图中类别的变化;让我们试着做一些能更好地说明每个分布的要点的事情年份:
食管裂孔=食管%>%
数据网格(年龄)%>%
添加_预先绘制(m_esoph_brm,类别= “托布普”)%>%
ggplot图(原子发射光谱(x个=.epred、,年=tobgp))+
坐标_自流(展开= 错误的)+
面_网格(.~年龄gp,交换机= “x”)+
主题_经典()+
主题(带状背景= 元素_blank(),条带放置= “外部”)+
gg标题(“P(烟草消费类别|年龄组)”)+
xlab公司(“年龄组”)
食管裂孔+
统计摘要(有趣=中值的,地理= “酒吧”,填充= “灰色65”,宽度= 1,颜色= “白色”)+
统计点间隔()
这种情况下的条形图可能会产生错误的精确度,因此我们也可以尝试CCDF条形图:
食管裂孔+
统计_ccdfinterval()+
expand_limits(扩展限制)(x个= 0)#确保条变为0
该输出应与相应的m_esoph_rs
中的模型小插曲(“整洁的rstanarm”)
(对不同的先验取模)brms为我们生产它所做的工作比圣塔那主义
做。