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

SAS中按亚组计算ROC AUC的P值求助(单模型无法用roccontrast)

解决不同种族亚组ROC AUC的统计学对比问题

你当前用BY Race语句生成了多个独立的Logistic模型,每个模型对应一个种族亚组,而roccontrast是同一模型内对比多个预测变量的ROC,所以无法直接用它来跨亚组对比AUC。下面提供两种可行的解决方案:

方法一:构建含交互项的单一模型,用ROCContrast直接对比

这种方法将种族作为协变量加入模型,拟合不同种族亚组的预测效应,然后用roccontrast语句直接对比亚组AUC:

proc logistic data=data plots(only)=roc;
    class Race(ref='白人'); /* 指定参考种族,可根据需求调整 */
    model htn(event='1') = BMI Race BMI*Race; /* 加入BMI与种族的交互项,允许不同种族的BMI效应不同 */
    roccontrast reference('白人') / compare('西班牙裔' '黑人' '其他'); /* 对比其他种族与参考组的AUC */
    ods output ROCAUC=AUC_Results ROCContrast=Contrast_Results; /* 输出AUC值和对比检验结果 */
run;

说明:

  • 如果假设BMI对高血压的效应在不同种族中相同,可以去掉BMI*Race交互项,仅保留BMI和Race主效应,此时模型是协方差分析形式,亚组AUC差异来自截距的不同。
  • 输出的Contrast_Results会包含每个种族与参考组的AUC差值、标准误和P值,同时会给出所有种族AUC是否不全相等的整体检验结果。

方法二:利用BY语句生成的ROC数据,用PROC ROCCONTRAST对比

先通过原有代码生成每个种族的ROC曲线数据,再用专门的PROC ROCCONTRAST工具跨曲线对比:

/* 第一步:生成每个种族的ROC曲线数据(你的原有代码) */
proc logistic data=data plots(only)=roc;
    by Race;
    model htn(event='1') = BMI;
    ods output ROCCurve=ROC_Data;
run;

/* 第二步:给每条ROC曲线添加标识变量 */
data ROC_Data_Labeled;
    set ROC_Data;
    Curve_ID = Race; /* 用种族作为曲线的唯一标识 */
run;

/* 第三步:对比不同种族的AUC */
proc roccontrast data=ROC_Data_Labeled;
    id Curve_ID; /* 指定区分不同曲线的变量 */
    test equality; /* 检验所有种族的AUC是否相等(整体检验) */
    test pairwise; /* 进行种族间的两两AUC对比 */
    ods output ContrastTests=Pairwise_Results OverallTest=Overall_Results; /* 输出检验结果 */
run;

说明:

  • PROC ROCCONTRAST会基于ROC曲线数据计算每个亚组AUC的标准误,进而完成统计学检验。
  • 输出的Overall_Results是所有种族AUC是否存在差异的整体检验,Pairwise_Results包含每两个种族间的AUC差值、标准误和P值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:23:28