澄清使用set语句

时间:2015-08-26 09:08:52

标签: sas

目标:从整个数据集中抽取50个观察结果(允许/不允许重复)

  1. 我不了解以下脚本的nObs用法
  2. 如何确定是否允许重复或不重复?

    data carsample;
    do i = 1 to 50;
    slice = int(nObs*ranuni(123456));
    set sashelp.cars point=slice nobs = nObs; 
    end; 
    stop;
    run;
    

2 个答案:

答案 0 :(得分:2)

您提供的代码是随机抽样方法的实施,称为" 带有替换的简单随机抽样(无限制随机抽样)"。

在这种方法中,可能会出现重复。要限制重复项,您必须通过在数据集" carsample"中编写另一段代码来删除它们。

我们还有一个有效的抽样方法,这不允许重复记录。它是" 简单的随机抽样,没有替换"。

现在回答你的问题,

  1. 给定数据集sashelp.cars,我们必须选择50个样本观察。在代码中,我们使用point =来选择特定的观察。
  2. 例如: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 =

    1. 如上所述,您可以删除重复项,方法是编写代码以删除重复项,或者使用"简单的随机抽样,无需替换"方法
    2. 注意:您还可以使用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;