【问题标题】:SAS - How to select random samples based on conditionSAS - 如何根据条件选择随机样本
【发布时间】:2019-07-11 20:22:27
【问题描述】:

我有一个 SAS 数据集,其中包含一列从 -2000 到 4000 的数字。 我想根据以下条件选择 37 个随机样本。 如果 num 介于 -2000 到 -1000 之间,则从该范围内随机选择 10 个样本, 如果 num 在 -1000 到 0 之间,则从该范围内随机选择 15 个样本, 如果 num 在 0 到 1000 之间,则从这个范围内随机选择 12 个样本,

我尝试了以下方法:

proc surveyselect data=save.table
   method=srs n=37 out=save.table_sample seed=1953;
run;

但这会给我从整个人群中随机抽取 37 个样本。我想根据数据范围随机选择。

请帮忙处理 SAS 代码,非常感谢!

【问题讨论】:

  • 您是否尝试过每次使用不同的 where 子句运行 3 次?
  • Richard,我提出了一些基本相同的建议。 Where 子句实际上会更干净,因为我们可以完全避免 datastep。

标签: sas sampling


【解决方案1】:
  1. 在您的数据集中创建一个可用于分组分析的分组变量。

    data output;
    set save.table;
    if number < -1000 then group=1;
    else if number < 0 then group=2;
    else if number < 1000 then group=3;
    run;
    
  2. 将 PROC SURVEYSELECT 与具有相同变量 GROUP 以及样本量的数据集一起使用,或者在 PROC SURVEYSELECT 中列出样本量。

    proc surveyselect data=output
    method=srs n=37 out=save.table_sample seed=1953 sampsize=(37 15 12);
    strata group;
    run;
    

无法测试,因为没有提供样本数据,所以这里是一个使用 SASHELP.HEART 的示例

proc sort data=sashelp.heart out=heart; by chol_status; run;


proc surveyselect data=heart (where=(not missing(chol_status))) method=srs sampsize=(5 10 15) out=want;
strata chol_status;
run;

【讨论】:

  • 计算分层值是非常聪明的。来自帮助"The STRATA statement names one or more variables that partition the input data set into nonoverlapping groups (strata)""The formatted values of the STRATA variables determine the STRATA variable levels.""The STRATA variables function much like BY variables, and PROC SURVEYSELECT expects the input data set to be sorted by the STRATA variables. The BY statement options DESCENDING and NOTSORTED are available in the STRATA statement."
【解决方案2】:

如果你想继续使用proc surveyselect,那么一个简单的方法是:

data set1 set2 set3;
  set save.table;
  if number < -1000 then output set1;
  else if number < 0 then output set2;
  else if number < 1000 then output set3;
run;

然后在这 3 个数据集上使用不同的 n 值调用 proc surveyselect 三次。

【讨论】:

  • 感谢您的回答。是的,这可以工作!但是,我只是用一个小例子来展示我的问题。实际上,我需要将数据分离和采样 20 次(在这种情况下不是 3 次)。那么,除了创建 20 个数据集之外,您还知道其他更好的方法吗?再次感谢
  • 如果调用proc surveyselect 20 次是一种选择,那么Richard 在他的cmets 中提出的建议是做同样事情的更好方法。如果没有,我可以仅使用单个数据步提出不同的方法。
  • 请提出一个数据步。这会更有效率,对我来说学习是一件好事。非常感谢您的帮助!
  • 可能会尊重某种格式,因此如果您想删除额外的数据步骤,可以尝试使用我的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多