如何用rtables/tern生成按SOC/PT分组的风险人年及发病率表格?
实现按SOC/PT汇总AE并包含风险人年及发生率的表格方法
核心逻辑
要生成目标表格,核心是将AE事件数据与受试者风险时间数据做关联整合:既要统计每个系统器官分类(SOC)/首选术语(PT)下的不良事件(AE)发生情况,也要计算对应分析人群的总风险人年,最终推导每100人年的AE发生率(发生率=AE发生数/总风险人年×100)。
具体实现步骤
1. 准备基础数据集
- 整理AE数据集:包含受试者ID、SOC名称、PT名称、AE发生标识(如1表示发生该PT的AE,0表示未发生),注意同一受试者同一PT下多次发生AE需提前去重,仅保留1条记录。
- 整理风险时间数据集:包含所有受试者ID、对应的风险人年(由入组日期至试验结束/失访日期换算为年单位的累计时间)。
2. 补全AE与风险时间的关联记录
由于未发生某PT AE的受试者也需要计入风险人年统计,需生成所有受试者与SOC/PT的全组合记录:
- 对有AE的受试者:直接关联其风险人年到对应SOC/PT行
- 对无AE的受试者:为每个SOC/PT生成虚拟记录(AE发生标识设为0),并关联其风险人年
注:SAS环境下可通过
PROC SQL的CROSS JOIN生成受试者与SOC/PT的全组合,再与原AE数据左关联补全发生标识,最后合并风险时间数据。
3. 按SOC/PT分组汇总指标
按SOC和PT分组,计算三个核心指标:
ae_count:该SOC/PT下的AE发生例数(统计AE发生标识为1的记录数)total_person_years:分析集中所有受试者的风险人年总和rate_per_100_py:(ae_count / total_person_years) × 100(保留2-3位小数)
4. 格式化输出TLG表格
按照临床试验表格规范整理结构:
- 第一列:SOC名称,下级PT名称缩进显示
- 第二列:AE发生例数(n)
- 第三列:总风险人年
- 第四列:每100人年发生率
SAS环境简化代码示例
/* 生成所有受试者与SOC/PT的全组合 */ proc sql; create table ae_pt_all as select distinct a.usubjid, b.soc_name, b.pt_name, 0 as ae_flag from risk_time a cross join (select distinct soc_name, pt_name from ae_data) b; quit; /* 关联原AE数据,更新发生标识并合并风险时间 */ proc sql; create table ae_pt_combined as select a.usubjid, a.soc_name, a.pt_name, case when b.usubjid is not null then 1 else 0 end as ae_flag, c.person_years from ae_pt_all a left join ae_data b on a.usubjid = b.usubjid and a.soc_name = b.soc_name and a.pt_name = b.pt_name left join risk_time c on a.usubjid = c.usubjid; quit; /* 按SOC/PT汇总计算核心指标 */ proc sql; create table ae_summary as select soc_name, pt_name, sum(ae_flag) as ae_count, sum(person_years) as total_person_years format=8.2, (calculated ae_count / calculated total_person_years) * 100 as rate_per_100_py format=8.2 from ae_pt_combined group by soc_name, pt_name order by soc_name, pt_name; quit; /* 生成符合TLG规范的表格 */ proc report data=ae_summary nowindows headline headskip; columns soc_name pt_name ae_count total_person_years rate_per_100_py; define soc_name / group '系统器官分类(SOC)'; define pt_name / group '首选术语(PT)' indent=2; define ae_count / display 'AE发生例数(n)'; define total_person_years / display '总风险人年'; define rate_per_100_py / display '每100人年发生率'; run;
关键注意事项
- 风险人年计算需精准:要根据受试者入组、退出/失访、试验结束的具体日期换算,避免遗漏提前终止的受试者
- AE例数去重:同一受试者同一PT下的多次AE仅统计为1例,需在预处理阶段完成去重
- 分层分析适配:若需按治疗组分层,需在分组时加入治疗组变量,确保每组风险人年对应各自治疗人群的总和
内容的提问来源于stack exchange,提问作者xiecheng gu
相关产品推荐
相关产品推荐

