Sas 随机存取n个观测值

Sas 随机存取n个观测值,sas,Sas,假设我有一组50个变量和50个观察值 是否可以访问100个随机单元格并更改其值 如果我不必为此使用SQL,那就太好了。您的采样率是0.04-4%的记录将被设置为丢失。我假设您有相同类型的变量,并且可以在数组中列出。即便如此,还是有办法解决这个问题。另一个选项是将数据翻转到宽结构,使用Proc SurveySelect选择100个随机值并设置为missing。 下面的代码仅使用基本SAS技术 /*Generate sample data*/ data sample; array var(50) v

假设我有一组50个变量和50个观察值

是否可以访问100个随机单元格并更改其值


如果我不必为此使用SQL,那就太好了。

您的采样率是0.04-4%的记录将被设置为丢失。我假设您有相同类型的变量,并且可以在数组中列出。即便如此,还是有办法解决这个问题。另一个选项是将数据翻转到宽结构,使用Proc SurveySelect选择100个随机值并设置为missing。 下面的代码仅使用基本SAS技术

/*Generate sample data*/
data sample;
array var(50) var1-var50;
do i=1 to 50;
    do j=1 to 50;
        var(j)=rand('normal', 25, 4);
        end;
    output;
end;

drop i j;
run;

*randomly assign to missing;
data sample_missing;
    call streaminit(123); *ensure reproducible 100 records;
    set sample;
    array var(50) var1-var50;
    rate=100/(50*50); *based on your question;

    retain num_miss 0;
    do i=1 to 50;

    if rand('bernoulli', rate) = 1 and num_miss < 100 then do;
        var(i)=.;
        num_miss+1;
    end;

    end;
run;

/*Check the values and code*/   
data check;
set sample_missing end=eof;
retain nmiss_cum;
nmiss_row = nmiss(of var1--var50);
nmiss_cum+nmiss_row;

/*if you only want to see the total number missing for checks uncomment the next two lines*/
**if eof then output;

 * *keep nmiss_cum;
run;

如果您想要正好100个缺少的值,那么直接的暴力方法是将您的数据视为2500个单元格。生成一个包含100个介于1和2500之间的随机数的列表。然后将这些单元格设置为“缺少”。如下所示:

data sample;
  array x(50);
  do i=1 to 50;
    do j=1 to 50;
      x(j)=rand('normal', 25, 4);
    end;
    output;
  end;

  drop i j;
run;

**Generate list of 100 random numbers (there are doubtless better ways : );
data cellno;
  do cellno=1 to 2500;
    ran=ranuni(3);
    output;
  end;
run;
proc sql outobs=100 noprint;
  select cellno into :celllist separated by " "
  from cellno
  order by ran
  ;
run;

%put &celllist;

*Use that list to recode 100 cells to null;
data want; 
  set sample;
  array x(50);
  do i=1 to 50;
    if (_n_-1)*50+i IN (&celllist) then
      call missing(x{i});
  end;
  drop i;
run;

对这个问题应用K/N随机抽样技术可能是最简单的。唯一的区别是,取而代之的是,在变量数组中的单个元素上选择的只是“选择”而不是“观察”

%let seed=12345;
%let varlist=X1-X50 ;
%let samplesize= 100 ;

data want;
  set have nobs=nobs ;
  array x &varlist ;
  retain _count &samplesize ;
  retain _left ;
  if _n_=1 then _left=dim(x)*nobs ;
  do i=1 to dim(x);
    if (_count/_left > ranuni(&seed)) then do;
        x(i) = . ;
        _count = _count - 1;
    end;
    _left = _left - 1;
  end;
  drop _left _count i ;
run;

1.是的,2。我不知道问题是什么。请详细说明你想做什么。@Reeza我删除了第二个问题,因为这个概念没有任何意义。你能详细解释一下前者吗?你需要更详细地解释你想做什么,以及你尝试了什么。还有,你们有SAS/IML吗?@Reeza对不起,我几乎不知道SAS/IML是什么。我想知道是否有一种使用数据、set语句和Base SAS?的解决方案?。我想将随机选择的100个单元格的值设置为。原始集没有任何缺失值。将100个值精确设置为缺失值很重要吗?或者给每个值设置为缺失值的概率为4%,这样可能会得到小于100或大于100的值吗?我希望可以更改100个值,而无需将数据转换为一维,但是看来你的答案是最好的。谢谢。为了那粒种子,是的。另外,如果我理解正确,我想你是想把速率变量传递给兰德。@lavsprat你是对的-不同的种子并不总是产生100。还有其他方法可以将数据保存在数据步骤中,但转置可能是最简单的方法。@lavsprat其他方法是将数据视为2500个单元格。选择1到2500之间的100个随机数。然后将这些单元格重新编码为“丢失”。如果这种方法听起来有用,我可以加上它。@Quentin,请加上。