目标:从整个数据集中抽取50个观察结果(允许/不允许重复)
如何确定是否允许重复或不重复?
data carsample;
do i = 1 to 50;
slice = int(nObs*ranuni(123456));
set sashelp.cars point=slice nobs = nObs;
end;
stop;
run;
答案 0 :(得分:2)
您提供的代码是随机抽样方法的实施,称为" 带有替换的简单随机抽样(无限制随机抽样)"。
在这种方法中,可能会出现重复。要限制重复项,您必须通过在数据集" carsample"中编写另一段代码来删除它们。
我们还有一个有效的抽样方法,这不允许重复记录。它是" 简单的随机抽样,没有替换"。
现在回答你的问题,
例如:point = 9将从源数据集中选择第9个观测值。
假设我们在sashelp.cars中有500个观察结果。
slice = int(nObs*ranuni(123456));
set sashelp.cars point=slice nobs = nObs;
如果给出100,则代替nObs,您将获得1到100之间的随机数(切片变量),这反过来将仅获取源数据集中介于1和100之间的记录。
如果你给1000,你将获得1到1000之间的随机数(切片变量),这反过来将尝试获取源数据集中介于1和1000之间的记录。但是我们只有500个观测值。
因此,我们必须在源数据集中提供确切的观察数量,并使用 nobs = 。
注意:您还可以使用proc surveyselect
等程序答案 1 :(得分:1)
使用proc surveyselect
,您可以更明确地控制所使用的采样方法,例如
/*Default: simple random sampling (repeats not allowed)*/
proc surveyselect
data = sashelp.cars
out = carsample
n = 50
;
run;
/*Unrestricted random sampling (repeats allowed)*/
proc surveyselect
data = sashelp.cars
out = carsample
n = 50
method = urs
;
run;