如何使用ggplot绘制按地区分组的对数相对风险关联曲线
解决方案
你现有代码输出不符合预期的核心原因是初始Cox模型未纳入Region变量,无法计算不同地区对应的效应值,需要先调整模型再绘图,可按你的需求选择以下两种场景实现:
场景1:不同地区的CV效应独立(允许CV对终点的影响随地区变化)
如果需要每个地区对应单独的CV效应曲线,需要在模型中添加CV与Region的交互项,完整代码如下:
# 更新datadist统计,覆盖所有用到的变量分布 dd <- datadist(EB); options(datadist='dd') # 建模时纳入CV、Region主效应+交互项,x=TRUE和y=TRUE用于后续正确计算置信区间 f <- cph(Surv(time, event) ~ CV * Region, data = EB, x = TRUE, y = TRUE) # 绘图,按Region区分曲线 ggplot(Predict(f, CV, Region)) + aes(color = Region, fill = Region) + geom_ribbon(alpha = 0.2, color = NA) + ylab("Log relative hazard for primary outcome") + xlab("Continuous value") + ggtitle("Association between continuous value and primary endpoint by Region")
你之前看到的区间带是95%置信区间带,代表对应地区、对应CV取值下,log相对风险估计值的95%置信范围,区间越窄说明该点的效应估计稳定性越高。如果不需要显示置信区间,添加geom_ribbon(stat = "blank")即可关闭。
场景2:仅调整Region混杂因素,CV效应在所有地区一致
如果不需要CV的效应随地区变化,仅希望按地区分面展示调整了Region混杂后的效应曲线,使用主效应模型即可:
dd <- datadist(EB); options(datadist='dd') # 仅纳入CV和Region的主效应,不添加交互 f <- cph(Surv(time, event) ~ CV + Region, data = EB, x = TRUE, y = TRUE) # 分面展示各地区的曲线,此时所有曲线斜率一致、仅截距不同 ggplot(Predict(f, CV, Region)) + facet_wrap(~Region) + ylab("Log relative hazard for primary outcome") + xlab("Continuous value") + ggtitle("Association between continuous value and primary endpoint by Region")
补充注意事项
- 若Region为字符型变量,建议先转成因子型再建模,避免绘图时分类排序错乱
- 若需要展示风险比HR而非log相对风险,可在
Predict调用时添加fun = exp参数,同步将y轴标签改为HR for primary outcome即可
内容的提问来源于stack exchange,提问作者Bibi
相关产品推荐
相关产品推荐

