在R中按得分十分位数计算病例对照比值比并分表型绘图
按SCORE十分位数计算OR并绘制分表型比值比图
下面是针对需求的完整R实现步骤,包含OR计算和分表型绘图:
1. 依赖包加载与数据预处理
先加载所需工具包,并确保SCORE按表型分组后生成十分位数(避免跨表型的分位数偏倚):
library(dplyr) library(ggplot2) library(broom) library(stringr) # 假设你的数据集名为df,包含字段:ID、PHENO(1=病例/0=对照)、SCORE、PHE_TYPE(不同表型标识) # 按表型分组后,将SCORE拆分为10个等分组 df <- df %>% group_by(PHE_TYPE) %>% mutate(decile = ntile(SCORE, 10)) %>% ungroup()
2. 按表型+十分位数计算OR及置信区间
采用logistic回归模型计算每个十分位数相对于第一组的OR(比值比),同时提取标准误和95%置信区间:
# 分组拟合模型并提取结果 or_results <- df %>% group_by(PHE_TYPE) %>% group_modify(function(sub_data, .) { # 拟合logistic回归,以第1个十分位数为参照组 glm_model <- glm(PHENO ~ factor(decile, ref = 1), data = sub_data, family = binomial()) # 提取模型结果并指数化得到OR tidy(glm_model, exponentiate = TRUE, conf.int = TRUE) %>% filter(term != "(Intercept)") %>% # 提取十分位数编号 mutate(decile = as.integer(str_remove(term, "factor\\(decile, ref = 1\\)"))) %>% select(decile, or = estimate, se = std.error, lower_ci = conf.low, upper_ci = conf.high) }) %>% ungroup()
3. 绘制分表型OR图
用ggplot2生成分面图,每个表型对应一个子图,清晰展示各十分位数的OR及置信区间:
ggplot(or_results, aes(x = decile, y = or)) + # 绘制95%置信区间误差棒 geom_errorbar(aes(ymin = lower_ci, ymax = upper_ci), width = 0.2, color = "#636363") + # 绘制OR点 geom_point(size = 2.5, color = "#2171b5") + # 添加OR=1的参照虚线(无关联线) geom_hline(yintercept = 1, linetype = "dashed", color = "#cb181d") + # 按表型分面展示 facet_wrap(~PHE_TYPE, ncol = 2) + # 设置坐标轴与标题 labs( x = "SCORE十分位数", y = "比值比(病例vs对照)", title = "不同表型下SCORE分组的患病风险比值比" ) + # 优化主题样式 theme_bw() + theme( plot.title = element_text(hjust = 0.5, size = 14), axis.title = element_text(size = 12), axis.text = element_text(size = 10), strip.text = element_text(size = 11) )
可选调整
- 若想在同一图中用颜色区分表型而非分面,可移除
facet_wrap,并将aes(color = PHE_TYPE)添加到ggplot()中,同时调整点和误差棒的颜色映射。 - 如需更换参照组,修改
factor(decile, ref = X)中的X为目标十分位数编号即可。
内容的提问来源于stack exchange,提问作者tacrolimus
相关产品推荐
相关产品推荐

