Return to Snippet

Revision: 55655
at February 16, 2012 02:08 by webonomic


Initial Code
data subset;
 SampleSize = round(.1*numberObs,1);
 Left = numberObs;
 do i = 1 to numberObs;
    set sashelp.shoes point = i nobs = numberObs;
    if uniform(0) le SampleSize/Left then
    do;  /* select the observations */
       SampleSize + (-1); /* decrement needed by 1 */
       output;
    end; /* select the observations */
    Left +(-1); /* decrement remaining obs by 1 */
 end;
 stop;
run;

Initial URL
http://www.sascommunity.org/wiki/Tip_of_the_Day:February_15

Initial Description
You can use the POINT option of the SET statement to efficiently select a random sample of observations from a SAS data set. In addiiton to any statistical reasons for drawing a random sample, the technique is also useful to create test data from a large file. The program shown here efficiently samples a large data set.
It reads only the observations that have been selected using the POINT option.
You assign a variable that is the desired sample size. The example here selects a 10% sample. You can also assign a fixed value (e.g., 100).
The DO loop is iterated for each observation
The uniform function is compared to the percent of observations still to be selected
If the observation is selected, it is read and output and the number needed is decremented by 1
Regardless the number of observations left is reduced by 1
The STOP statement is very important as without it, the DATA step will enter an infinite loop.
This technique works by modifying the threshold as observations are read and selected. Every observation has the same probability of being selected so the technique is statistically valid (If you are a statistician, you probably know this. If not, the analogy of drawing straws is the logic behind this.)

Initial Title
Selecting a Random Sample of Observations

Initial Tags


Initial Language
SAS