Whew - okay, point taken. I apologize; I hadn't seen your previous post. I've been looking over the documentation you refer to, and I'm working on understanding distinction between how and when macros are processed (versus normal SAS code), and what that means for the process I'm trying to implement.....
Backing up and simplifying as you suggest, I separated out the stages, tried to use variables rather than macro variables wherever possible, and omit the loops except where I know they work as intended. (I don't actually know how to avoid using loops in %do / %end form [such as using do / end instead], and these steps function as intended, so I left these in.)
I know the first portion of the code (which just generates empty variables for use later, and calculates cumulative probabilities) works, so I've separated that out:
%macro c;
Data FOS.ACChoiceModelTest; set out_scores;
%let cum_p = 0;
%do i = &min %to &max;
cum_p_&i = &cum_p + P_&i; /* Calculate cumulative probabilities */
%let cum_p = &cum_p + P_&i;
%end;
%do i = 1 %to 10;
ac_cat_&i = .; /* Create empty variables to hold new aircraft selections */
%end;
run;
%mend c;
%c
What I'm stuck on now is how to change the value of a variable, or access its values for calculations, if the name of that variable depends upon the value of a macro variable. So in the following code, everything works as intended, except the last two lines. I know that the macro variables "f" and "n" have been successfully initialized, since the variable "test_f" and "test_n" take on the correct values, but I can see from the log that "ac_cat_&f" is read as "ac_cat_", and "load_factor_&n" is read as "load_factor_". Why is it not permitted to use macro variables when referring to an existing variable? I don't understand what I'm doing wrong here.....
Data FOS.ACChoiceModelTest2; set FOS.ACChoiceModelTest;
flight_counter = 0; /* Initialize counter: the number of added flights */
/* do while(condition = 1) ; */
if condition = 1 then do ;
flight_counter = flight_counter + 1; /* Add a flight */
n = 0; /* Variable to store the chosen AC category */
%let rand = uniform(-1); /* Random number draw */
%macro d;
%do i = 0 %to 6;
n = n + (&rand >= cum_p_&i); /* Use the random number draw to find the chosen SC category */
%end;
%mend d;
%d
call symput('f', flight_counter);
call symput('n', n);
test_f = &f;
test_n = &n;
ac_cat_&f = n;
load_factor_test = load_factor_&n;
end;
run;
Thank you very much for your help, Cynthia.
... View more