分组分析

这个小插曲解释了如何将子组变量合并到MMRM使用brms.mmrm公司包裹。这里,我们假设子组变量已提前选择(可能试验方案中预先规定),因为预期会发生交互或特别感兴趣的。尤其是异质性患者对种群进行研究,重要的是要检查估计的总体效果广泛适用于相关子组(非物质文化遗产(1998),美国发动机制造商协会(2019)). 然而,值得注意的是,子组变量选择是一个彻底的过程,需要深入的领域知识,仔细调整多样性和潜在的不同建模所有这些方法都不在本小品的范围内。一次性单变量亚组分析检测的局限性文献中描述了治疗效果的异质性(肯特2023).有关数据驱动的文献临床试验中的亚组识别方法,我们参考Lipkovich等人(2017)Lipkovich等人(2023年).

1数据

子组变量必须是类别变量。

图书馆(brms.mmrm)
图书馆(dplyr)
图书馆(magrittr)
设置种子(0升)
原始数据(_D)<- brm_simulate_outline(模拟输出)(
  n组= ,
  n子组= 2,
  n病人= 50,
  n时间= ,
  费率_比例= 0,
  速率_映射= 0
)|>
  突变(响应= rnorm公司(n个= n个()))

原始数据(_D)
#>#A桥:900×6
#>患者时间分组缺少响应
#><chr><chr><chr><chr><lgl><dbl>
#>1名患者_001时间_1组_1亚组_1假1.26
#>2名患者_001时间_2组_1亚组_1假-0.326
#>3名患者_001时间_3组_1亚组_1假1.33
#>4名患者_002时间_1组_1子组_1假1.27
#>5名患者_002时间_2组_1亚组_1假0.415
#>6名患者_002时间_3组_1亚组_1假-1.54
#>7名患者_003时间_1组_1亚组_1假-0.929
#>8名患者_003时间_2组_1亚组_1假-0.295
#>9名患者_003时间_3组_1亚组_1假-0.00577
#>10名患者_004时间_1组_1子组_1假2.40
#> # 890多行

每个分类亚组级别应具有足够的代表性在所有离散时间点的所有治疗组之间。否则,一些边际利息可能无法估算。

计数(原始数据、组、子组、时间)
#>#A台:18×4
#>群子群时间n
#><chr><chr><chr><int>
#>1组_1子组_1时间_1 50
#>2组_1亚组_1时间_2 50
#>3组_1亚组_1时间_350
#>4组_1子组_2时间_150
#>5组_1亚组_2时间_2 50
#>6组_1子组_2时间_3 50
#>7组_2亚组_1时间_1 50
#>8组_2亚组_1时间_2 50
#>9组_2亚组_1时间_350
#>10组_2亚组_2时间_150
#>11组_2亚组_2时间_2 50
#>12组_2亚组_2时间_350
#>13组_3亚组_1时间_150
#>14组_3亚组_1时间_2 50
#>15组_3亚组_1时间_350
#>16组_3亚组_2时间_150
#>17组_3亚组_2时间_2 50
#>18组_3亚组_2时间_350

当您为创建特殊类数据集时brms.mmrm公司使用brm_data(),请提供子组变量和参考子组级别的名称。后处理功能将使用参考子组级别比较成对的亚组:例如子组2减去参考的处理效果您选择的子组级别。

数据<- brm数据(
  数据=原始数据,
  结果= “响应”,
  基线= 无效的,
  组= “组”,
  子群= “子组”,
  时间= “时间”,
  病人= “患者”,
  reference_group(引用组)= “第1组”,
  reference_子组= “子组_1”,
  参考_时间= “时间_1”
)

字符串(数据)
#>brms_mm_[900×6](S3:brms_mmarm_data/tbl_df/tbl/data.frame)
#>$patient:chr[1:900]“patient_001”“patient_001”“patient_001”“patient_002”。。。
#>$时间:chr[1:900]“time_1”“time_2”“time_3”“time_1”。。。
#>$组:chr[1:900]“group_1”“group_1”“group_1”“group_3”。。。
#>$subgroup:chr[1:900]“subgroup_1”“subject_1”、“subgraw_1”。。。
#>$missing:logi[1:900]假假假假。。。
#>$回复:num[1:900]1.263-0.326 1.33 1.272 0.415。。。
#>-attr(*,“brm_output”)=chr“响应”
#>-attr(*,“brm_group”)=chr“group”
#>-attr(*,“brm_subgroup”)=chr“子组”
#>-attr(*,“brm_time”)=chr“时间”
#>-attr(*,“brm_pient”)=chr“patient”
#>-attr(*,“brm_covariates”)=chr(0)
#>-attr(*,“brm_reference_group”)=chr“group_1”
#>-attr(*,“brm_reference_subgroup”)=chr“subgroup_1”
#>-attr(*,“brm_reference_time”)=chr“time_1”

