BookmarkSubscribeRSS Feed
tumul
Calcite | Level 5

Hi guys ! I am new to sas and need some help in simulation. I have a dataset that looks like this (name : simul_input)

ID   col_A   col_B   col_C
101    2        80        20
102    4       40         22
103    5       20         25
104    3       90         20
105    8       10         22
.
.
.
.
100 data points

 

step 1) The simulation takes col_C and and a random number (rand_no) and computes another number N (N = col_C*rand_no)

step 2) Now, for each step of my simulation i need to select N elements at random (without replacement) from col_B and compute their sum, and then store this sum in a  separate dataset (lets say : simul_output).

 

so if I run this simulation say 10,000 times, my 'simul_output' should contain 10,000 entries.

(in general : If I am running the simulation for N number of times, step1 and step2 will take place N times. and 'simul_data' will contain N entries)

 

I have a pretty standard code in sas which lets me select  "k" random entries from a variable with "n" observation

here is the code :

data want(keep = id x);
   retain k 5;
   set have nobs = n;
   if rand ("uniform") < k/n then do;
      output;
      k = k-1;
   end;
   n = n-1;
run;

(code obtained from : https://sasnrd.com/sas-random-sampling-without-replacement/)

4 REPLIES 4
PaigeMiller
Diamond | Level 26

If I take your title "How to perform simulation in SAS" and then paste it into my favorite internet search engine, lots of answers appear.

--
Paige Miller
Ksharp
Super User
I don't understand if you are using "(without replacement)" , that stands for N<=100 .
How do you make sure "N = col_C*rand_no" <=100 ?
How do you define "rand_no"? it is uniform random or integer random ?
tumul
Calcite | Level 5

N will always be <= 100 !....it is something like N = min(100, some function of (col_C*rand_no)) [I did not want to get into the idea behind the computation of N] 

Yes ! the rand_no is a uniform random

Ksharp
Super User

You need calling @Rick_SAS 

Here is an example if you have SAS/IML .

data have;
input ID   col_A   col_B   col_C;
cards;
101    2        80        20
102    4       40         22
103    5       20         25
104    3       90         20
105    8       10         22
101    2        80        20
102    4       40         22
103    5       20         25
104    3       90         20
105    8       10         22
101    2        80        20
102    4       40         22
103    5       20         25
104    3       90         20
105    8       10         22
104    3       90         20
105    8       10         22
101    2        80        20
102    4       40         22
103    5       20         25
104    3       90         20
105    8       10         22
102    4       40         22
103    5       20         25
104    3       90         20
105    8       10         22
;

%let n_simulation=10000;

proc iml;
use have nobs nobs;
read all var _all_ ;
close;
want=j(&n_simulation.,1,.);
call randseed(12345678);

do i=1 to &n_simulation.;
  call randgen(rand_no,'uniform');
  N=min(nobs,int(sample(col_C,1)*rand_no)+1); 
  want[i]=sample(col_B,N,'wor')[:];
end;

create want var{want};
append;
close;
quit;

 

Edited: Adding MIN() function. 

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 4 replies
  • 1419 views
  • 2 likes
  • 3 in conversation