gpt4 book ai didi

sas - SAS中有放回的随机有序抽样

转载 作者:行者123 更新时间:2023-12-04 22:35:10 25 4
gpt4 key购买 nike

我有一个数据集,我想从中抽取一个样本进行替换。当我使用 proc surveyselect 时,抽取的样本与原始数据集中的顺序完全相同,并且多次抽取被写在彼此下面。

proc surveyselect data=sashelp.baseball outhits method=urs n=1000 out=mydata;

但是,对我来说重要的是,表格中的位置也被抽样了。 proc surveyselect 中是否有一个选项,或者我最好自己对行号进行采样并输出它,如 this paper 中所述,p4?

作为玩具示例(不是 SAS 表示法),假设我有一个值列表 [a, b, c, d] 并且我重复绘制了五次(并保持顺序平局):

首先是a,然后是c,然后是a,然后是b,然后是c。我想要的结果是[a, c, a, b, c],但是sas只给出了

类型的输出
  • [a,a,b,c,c](带有 outhits)
  • [a 2, b 1, c 2, d 0](使用 outall)或
  • [a 2, b 1, c 2](没有附加选项)。

最佳答案

这是一个只需要 BASE SAS 的解决方案。需要进行微小的更改以允许包含其他列,例如 ID 或 DATE。我不认为这是最有效的方法。它在很大程度上依赖于 PROC SQL,这是我的偏好。话虽如此,它应该会在相当合理的时间内产生您希望的结果。

生成的 SQL 代码的长度证明需要一个单独的 sas 程序。如果您不想在日志中显示整个 %included 文件,只需省略 /source2 选项即可。

生成样本数据

data mymatrix;
input c1 c2 c3 c4 c5;
datalines;
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30
31 32 33 34 35
36 37 38 39 40
;

声明宏 %DrawSample

参数:

lib = ds 所在的库
ds = 从中采样的表
out = 要生成的表
outfile = 包含插入字符串的 sas 程序的路径/名称
n = 重复次数

%macro DrawSample(lib, ds, out, outfile, n);

%local nrows ncols cols;

proc sql;
/* get number of rows in source table */
select count(*)
into :nrows
from &lib..&ds;

/* get variable names */
select name, count(name)
into :cols separated by " ",
:ncols
from dictionary.columns
where libname = upcase("&lib")
and memname = upcase("&ds");

quit;

data _null_;
file "&outfile";
length query $ 256;
array column(&ncols) $32;
put "PROC SQL;";
put " /* create an empty table with same structure */";
put " create table &out as";
put " select *";
put " from &lib..&ds";
put " where 1 = 2;";
put " ";

do i = 1 to &n;
%* Randomize column order;
do j = 1 to &ncols;
column(j) = scan("&cols", 1 + floor((&ncols)*rand("uniform")));
end;
%* Build the query;
query = cat(" INSERT INTO &out SELECT ", column(1));
do j = 2 to &ncols;
query = catx(", ", query, column(j));
end;
rownumber = 1 + floor(&nrows * rand("uniform"));
query = catx(" ", query, "FROM &lib..&ds(firstobs=", rownumber,
"obs=", rownumber, ");");
put query;
end;
put "QUIT;";
run;

%include "&outfile" / source2;

%mend;

调用宏

%DrawSample(lib=work, ds=mymatrix, out=matrixSample, outfile=myRandomSample.sas, n=1000);

瞧瞧!

关于sas - SAS中有放回的随机有序抽样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37319371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com