2公式

对于子组分析,公式中的术语应包括子组变量。所有看似合理的交互都是通过参数可选的属于brm_formula()。对于此特定示例,我们禁用所有组-子组交互以外的交互。

公式_子组<- brm公式(
  数据=数据,
  组_子组_时间= 错误的,
  子组_时间= 错误的
)

公式_子组
#>反应~组+组:分组+组:时间+子组+时间+unsr(时间=时间,gr=患者)
#>sigma~0+时间

要创建类似的非子组简化模型,请禁用涉及子组的术语。这对以后的测量整个子组的影响,而无需限制到子组的特定级别。1

公式_简化<- brm公式(
  数据=数据,
  组_子组= 错误的,
  组_子组_时间= 错误的,
  子群= 错误的,
  子组_时间= 错误的
)

公式推导的
#>反应~组+组:时间+时间+unsr(时间=时间,gr=患者)
#>sigma~0+时间

模型

要运行完整的子组和简化的非子组模型,请使用brm_model()像往常一样。记住提供适当的每种情况下的公式。

模型_子组<- brm模型(
  数据=数据,
  公式=公式_子组,
  刷新= 0
)
#>正在编译Stan程序。。。
#>开始采样
模型_简化<- brm模型(
  数据=数据,
  公式=公式简化,
  刷新= 0
)
#>正在编译Stan程序。。。
#>开始采样

4边缘

brm_marginal_draws()自动生成特定于子组的边际平均值,如果brm_formula()宣布亚组特定的固定效应。2

draws_subgroup(图纸_子组)<- brm_边缘_图纸(
  模型=模型_子组,
  具有子组的平均值= 错误的
)
图纸_减少<- brm_边缘_图纸(
  模型=模型诱导,
  平均包含子组= 错误的
)

对于图纸_子组时间差的边际(与基线的变化)和治疗差异现在特定于亚组。

易怒的::as_表格(图纸_子组$差异组)
#>#A台:4000×11
#>.chain.draw.interration`group_2|subgroup_1|time_2`group_2| subgroup_1|time…¹
#><int><int><int><dbl>
#>  1      1     1          1                     -0.472                    -0.534
#>  2      1     2          2                     -0.0221                   -0.335
#>  3      1     3          3                     -0.222                    -0.217
#>  4      1     4          4                      0.199                    -0.111
#>  5      1     5          5                      0.0411                   -0.165
#>  6      1     6          6                     -0.215                    -0.571
#>  7      1     7          7                      0.0821                   -0.163
#>  8      1     8          8                     -0.167                    -0.0113
#>  9      1     9          9                      0.282                     0.0544
#> 10      1    10         10                      0.321                    -0.322
#> # 3990多行
#> # 缩写名称:¹`group_2|subgroup_1|time_3`
#> # 还有6个变量:`group_2|subgroup_2|time_2`<dbl>,
#>#`group_2|subgroup_2|time_3`<dbl>,`group_3|subject_1|time_2`<dbl>,
#>#`group_3|subgroup_1|time_3`<dbl>,`group_3| subgroup_2|time_2`<dbl>,
#>#`group_3|subgroup_2|time_3`<dbl>

此外,还有一个新的差异_子组表。后面的样本差异_子组测量每个子组级别与参考子组级别之间的差异关于治疗效果差异组.

易怒的::as_表格(图纸_子组$差异_子组)
#>#A台:4000×7
#>.chain.draw.interration`group_2|subgroup_2|time_2`group_2| subgroup_2 | time…¹
#><int><int><int><dbl>
#>1 1 1 1 5.55e-17 0
#>2 1 2 2 4.16e-17 0
#>  3      1     3          3                    0                                0
#>4 1 4-2.78e-17 0
#>5 1 5 5 2.78e-17 0
#>  6      1     6          6                    0                                0
#>7 1 7 7 5.55e-17 0
#>8 1 8 8 2.78e-17 0
#>  9      1     9          9                    0                                0
#> 10      1    10         10                    0                                0
#> # 3990多行
#> # 缩写名称:¹`group_2|subgroup_2|time_3`
#> # 还有2个变量:`group_3|subgroup_2|time_2`<dbl>,
#>#`group_3|subgroup_2|time_3`<dbl>

这个brm_marginal_summaries()brm_marginal_probabilities()自动意识到子组特定边缘brm_marginal_draws().尤其是,brm_marginal_summaries()总结子组差异_子组表来自brm_marginal_draws().

