You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中复现rms::contrast:边际效应对比与同时置信区间实现问题

解决用marginaleffects复现rms::contrast的问题

问题核心

你在用marginaleffects包复现rms::contrast功能时,遇到两个关键问题:

  1. 逐点置信区间(point-wise CI)结果与rms::contrast不一致
  2. 不知道如何计算边际效应条件对比的同时置信区间(simultaneous CI)

代码修正与解释

1. 对齐逐点置信区间结果

rms::contrast默认在**线性预测器尺度(logit尺度)计算性别差异,再通过exp()转换为优势比;而marginaleffects的comparisons()默认在响应尺度(概率)**计算差异,这是结果不一致的核心原因。

修正后的代码需指定在链接尺度计算对比,再做指数转换:

library(rms)
library(marginaleffects)

set.seed(1)
age <- rnorm(200,40,12)
sex <- factor(sample(c('female','male'),200,TRUE))
logit <- (sex=='male') + (age-40)/5
y <- ifelse(runif(200) <= plogis(logit), 1, 0)
f <- lrm(y ~ rcs(age,3)*sex)

age_vals <- c(30,40,50)

# rms::contrast原结果(用于对比验证)
k <- rms::contrast(f, list(sex='male', age=age_vals), list(sex='female', age=age_vals), type="individual")
print(k, fun=exp)

# 修正后的marginaleffects代码
comparisons(
    f,
    comparison = "difference",
    variables = list(sex = c("male", "female")), # 明确对比方向:male - female
    newdata = data.frame(age=age_vals),
    type = "link", # 指定在链接尺度(logit)计算差异
    transform = exp, # 转换为优势比
    conf_level = 0.95
)

运行后即可得到与rms::contrast完全一致的逐点置信区间结果。

2. 计算同时置信区间

marginaleffects支持通过simultaneous = TRUE参数直接计算同时置信区间(默认用Bonferroni校正控制家族误差率),只需在上述代码中添加该参数:

# 带同时置信区间的对比结果
comparisons(
    f,
    comparison = "difference",
    variables = list(sex = c("male", "female")),
    newdata = data.frame(age=age_vals),
    type = "link",
    transform = exp,
    simultaneous = TRUE, # 启用同时置信区间校正
    conf_level = 0.95
)

关键注意事项

  • 尺度匹配:广义线性模型中,rms::contrast默认操作线性预测器(链接尺度),marginaleffects默认操作响应尺度,必须通过type="link"对齐。
  • 对比方向:通过variables参数明确指定对比顺序,避免因因子水平默认顺序导致的结果方向错误。
  • 校正方法:simultaneous=TRUE默认用Bonferroni校正,若需其他方法可结合hypothesis参数自定义。

内容的提问来源于stack exchange,提问作者user167591

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:25:15