介绍
尽管医学领域取得了巨大进步,但心血管疾病仍是世界范围内的主要死亡原因。据美国心脏协会(American Heart Association)统计,高血压每年影响11亿多人[9]。该软件包使用文献中提出的各种指标,以更易于消化的格式可视化和量化高血压的各个方面。
根据阅读频率、睡眠指示器的存在以及是否考虑了时间结构,可以对血压数据进行不同程度的粒度分析。这些因素几乎总是取决于所用设备的类型,其中ABPM监测仪主要用于短期(24小时内),而家庭监测设备或办公室读数用于测量中长期(日常、来访等)的可变性[11]。与连续心率监测仪或连续血糖监测仪不同,目前还没有可用于中长期的商用连续血压监测仪,这给研究带来了独特的挑战。
研究人员主要关注的是准确量化血压变异性(BPV)的能力。BPV已被证明是预测心血管事件和猝死的一个重要因素,尤其是在易感期,如醒来的前两个小时[10]。已经有许多提议的方法来表征这种可变性;这个包寻求尽可能多地纳入这些指标。
我们推出了第一个全面的开源R包,英国石油公司
分析和可视化血压数据。为了帮助临床医生在不需要多个软件平台进行数据处理的情况下理解患者的数据,英国石油公司
这样做只需使用最少的代码,并提供了传统专有对等项之外的附加功能。在撰写本文时,据作者所知,目前还没有通过综合R档案网络(CRAN)专门用于血压分析的其他可用软件包。
在本文中,我们演示了英国石油公司
通过探索和分析[8]的单主题试点研究和HYPNOS[11]的多主题研究,来说明数据集结构之间的差异,并详细说明如何调整R包中的设置以适应两者。
血压监测概述
血压监测装置的工作原理是测量动脉限制血流的压力;对于数字设备,振动被转换为电信号。与仅在受试者开始时读取读数的家庭监护仪不同,动态血压监测(ABPM)设备在24小时或更长时间内以预先指定的间隔自动读取读数。
ABPM允许医疗专业人员分析睡眠期间的血压,这已被证明是比白天血压更准确的心血管事件预测指标。ABPM还允许研究人员在办公室或实验室环境中区分真正的高血压和“白大衣”高血压。由于装配设备的负担(以及缺乏商业颗粒替代品),ABPM测量的时间为24小时到几天。
另一方面,家庭监测为个人提供了随意记录血压的能力,并且可以使用移动应用程序在数周、数月或数年内轻松跟踪。然而,由于用户必须启动记录,因此无法在睡眠期间读取读数。
由于这两种设备的性质会根据使用的设备限制某些功能,因此我们概述了如何有效分析这两种类型设备的数据。
据美国心脏协会(American Heart Association)称,目前有6个血压阶段与监测设备的读数相对应:低血压、正常、升高、1级高血压、2级高血压、高血压危象。下表根据其定义概述了类别。请注意,由于正常、升高和1级舒张压读数之间存在歧义(因为相似的阈值),此软件包将差异分开,并设置DBP升高的默认阈值为80-85,1级高血压的默认阈值是85-90。如果适用,用户可以调整这些阈值。
低(低血压) |
小于100 |
和 |
60以下 |
正常 |
100 - 120 |
和 |
60-80 |
高架 |
120 - 129 |
和 |
60 - 80 |
1期高血压 |
130 - 139 |
或 |
80 - 89 |
2期高血压 |
140 - 180 |
或 |
90 - 120 |
高血压危机 |
大于180 |
和/或 |
120以上 |
最近,(Lee等人,2020年)对这些指南的修改提供了SBP和DBP的二对一映射,以避免出现SBP值异常高和DBP值异常低的情况,反之亦然。这些新指南如下:
低(可选) |
<100 |
和 |
<60 |
正常 |
<120 |
和 |
<80 |
高架 |
120 - 129 |
和 |
<80 |
第1阶段-全部 |
130 - 139 |
和 |
80-89 |
第1阶段-ISH(ISH-S1) |
130 - 139 |
和 |
<80 |
第1阶段-IDH(IDH-S1) |
<130 |
和 |
80 - 89 |
第2阶段-全部 |
>140 |
和 |
>90 |
第2阶段-ISH(ISH-S2) |
>140 |
和 |
<90 |
第2阶段-IDH(IDH-S2) |
<140 |
和 |
>90 |
危机(可选) |
>180 |
或 |
>120 |
这个英国石油公司
包裹
的一般工作流程英国石油公司
该包由1)一个数据处理阶段和2)一个分析阶段组成,理想情况下只需两行代码。处理阶段对用户提供的输入数据进行格式化,使其符合英国石油公司
功能。分析阶段使用处理后的数据量化血压关系的各种属性或提供各种可视化。的关键能力之一英国石油公司
程序包是bp_报告
该函数生成一个报告,将这些可视化图形组合成一个易于理解的摘要,供临床医生或研究人员解释一个人(或多个人)的血压结果。我们将在随后的部分中介绍这些阶段。
使用进行数据处理处理_数据
功能
在进行任何分析之前,用户提供的数据集必须首先使用处理_数据
遵守包数据结构要求和命名约定。此功能确保用户提供的数据列不会重复计数或丢失,因为血压数据通常不一致,并且来自多种格式。虽然这是一个繁琐的初始步骤,但从长远来看,它将节省时间,因为最终处理的数据不需要任何未来的规范,而这些规范可以直接插入分析功能中。值得注意的是,如果用户提供的数据集已经遵守列命名约定和数据类型,那么处理_数据
没有必要使用函数。然而,最好仍然使用此函数作为健全性检查来验证所有可用变量。
基本工作流程是加载用户提供的未处理原始数据,使用处理_数据
函数并保存到新的数据帧。请注意,在指定列时,大小写并不重要。
##加载样本bp_amlyms
##在这个场景中,bp_催眠充当要处理的“用户提供的”数据
数据(“bp_催眠”)
##将process_data函数的输出分配给新的数据帧对象
催眠_程序<- 处理_数据(bp_催眠,
bp_类型= “abpm”,
丁苯橡胶= “系统”,
数据库处理程序= “离散”,
日期_时间= '日期时间',
标识= “id”,
访问= “访问”,
小时= “小时”,
尾流,尾迹= “唤醒”,
聚丙烯= “pp”,
地图= “地图”,
快速定位程序= “rpp”)
#>超过DUL或DLL阈值的2个值被强制为NA。
请注意原始的列名bp_催眠
已处理中发生更改数据
值得注意的是,系统
成为SBP公司
,直径
成为数据库管理员
、和日期。时间
成为日期_时间
.
姓名(bp_催眠)
#>[1]“NR.”“DATE.TIME”“SYST”“MAP”“DIAST”“HR”
#>[7]“PP”“RPP”“WAKE”“ID”“VISIT”“DATE”
姓名(催眠_程序)
#>[1]“ID”“GROUP”“DATE_TIME”“DATE”“DAY_OF_WEEK”
#>[6]“年”“月”“日”“小时”“时间_ OF_DAY”
#>[11]“SBP”“DBP”“BP_CLASS”“HR”“MAP”
#>[16]“MAP_OLD”“RPP”“PP”“PP_OLD”“唤醒”
#>[21]“就诊”“编号”“SBP_CATEGORY”“DBP_CATEGORY””“BP_TYPE”
虽然乍一看结果似乎微不足道,但让我们看看当我们使用具有完全不同命名约定的不同数据集时会发生什么:bp_jhs公司
数据集。不同于bp_催眠
其中包含处理_数据
具有多个主题的功能,bp_jhs公司
是一个没有许多多主题标识符的单主题数据集,例如身份证件
,访问
,或WAKE(唤醒)
(因为它是非ABPM数据)。此外,没有地图
或聚丙烯
列,但这些(我们将看到)可以自动创建。
##加载示例bp_jhs数据集
##如前所述,这就是所谓的“用户提供的”数据集
数据(“bp_jhs”)
##将process_data函数的输出分配给新的数据帧对象
jhs_proc公司<- 处理_数据(bp_jhs,
丁苯橡胶= '系统mmhg.',
数据库处理程序= '直径mmhg.',
日期时间= '日期时间',
小时= “脉冲。BPM。”)
#>从DATE_TIME列创建的DATE列。
#>未找到或指定PP列。根据SBP和DBP列自动生成。
#>未找到或指定RPP列。根据SBP和HR列自动生成。
#>未找到或指定MAP列。根据SBP和DBP列自动生成。
头(jhs_proc,5)
#>ID组日期时间日期星期年月日小时
#>1 1 1 2019-08-01 09:15:54 2019-08-01 2019年周四8 1 9
#>2 1 1 2019-07-31 11:39:59 2019-07-301 2019年周三7 31 11
#>3 1 1 2019-07-31 11:38:07 2019-07:31 2019年周三7 31 11
#>4 1 1 2019-07-30 13:47:46 2019-07-30 2019 7 30 13
#>5 1 1 2019-07-30 13:46:15 2019-07-30 2019 7 30 13
#>每日定时SBP DBP BP_CLASS HR MAP RPP PP每日用餐时间BPDELTA
#>1上午132 80阶段1 79 97.33333 10428 52周四早餐52
#>2上午126 77高架62 93.33333 7812 49周三早餐49
#>3上午128 76高架60 93.33333 7680 52周三早餐52
#>4下午130 81第1阶段63 97.33333 8190 49周二午餐49
#>5下午134 83第1阶段62 100.00000 8308 51周二午餐51
#>SBP_类别DBP_类别BP_TYPE
#>1阶段1阶段1 HBPM
#>2升高的正常HBPM
#>3正常HBPM升高
#>4阶段1阶段1 HBPM
#>5阶段1阶段1 HBPM
快速检查原件后bp_jhs公司
数据集和新处理的数据
数据集中,应该可以明显地看出进程数据
功能。正如我们从列名中看到的那样,打字的麻烦系统消息。
,dias.mmhg。
,脉冲.bpm。
、和日期时间
现在被更简洁的SBP公司
,数据库管理员
,人力资源
、和日期_时间
名称。此外,地图
,聚丙烯
,RPP(RPP)
,SBP_类别
、和DBP_类别
都是作为以前数据中不存在的附加列进行计算的。此外,如果提供的数据有一列对应于“日期/时间”格式一天的时间
和每周工作日
也会为了方便而创建。
姓名(bp_jhs)
#>[1]“DateTime”“Month”“Day”“Year”“Dayof Wk”
#>[6]“小时”“用餐时间”“系统mmHg”“直径mmHg。”“bpDelta”
#>[11]“脉冲.bpm。”
姓名(jhs_proc)
#>[1]“ID”“GROUP”“DATE_TIME”“DATE”“DAY_OF_WEEK”
#>[6]“年”“月”“日”“小时”“时间_ OF_DAY”
#>[11]“SBP”“DBP”“BP_CLASS”“HR”“MAP”
#>[16]“RPP”“PP”“DAYOFWK”“MEAL_TIME”“BPDELTA”
#>[21]“SBP_CATEGORY”“DBP_CATEGORY”“BP_TYPE”
注:为了保持一致性,处理_数据
将强制所有列名为大写。
血压指标
数据处理后,我们现在可以利用文献中的内置指标来表征血压变异性。首先,以下指标是当前通过英国石油公司
包裹:
与时间相关的分散度量
与时间无关的色散度量
bp_标记
-血压幅度(峰谷)
- 峰值测量从平均值到最大值的距离
- 槽测量从最小值到平均值的距离
bp_范围
-血压范围
业务流程控制
-变异系数
睡眠相关指标
dip_calc(倾斜_倾斜)
-夜间浸渍百分比和分类
- 夜间血压下降百分比是指睡眠时与清醒时相比血压下降的百分比。需要指示受试者何时睡觉才能知道如何计算:
1-(平均睡眠血压/平均日间血压)
。倾斜百分比的严重程度表示该个体的相应分类(铲斗、非铲斗、反向铲斗)。
bp_睡眠_指标
-BP的睡眠特定指标
- 该功能包括以下睡眠指标:下降计算、夜间下降、晨间血压波动(MBPS)计算的睡眠-经过和醒来前的变化、晨间平均和差异以及加权标准差(wSD)
假设我们正在与bp_类型
并希望比较反向传播
使用业务流程视图
针对每个主题。
头(反向传播(催眠_程序,bp_类型= “两者”))
#>数据集中缺少SBP和/或DBP值。删除以进行计算。
#>#A tibble:6 x 6
#>#组:ID,VISIT[3]
#>ID访问唤醒ARV_SBP ARV_DBP N
#><fct><fct>
#> 1 70417 1 0 14.2 10.6 10
#> 2 70417 1 1 9.58 5.47 20
#> 3 70417 2 0 17.7 7.57 8
#> 4 70417 2 1 11.2 8.12 17
#> 5 70422 1 0 10.5 4 5
#> 6 70422 1 1 14.9 6.62 17
头(业务流程视图(hypnos_proc,bp_类型= “两者”))
#>在数据集中发现缺少SBP和/或DBP值。删除以进行计算。
#>#A tibble:6 x 6
#>#组:ID,VISIT[3]
#>ID访客唤醒SV_SBP SV_DBP N
#><fct><fct>
#> 1 70417 1 0 15.8 13 10
#> 2 70417 1 1 11.2 7.50 20
#> 3 70417 2 0 18.9 8.22 8
#> 4 70417 2 1 13.0 10.2 17
#> 5 70422 1 0 11.2 5.74 5
#> 6 70422 1 1 19.1 8.80 17
垂直比较可能很有挑战性,因此在以下方面的帮助下数字播放器
我们可以获得以下内容:
头(dplyr::left_join(左_连接)(反向传播(催眠_程序,bp_类型= “两者”),业务流程控制(催眠_程序,bp_类型= “两者”)))
#>数据集中缺少SBP和/或DBP值。删除以进行计算。
#>数据集中缺少SBP和/或DBP值。删除以进行计算。
#>连接,通过=c(“ID”,“VISIT”,“WAKE”,“N”)
#>#A tibble:6 x 10
#>#组:ID,VISIT[3]
#>ID访客唤醒ARV_SBP ARV_DBP N CV_SBP CV_DBP SD_SBP SD_DBP
#><fct><fct>
#> 1 70417 1 0 14.2 10.6 10 9.54 16.3 11.8 9.86
#>2 70417 1 9.58 5.47 20 6.63 7.65 8.49 5.09
#> 3 70417 2 0 17.7 7.57 8 9.46 12.3 12.9 7.43
#> 4 70417 2 1 11.2 8.12 17 8.44 11.5 11.5 7.56
#>5 70422 1 0 10.5 4 5 5.21 7.02 7.22 4.09
#> 6 70422 1 1 14.9 6.62 17 9.86 11.5 14.9 7.59
请注意,这是可能的,因为我们在处理步骤中对列名进行了标准化。
因为催眠_程序
数据包括睡眠期间的血压读数,通过bp_睡眠_指标
函数可用于获取更多信息:
bp_睡眠_指标(催眠_程序)
#>$睡眠计数
#>#易趣:10 x 8
#>ID访问组N_total N_wake N_sleep HRS_wake HRS_sleep
#><fct><fct>
#>1 70417 1 30 20 10 17 8
#> 2 70417 2 1 25 17 8 16 8
#> 3 70422 1 1 22 17 5 16 5
#> 4 70422 2 1 21 14 7 11 7
#> 5 70424 1 1 26 20 6 16 5
#> 6 70424 2 1 23 17 6 16 6
#> 7 70435 1 1 29 23 6 17 6
#> 8 70435 2 1 29 20 9 16 7
#> 9 70439 1 1 22 14 8 13 8
#> 10 70439 2 1 23 17 6 16 6
#>
#>$SBP_Sleep_Summary($SBP_休眠_摘要)
#>#A禁忌:10 x 11
#>#组:ID,VISIT[10]
#>ID VISIT GROUP sleep_SBP wake_SBP sleep_SBP_sd wake_SBP_sd presleep_SBP(ID访客组睡眠_SBP唤醒_SBP睡眠_SBP_sd唤醒_SBP预睡眠_SBP)
#><fct><fct>
#> 1 70417 1 1 123. 128 11.8 8.49 132.
#> 2 70417 2 1 136. 136. 12.9 11.5 140
#> 3 70422 1 1 139. 151. 7.22 14.9 148
#>4 70422 2 1 125。152. 13.5 16.7 132.
#> 5 70424 1 1 110. 128.14.213.3 128。
#> 6 70424 2 1 113 123. 8.65 15.6 132
#> 7 70435 1 1 106. 129. 10.7 10.2 145
#> 8 70435 2 1 136. 123. 9.55 14.7 144.
#> 9 70439 1 1 167 160. 7.09 15.1 159
#> 10 70439 2 1 149. 144. 15.7 9.17 138
#> # ... 还有3个变量:prewake_SBP<dbl>、postweake_SBP<dbl>,
#>#最低_SBP<数据库>
#>
#>$DBP_Sleep_Summary($DBP_休眠_摘要)
#>#A禁忌:10 x 11
#>#组:ID,VISIT[10]
#>ID VISIT GROUP sleep_DBP wake_DBP sleep_DBP_sd wake_DBP_sd presleep_DBP(ID访客组睡眠_DBP唤醒_DBP睡眠_DBP醒来_DBP_sd预睡眠_DBP)
#><fct><fct>
#> 1 70417 1 1 60.5 66.6 9.86 5.09 69
#> 2 70417 2 1 60.5 65.6 7.43 7.56 74.5
#> 3 70422 1 1 58.2 65.9 4.09 7.59 70.5
#> 4 70422 2 1 60.6 69.5 6.40 7.75 64
#> 5 70424 1 1 54.6 67.8 7.99 8.31 55
#> 6 70424 2 1 55 61.5 8 6.98 69
#> 7 70435 1 1 63 82.1 6.42 6.55 92
#> 8 70435 2 1 79.2 72.5 8.61 8.13 79.5
#> 9 70439 1 1 62.6 69.3 4.93 19.9 63
#> 10 70439 2 1 60.8 56.8 3.31 3.91 56
#> # ... 还有3个变量:prewake_DBP<dbl>、postweake_DBP<dbl>,
#>#lowest_DBP<dbl>
#>
#>$Sleep_Metrics($睡眠_指标)
#>#A可移植:10 x 17
#>#组:ID、VISIT、GROUP[10]
#>ID访问组dip_calc_SBP noct_fall_SBP ST_mbps_SBP PW_mbps_SBP
#><fct><fct><fct><dbl><dbl><dbl><dbl>
#> 1 70417 1 1 0.0359 1.16 2.67 -3
#> 2 70417 2 1 -0.00450 1.09 -9 -22.5
#> 3 70422 1 1 0.0819 1.09 4.17 5.5
#> 4 70422 2 1 0.174 1.05 35.7 33.7
#> 5 70424 1 1 0.141 1.24 1.33 1.33
#> 6 70424 2 1 0.0848 1.21 11.7 7
#> 7 70435 1 1 0.179 1.37 11 11.5
#> 8 70435 2 1 -0.104 1.06 -4.5 -8.90
#> 9 70439 1 1 -0.0442 0.995 19.2 9
#> 10 70439 2 1 -0.0329 0.950 8.67 -9
#> # ... 还有10个变量:ME_SBP_avg<dbl>、ME_SBP_diff<dbl]、,
#>#wSD_SBP<dbl>,dip_calc_DBP<dbl>,noct_fall_DBP<dbl>,ST_mbps_DBP<dbl>,
#>#PW_mbps_DBP<dbl>,ME_DBP_avg<dbl>ME_DBP_diff<dbl],wSD_DBP
回到bp_jhs公司
数据集,让我们检查BP读数的峰值和低谷。我们会打电话给bp_标记
函数。
头(bp_标记(jhs_proc,bp_类型= “两者”))
#>#A字型:1 x 6
#>ID峰值_SBP峰值_DBP槽_SBP槽_DBP N
#><fct><dbl><dbl><dbl><dbl><int
#> 1 1 20.3 15.1 19.7 17.9 222
在这里,我们注意到一些不同的东西。因为没有身份证件
,访问
,或WAKE(唤醒)
列bp_标记
将所有内容聚合在一起。这在技术上是正确的,但我们希望通过以下方式分解数据来收集更多信息日期
相反;我们需要包括inc_date=真
函数的可选参数。
尾(bp_标记(jhs_proc,包括_日期= 真的,bp_类型= “两者”))
#>#易趣:6 x 7
#>#组:ID[1]
#>ID日期峰值_SBP峰值_DBP槽_SBP槽_DBP N
#><fct><日期><dbl><dbl><dbl><dbl><int
#> 1 1 2019-07-26 8.25 3.5 6.75 2.5 4
#> 2 1 2019-07-28 5.5 3 4.5 3 4
#>3 1 2019-07-29 7 2.75 9 2.25 4
#> 4 1 2019-07-30 2 1 2 1 2
#> 5 1 2019-07-31 1 0.5 1 0.5 2
#> 6 1 2019-08-01 0 0 0 0 1
解释:虽然乍一看可能不太明显,但血压大小(无论是峰值还是低谷)的计算方法如下\(峰值=最大(BP)-平均(BP)\)和\(低谷=平均值(BP)-分钟(BP)\)其中BP可以对应于SBP或DBP。如果我们手动检查2019-07-31
我们看到N=2个测量值,在bp_jhs公司
我们看到的数据集,SBP的两个测量值分别为126和128,DBP为77和76。\(\bar{x}_{SBP}=\压裂{(126+128)}{2}=127\)和\(\bar{x}_{DBP}=\压裂{(78+76)}{2}=76.5\)因此,我们输出的峰值和谷值是有意义的。
可视化
到目前为止,我们已经处理了原始数据并运行了两个指标,以更清楚地了解可变性,现在让我们将其可视化。虽然处理后的数据可以很容易地合并到其他可视化包或代码中(例如ggplot,我们将在下面的第一个示例中用业务流程图管理
),当前包含以下视觉效果英国石油公司
包裹:
bp_散射 |
BP阶段散点图(美国心脏协会) |
bp_ts_plots(bp_ts_图) |
时间序列图 |
业务流程历史记录 |
BP阶段直方图 |
dip类plot |
倾斜%类别图 |
bp_报告 |
业务伙伴汇总的可导出报告 |
dow_tod_plots窗口 |
星期/时间图表 |
这个业务流程历史记录
返回与每个阶段中的总数、SBP读数频率和DBP读数频率相对应的所有读数的三个直方图。此外,它根据数据所处的血压阶段按颜色对数据进行细分:
现在假设我们希望按照一天中的时间和一周中的一天来分解我们的读数。为此,我们可以实现dow_tod_plots窗口
功能。因为此函数主要用作bp_报告
函数,我们需要使用额外网格
包装
bptable_ex(英语)<- dow_tod_plots窗口(jhs_proc)
#gridExtra::网格.排列(bptable_ex[[1]],bptable_ex[[2]],bp表_ex[[3]],bptable_ex[[4]],nrow=2)
作为返回到另一个示例之前的最后一步,让我们将迄今为止所做的一切编译成一个更紧凑、更容易理解的报告,同时可视化所有内容。为此,我们将依靠bp_报告
函数,该函数将生成PDF格式的报告(尽管还有其他格式,如PNG):
假设我们想查看业务流程图
随时间变化的数据集。时间序列绘图功能允许将其可视化。输出返回两个图,一个表示整个时间的总持续时间,另一个显示24小时内(按小时)的重复测量。如果有多个系列的录制(例如bp_催眠
每个受试者有两次就诊的数据集)wrap_var(包装变量)
和组变量
可以使用函数参数。
bp_ts_plots(bp_ts_图)(jhs_proc)
假设现在我们把注意力转向bp_催眠
例如,假设现在我们想检查睡眠模式。使用浸渍类别图,我们可以分析睡眠中BP的行为