摘要_子组<- brm_marginal_摘要(
draws_subgroup(图纸_子组),
  水平= 0.95
)

摘要_减少<- brm_marginal_摘要(
图纸_减少,
  水平= 0.95
)

摘要_子组
#>#A台:340×7
#>边缘统计群子群时间值mcse
#><chr><chr><chr><chr>><chr><dbl>
#>1差异_组下部组_2亚组_1时间_2-0.300 0.00952
#>2差_组下组_2亚组_1时间_3-0.540 0.0137
#>3差_组下组_2亚组_2时间_2-0.300 0.00952
#>4差_组下部组_2亚组_2时间_3-0.540 0.0137
#>5差_组下组_3亚组_1时间_2-0.130 0.00873
#>6差_组下组_3亚组_1时间_3-0.286 0.00976
#>7差_组下组_3亚组_2时间_2-0.130 0.00873
#>8差_组下组_3亚组_2时间_3-0.286 0.00976
#>9差_组平均值组_2亚组_1时间_2 0.0913 0.00439
#>10差_组平均值组_2亚组_1时间_3-0.167 0.00403
#> # 330多行

brm_marginal_probabilities()仍然专注于治疗影响,而不是对分组级别对之间的差异。

brm边缘概率(
  绘制=draws_subgroup(图纸_子组),
  阈值= c(c)(-0.1,0.1),
  方向= c(c)(“更大”,“更少”)
)
#>#A台:16×6
#>方向阈值组子群时间值
#><chr><dbl><chr><chr><chr><dbl>
#>1大于0.1组_2子组_1时间_2 0.826
#>2大于-0.1组_2子组_1时间_3 0.362
#>3大于-0.1组_2子组_2时间_2 0.826
#>4大于-0.1组_2亚组_2时间_3 0.362
#>大于5-0.1组_3亚组_1时间_2 0.966
#>大于6-0.1组_3子组_1时间_3 0.846
#>7大于-0.1组_3亚组_2时间_2 0.966
#>大于8-0.1组_3子组_2时间_3 0.846
#>9减去0.1组_2子组_1时间_2 0.515
#>10减去0.1组_2子组_1时间_3 0.915
#>11减去0.1组_2亚组_2时间_2 0.515
#>12减去0.1组_2亚组_2时间_3 0.915
#>13减去0.1组_3子组_1时间_2 0.204
#>14减去0.1组_3亚组_1时间_3 0.498
#>15减去0.1组_3亚组_2时间_2 0.204
#>16减去0.1组_3亚组_2时间_3 0.498

brm_marignal_data()可以生成任一特定于子组的或非分组特定的汇总统计。

摘要数据子组<- br边缘数据(
  数据=数据,
  水平= 0.95,
  使用子组= 真的
)

摘要数据子组
#>#A台:126×5
#>统计分组时间值
#><chr><chr>
#>1低组_1亚组_1时间_1 0.170
#>2下组_1亚组_1时间_2 0.244
#>3下组_1亚组_1时间_3 0.169
#>4下组_1亚组_2时间_10.484
#>5下组_1亚组_2时间_2 0.364
#>6下组_1亚组_2时间_30.266
#>7下组_2亚组_1时间_1 0.421
#>8下组_2亚组_1时间_2 0.221
#>9下组_2子组_1时间_3 0.208
#>10低组_2亚组_2时间_10.220
#> # 116行
摘要_数据_简化<- brm_marginal_data(brm_marginal_data)(
  数据=数据,
  水平= 0.95,
  使用子组= 错误的
)

摘要_数据_简化
#>#A台:63×4
#>统计组时间值
#><chr><chr><chr><dbl>
#>1个较低组_1时间_1 0.251
#>2下组_1时间_2 0.219
#>3下组_1时间_3 0.143
#>4下组_2时间_10.237
#>5下组_2时间_2 0.252
#>6下组_2时间_3-0.0331
#>7下组_3时间_10.104
#>8下组_3时间_2 0.332
#>9下组_3时间_3 0.110
#>10平均组_1时间_10.0632
#> # 还有53行

5模型比较

指标来自业务风险管理系统可以比较整个子组和简化非亚组模型评估亚组作为整体。我们可以很容易地计算出广泛适用的信息准则(WAIC)。

业务风险管理系统::waic公司(模型_子组)
#>
#>由4000乘以900对数似然矩阵计算得出。
#>
#>估计SE
#>elpd_waic-1275.8 19.9
#>p_waic 20.0 1.0页
#>海外货币2551.6 39.9
业务风险管理系统::waic公司(模型_简化)
#>
#>由4000乘以900对数似然矩阵计算得出。
#>
#>估计SE
#>elpd_waic-1273.9 20.0号
#>p_waic 17.1 0.9分
#>围2547.840.0

