手动计算与SAS University Edition执行Chi-Sq检验的结果差异问询
嘿,我猜你大概率是踩了「检验方法选错」的坑!先看你的数据结构:每一行都是一对研究对象和对照的结局,属于典型的配对二分类资料——这类数据里,研究组和对照组的个体是配对关联的,不是完全独立的样本,根本不能直接用普通的Pearson卡方检验。
如果手动计算时,你是按配对四格表(把「研究Alive-对照Alive、研究Alive-对照Dead」这类配对组合的频数统计出来)算的McNemar配对卡方,但SAS里你用了普通的卡方命令(比如proc freq; tables study_mortality*control_mortality / chisq;),那结果肯定差很多:SAS的普通卡方会把所有行当成独立个体,完全忽略配对关系,而你手动算的是针对配对数据的专属检验。
在SAS里处理这种配对数据,有两种简单的方式:
方式1:先整理配对频数再检验
先把原始数据转成配对四格表的频数格式,再跑检验:
/* 先统计配对组合的频数 */ proc freq data=your_raw_data; tables study_mortality*control_mortality / out=pair_freqs; run; /* 用频数表跑McNemar检验 */ proc freq data=pair_freqs; tables study_mortality*control_mortality / chisq exact; weight count; run;
这里的chisq选项会自动识别2x2配对表,输出McNemar检验的结果,和你手动计算的应该完全一致。
方式2:直接用原始数据,一步到位
更省事的是直接用原始数据,加agree选项,SAS会自动做配对相关的检验:
proc freq data=your_raw_data; tables study_mortality*control_mortality / agree; run;
这个命令不仅会输出McNemar检验的结果(就是你手动算的那个值),还会给你Kappa一致性系数,刚好适配配对设计的分析需求。
拿你给的4行数据来说,整理成配对四格表是:
| 对照Alive | 对照Dead | |
|---|---|---|
| 研究Alive | 2 | 0 |
| 研究Dead | 1 | 1 |
手动算McNemar卡方的话,公式是(b - c)²/(b + c),这里b=0,c=1,结果是1,自由度1,p值0.3173。用上面的SAS代码跑出来的结果绝对和这个一致,而如果用普通Pearson卡方,SAS会算出0.2667的卡方值,p=0.6055——这就是你之前看到差异的根源。
内容的提问来源于stack exchange,提问作者Kul

