Random 随机选择10名受试者并保留其所有观察结果

Random 随机选择10名受试者并保留其所有观察结果,random,sas,grouping,sample,Random,Sas,Grouping,Sample,我在SAS中遇到了以下问题。我有一个这种格式的数据集: 数据集由500个ID组成,每个ID有不同数量的观察值。我试图随机选择5个ID,同时保留它们的所有观察值。我首先构建了一个随机生成器,保存了一个间隔为10个数字的向量[1500]。然而,当我试图使用这个向量来选择与随机数对应的ID时,它变得很笨拙。更清楚地说,我希望我的净结果是一个数据集,其中包括与ID 1、10、43、22、67或任何其他5个数字序列相对应的所有观察值 任何提示都将不胜感激 根据你的问题,我假设你已经有了10个随机数。如果

我在SAS中遇到了以下问题。我有一个这种格式的数据集:

数据集由500个ID组成,每个ID有不同数量的观察值。我试图随机选择5个ID,同时保留它们的所有观察值。我首先构建了一个随机生成器,保存了一个间隔为10个数字的向量[1500]。然而,当我试图使用这个向量来选择与随机数对应的ID时,它变得很笨拙。更清楚地说,我希望我的净结果是一个数据集,其中包括与ID 1、10、43、22、67或任何其他5个数字序列相对应的所有观察值


任何提示都将不胜感激

根据你的问题,我假设你已经有了10个随机数。如果它们保存在表/数据集中,您可以按id在它们和原始数据集中之间运行左联接。这将提取具有相同id的所有原始观测值

假设您随机选择的数字保存在一个名为“random_id”的表中。然后,您可以执行以下操作:

proc sql;
create table want as
select distinct
t1.id,
t2.*
from random_ids as t1
left join have as t2 on t1.id = t2.id;
quit;
如果您的随机数未保存在数据集中,则只需将其复制到where语句中,如:

proc sql;
create table want as
select distinct
*
from have
where id in (1 10 43 22 67) /*here you put the ids you want*/
quit;

最好,

Proc SURVEYSELECT
是你的朋友

data have;
  call streaminit(123);
  do _n_ = 1 to 500;
    id = rand('integer', 1e6);
    do seq = 1 to rand('integer', 35);
      output;
    end;
  end;
run;

proc surveyselect noprint data=have sampsize=5 out=want;
  cluster id;
run;

proc sql noprint;
  select count(distinct id) into :id_count trimmed from want;

%put NOTE: &=id_count;
如果您的SAS许可证中没有此过程,您可以根据
k/n
算法进行样本选择。注:k/n最早的存档文章是基于1995年《SAS观察》杂志文章的代码

proc sql noprint;
  select count(distinct id) into :N trimmed from have;

proc sort data=have;
  by id;

data want_kn;
  retain N &N k 5;

  if _n_ = 1 then call streaminit(123);

  keep = rand('uniform') < k / N;
  if keep then k = k - 1;

  do until (last.id);
    set have;
    by id;
    if keep then output;
  end;

  if k = 0 then stop;

  N = N - 1;

  drop k N keep;
run;

proc sql noprint;
  select count(distinct id) into :id_count trimmed from want_kn;

%put NOTE: &=id_count;
procsqlnoprint;
选择count(distinct id)到:N从have中修剪;
proc sort data=have;
按身份证;
数据需求量;
保留N&N k 5;
如果_n_=1,则调用streaminit(123);
keep=rand(‘统一’)
这是以前多次提出的问题。查找
Proc SURVEYSELECT
或“
k/n
random sampling”你说的
vector
-你在使用SAS/IML吗?还是base SAS?@Richard我想你可能误解了这个问题-这与正常的抽样问题(无论是不是IML问题)有点不同。你能展示一下你的随机生成器吗?是否有不使用
RAND
功能的原因?