在R中针对连续预测变量范围绘制比值比(含样条项)的方法
在R中简便绘制连续变量(含样条项)的比值比(OR)曲线
核心思路
比值比(OR)的本质是当前取值下的优势(odds)与参考点优势的比值,公式为:OR(x) = odds(x) / odds(x_ref) = exp(logodds(x) - logodds(x_ref))
不需要循环计算,直接利用预测的对数优势比(logodds)做差值再指数化即可,这是最简便的实现方式。
1. 普通Logistic回归的OR绘制
基于你提供的代码,直接扩展OR的计算与可视化:
library(tidyverse) library(splines) # 加载数据 dat <- read.csv("https://stats.idre.ucla.edu/stat/data/binary.csv") # 普通logistic模型 mod <- glm(admit ~ gre, data = dat, family = "binomial") # 创建预测数据集 newdat <- data.frame(gre = seq(0, 800, 1)) # 预测logodds及标准误(保留SE用于绘制置信区间) pred <- predict(mod, newdata = newdat, type = "link", se.fit = TRUE) newdat <- newdat %>% mutate( logodds = pred$fit, se = pred$se.fit, # 选取gre=500作为参考点(也可替换为均值mean(dat$gre)等有意义的取值) ref_logodds = predict(mod, newdata = data.frame(gre=500), type="link"), # 计算OR及95%置信区间 or = exp(logodds - ref_logodds), or_lower = exp((logodds - ref_logodds) - 1.96*se), or_upper = exp((logodds - ref_logodds) + 1.96*se) ) # 绘制OR曲线(带置信区间) ggplot(newdat, aes(x = gre, y = or)) + geom_line(size=1) + geom_ribbon(aes(ymin=or_lower, ymax=or_upper), alpha=0.2) + geom_hline(yintercept=1, linetype="dashed", color="red") + labs(x="GRE分数", y="比值比(OR,参考gre=500)", title="普通Logistic回归的OR曲线") + theme_bw()
普通模型中OR为水平线,符合预期——因为gre是线性项,OR随gre的变化幅度固定。
2. 含样条项模型的OR绘制
样条模型的处理逻辑完全一致,仅需替换模型即可:
# 5节点自然样条模型 mod_spline <- glm(admit ~ ns(gre,5), data = dat, family = "binomial") # 预测并计算OR pred_spline <- predict(mod_spline, newdata = newdat, type = "link", se.fit = TRUE) newdat_spline <- newdat %>% select(gre) %>% mutate( logodds = pred_spline$fit, se = pred_spline$se.fit, ref_logodds = predict(mod_spline, newdata = data.frame(gre=500), type="link"), or = exp(logodds - ref_logodds), or_lower = exp((logodds - ref_logodds) - 1.96*se), or_upper = exp((logodds - ref_logodds) + 1.96*se) ) # 绘制样条模型的OR曲线 ggplot(newdat_spline, aes(x = gre, y = or)) + geom_line(size=1, color="blue") + geom_ribbon(aes(ymin=or_lower, ymax=or_upper), alpha=0.2, fill="blue") + geom_hline(yintercept=1, linetype="dashed", color="red") + labs(x="GRE分数", y="比值比(OR,参考gre=500)", title="样条模型的OR曲线") + theme_bw()
这里OR曲线会随gre取值波动,清晰展示样条拟合后OR的非线性变化趋势。
关键说明
- 参考点可根据业务需求选择:比如变量的均值、中位数,或具有实际意义的阈值(如考试及格线)。
- 1.96对应95%置信水平,若需其他置信水平,可替换为对应正态分布分位数。
- 该方法采用向量运算,完全避免循环,计算效率远高于循环迭代。
内容的提问来源于stack exchange,提问作者LucaS
相关产品推荐
相关产品推荐

