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
相关产品推荐
相关产品推荐

