You need to enable JavaScript to run this app. PROC SURVEYSELECT用URS法设sampsize=500但样本量不足问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 13:27:03