You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改SAS随机抽样代码生成10个独立随机样本并计算均值

生成10个独立随机样本并计算均值的SAS实现

我来帮你调整这段SAS代码,实现生成10个独立随机样本并计算每个样本均值的需求。你提到了PROC里的reps=参数,刚好可以用PROC SURVEYSELECT来高效完成这个任务——它的reps=参数就是专门用来指定重复抽样次数的,比手动写DATA步循环更简洁可靠:

/* 用PROC SURVEYSELECT生成10个独立随机样本,每个样本50条观测 */
proc surveyselect data=sashelp.baseball
    out=multiple_samples
    method=srs  /* 指定简单随机抽样,和原代码逻辑一致 */
    n=50        /* 每个样本包含的观测数 */
    reps=10;    /* 重复抽样次数,即生成10个独立样本 */
run;

/* 按样本分组计算nHome的均值 */
proc sql;
    select Replicate as 样本编号, mean(nHome) as nHome均值
    from multiple_samples
    group by Replicate;
quit;

代码说明:

  • PROC SURVEYSELECT是SAS官方提供的专业抽样过程,method=srs对应你原代码里的简单随机抽样逻辑;
  • reps=10直接实现了生成10个独立样本的需求,输出数据集multiple_samples中会自动生成Replicate变量,标记每条观测属于第几个样本;
  • 后续用PROC SQLReplicate分组计算均值,就能快速得到10个样本各自的统计结果。

如果你更倾向于基于原有的DATA步逻辑修改(不用PROC抽样过程),也可以通过嵌套循环实现10次抽样,代码如下:

data multiple_samples (drop=i j samplesize obsleft obsnum totobs);
    samplesize=50;
    num_reps=10; /* 设置要生成的样本数量 */
    do j=1 to num_reps; /* 外层循环控制样本个数 */
        obsleft=totobs;
        do i=1 to samplesize; /* 内层循环抽取单个样本的50条观测 */
            obsnum=ceil(ranuni(0)*totobs);
            set sashelp.baseball point=obsnum nobs=totobs;
            output;
        end;
    end;
    stop;
run;

/* 计算每个样本的nHome均值 */
proc sql;
    select j as 样本编号, mean(nHome) as nHome均值
    from multiple_samples
    group by j;
quit;

不过要注意,这种DATA步手动循环的方式,在无放回抽样场景下需要额外处理已抽取的观测,不如PROC SURVEYSELECT稳定易用,推荐优先使用PROC的实现方案。

内容的提问来源于stack exchange,提问作者J.M.M

火山引擎 最新活动