同样,我们可以根据预期的日志比较模型基于近似帕累托平滑的预测密度不参与交叉验证。

loo_子组<-业务风险管理系统::厕所(模型_子组)
loo_减少<-业务风险管理系统::厕所(模型_简化)
loo_子组
#>
#>由4000乘以900对数似然矩阵计算得出。
#>
#>估计SE
#>elpd_loo-1275.8 19.9
#>p_loo 20.1 1.0
#>卢尼克2551.6 39.9
#> ------
#>elpd_loo的MCSE为0.1。
#>MCSE和ESS估计假定MCMC提取(r_eff in[0.4,1.6])。
#>
#>所有Paretok估计值均良好(k<0.7)。
#>有关详细信息,请参阅帮助(“Preto-k-diagnostic”)。
loo_减少
#>
#>由4000乘以900对数似然矩阵计算得出。
#>
#>估计SE
#>elpd_loo-1274.0 20.0
#>p_loo 17.2 0.9
#>卢尼克2547.9 40.0
#> ------
#>elpd_loo的MCSE为0.1。
#>MCSE和ESS估计假定MCMC提取(r_eff in[0.4,1.8])。
#>
#>所有Paretok估计值均良好(k<0.7)。
#>有关详细信息,请参阅帮助(“pareto-k-diagnostic”)。
厕所::loo_compare(厕所对比)(loo_subgroup,loo_redired)
#>帮助差异se_diff
#>模型减少0.0 0.0
#>型号分组-1.9 1.6

6可视化

brm_plot_draws()了解任何特定于子组的边际平均值。

brm绘制(图纸_子组$差异组)

您可以调整视觉美学以同时比较子组级别side-if-subgroup级别是主要的兴趣比较。

brm绘制(
draws_subgroup(图纸_子组)$差异组,
  轴= “子组”,
  刻面= c(c)(“时间”,“组”)
)

以下函数调用比较子组模型结果根据子组数据。

brm _打印_比较(
  数据=摘要数据子组,
  模型=摘要_子组,
  边缘的,边缘的= “响应”
)

您可以调整绘图美学以并排查看子组级别作为兴趣的主要比较。

brm _打印_比较(
  数据=摘要数据子组,
  模型=摘要_子组,
  边缘的,边缘的= “响应”,
  比较= “子组”,
  轴线= “时间”,
  刻面= c(c)(“组”,“源”)
)

我们还可以直观地比较一个亚组的治疗效果降低模型的边际处理效果。

brm_绘图比较(
  子群= 滤波器(摘要_子组,子组== “子组2”),
  减少=摘要_摘要,
  边缘的,边缘的= “difference_group”
)

请记住按单个子组级别进行筛选。否则,brm_plot_compare()抛出信息错误以防止过度绘制。

brm _打印_比较(
  子群=摘要_子组,
  减少=摘要_摘要,
  边缘的,边缘的= “difference_group”
)
#>错误:
#> ! brm_plot_compare()省略了subgroup变量,因为不是所有的边际摘要都有它,但边际摘要“subgram”有多个子组级别。请在单个子组级别上进行筛选,或确保提供的所有边缘摘要都是特定于子组的。

工具书类

EMA(2019),中的亚组调查指南验证性临床试验欧洲药品管理局;https://www.ema.europa.eu/en/investigation-subgroups-confirmatory-clinical-trials-scientific-guideline.
非物质文化遗产(1998),“国际技术协调理事会人用药品要求(ICH)E9指南。临床试验的统计原则,” https://database.ich.org/sites/default/files/E9_Guideline.pdf.
Kent,D.M.(2023),O(运行)总体临床试验的平均治疗效果,每次一个变量非均质治疗的亚组分析和预测方法影响:T型以患者为中心的循证医学医学,” 临床试验, 20, 328–337.
Lipkovich,I.、Dmitrienko,A.和B,R.(2017),T型生物统计乌托邦:数据驱动临床试验中的亚组识别与分析,” 统计医学, 36, 136–196.
Lipkovich,I.、Svensson,D.、Ratitch,B.和Dmitrienko,A.(2023),O(运行)现代方法概述用于识别和评估非均质处理效果临床数据,” 临床试验, 20, 380–393.

  1. 如果从基线分析变更,您还需要设置baseline_subgroup=假baseline_subgroup_time=假在公式中简化模型。↩︎

  2. 请参阅的子组分析部分https://openpharma.github.io/brms.mmrm/articles/inference.html用于解释平均包含子组在里面brm_transform_marginal()↩︎