如何结合survey_weight按respondent_id计算调研参与率?
加权参与率计算正确性分析
你的两种计算方式本质上都是正确的,核心逻辑都是加权参与人数除以加权总人数,下面分别拆解说明:
1. PROC SURVEYMEANS 方法
proc surveymeans data=survey_data sum mean; strata zip_code; weight survey_weight; var participated; domain zip_code; run;
- 对于二元变量
participated,proc surveymeans输出的Mean值就是你需要的加权参与率,计算逻辑为:sum(participated * survey_weight) / sum(survey_weight),完全匹配参与率的定义。 strata zip_code适用于抽样设计是按邮编分层的场景,如果实际抽样没有分层,去掉该语句也不影响参与率的计算结果,只是不会输出分层抽样对应的方差、标准误等统计量。domain zip_code会强制按邮编分组计算,直接输出每个邮编对应的加权参与率及相关统计量。
2. PROC MEANS + DATA步方法
proc means data=survey_data sum; class zip_code; var participated survey_weight; weight survey_weight; output out=zip_summary sum(participated)=total_part sum(survey_weight)=total_survey_weights; run; data zip_summary; set zip_summary; participation_rate = total_part / total_survey_weights; run; proc print data=zip_summary; var zip_code participation_rate; /* 注意:原代码里的var zip是笔误,应改为zip_code */ run;
proc means中使用weight survey_weight时,sum(participated)实际计算的是sum(participated * survey_weight)(即加权后的参与总人数),sum(survey_weight)则是加权后的总受访人数。- 后续DATA步的除法计算和
proc surveymeans输出的Mean结果完全一致,只是这种方法需要手动计算比率,而surveymeans会直接给出结果,同时还能提供抽样误差相关的统计量(如果抽样设计符合要求的话)。
验证小技巧
你可以抽取一个邮编下的少量样本手动计算:把该邮编下每个受访者的participated乘以survey_weight求和,再除以该邮编下所有受访者的survey_weight总和,对比两种SAS方法的输出结果,就能快速确认计算的正确性。
内容的提问来源于stack exchange,提问作者sammisalami
相关产品推荐
相关产品推荐

