如何在rms包lrm模型的bplot中显示比值比而非对数优势比
把rms包3D交互图的Y轴从Log-Odds转为Odds Ratio(OR)
我之前在做类似的rms包交互项可视化时,也遇到过要把log-odds转成OR的需求,给你两个实用的解决方案,直接套到你的代码里就行:
方法1:先转换Predict结果再绘图
这个方法最直接,先把Predict输出的log-odds计算为OR,再传递给bplot:
# 第一步:生成预测对象并转换log-odds为OR pred_results <- Predict(model, cont.var1=seq(5,110), cont.var2, np=50, ref.zero=TRUE) pred_results$yhat <- exp(pred_results$yhat) # 核心转换步骤 # 第二步:绘制3D曲面,修改Y轴标签和刻度 bplot(pred_results, lfun=wireframe, adj.subtitle=FALSE, drape=TRUE, ylab="Odds Ratio (OR)", # 明确标注Y轴含义 scales=list( y=list( at=c(0.25, 0.5, 1, 2, 4), # 选择读者易理解的OR刻度 labels=c("0.25", "0.5", "1", "2", "4") ) ) )
这里因为你用了ref.zero=TRUE,所以原始的yhat是相对于参考点的log-odds,取指数后得到的就是相对于参考点的OR,参考点的OR为1,读者能直观判断变量变化带来的效应方向(OR>1是正效应,<1是负效应)。
方法2:仅修改坐标轴显示(保留原始log-odds数据)
如果不想改动预测数据,可以直接在绘图时替换Y轴的刻度和标签,让底层数据还是log-odds,但显示出来的是OR:
bplot(Predict(model, cont.var1=seq(5,110), cont.var2, np=50, ref.zero=TRUE), lfun=wireframe, adj.subtitle=FALSE, drape=TRUE, ylab="Odds Ratio (OR)", scales=list( y=list( at=log(c(0.25, 0.5, 1, 2, 4)), # 对应OR的log值(即原始log-odds刻度) labels=c("0.25", "0.5", "1", "2", "4") # 显示OR标签 ) ) )
这个方法的优势是保留了原始的log-odds数据,后续如果需要调整分析的话不用重新计算,适合需要同时保留两种尺度的场景。
小提示
- 选择OR刻度时,优先用
0.25、0.5、1、2、4这类有直观含义的数值,避免用连续的小数刻度,降低读者理解成本; - 如果用了
drape=TRUE,颜色映射是基于原始log-odds的,不过因为OR和log-odds的趋势完全一致,所以颜色依然能准确反映效应大小,不需要额外调整。
内容的提问来源于stack exchange,提问作者Pavel Roshanov
相关产品推荐
相关产品推荐

