PROC SURVEYSELECT用URS法设sampsize=500但样本量不足问题咨询
问题核心原因
你观察到的输出样本数始终低于设定值,本质不是随机误差,是PROC SURVEYSELECT在URS方法下的默认输出规则和你对有放回抽样的输出预期存在认知差:
- 内部执行环节完全符合预期:SAS确实按照指定的
sampsize=500,在30000条源记录上完成了500次独立的等概率有放回抽取,总抽取次数没有打折扣。 - 输出环节存在默认去重逻辑:URS方法默认会把同一条源记录的多次抽中结果合并为单行,额外生成一个名为
NumberHits的变量,记录该条记录累计被抽中的次数,不会把重复抽中的记录逐行单独输出。
按照数学期望计算,30000条总体中开展500次有放回抽取,会产生约5次左右的重复命中,对应输出去重后的记录数大概在490-495区间,和你观察到的波动范围完全匹配。
这个默认设计的初衷是服务于复杂调查的抽样权重计算:合并后的NumberHits变量是计算抽样权重、估算抽样方差的核心输入,SAS从版本迭代开始就没有把逐次拆行作为URS方法的默认输出。
修复方案
如果你的需求是逐行输出所有抽中记录(含重复行,匹配有放回抽样的计数逻辑),只需要在PROC SURVEYSELECT语句中新增OUTALL选项,修改后的代码如下:
proc surveyselect data = tmp method = urs sampsize = 500 seed = 100 out = out_tmp outall; run;
- 新增该选项后,输出数据集的总行数会严格等于你指定的500,所有重复抽中的源记录会逐行保留,不会被去重合并。
- 如果你原本的使用场景是计算URS方法下的抽样权重,不需要逐行拆分重复记录,那就保留默认输出逻辑即可——这时候看到的输出行数少于设定sampsize是正常现象,总抽样次数并没有减少,完全可以直接用自带的
NumberHits变量作为权重开展后续分析。
内容的提问来源于stack exchange,提问作者spoonman
相关产品推荐
相关产品推荐

