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. 

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

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