Sas 随机存取n个观测值
假设我有一组50个变量和50个观察值 是否可以访问100个随机单元格并更改其值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
如果我不必为此使用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,请加上。