@bayoote wrote:
Hi All,
I have a large dataset and I want to do the interpolation for each group based on four variables. I have split the datasets into multiple datasets. Each dataset is a group that I will do the interpolation. However, I still need to get the number of observations for each dataset and save them as macro variables in order to do the interpolation.
As others already wrote it's likely much better to keep everything in a single data set and use By Group processing. One could call this best practice.
It also helps if you don't only post your code but also some sample data and especially the error/warning you get in the log.
Here your code amended with sample data and issues fixed.
/* create sample data */
data have;
do group=1 to 2;
do product='a';
do test=1 to 1;
do condition='x';
do x=1 to 5;
ign=1;
y=ceil(ranuni(1)*10);
output;
end;
end;
end;
end;
end;
stop;
run;
/*split my dataset to multiple datasets based on the four variables*/
data count;
set have end=end;
by group product test condition;
if first.condition then
do;
count+1;
call symputx(cats('groupcnt',count),count);
end;
if end then
call symputx('numgroups',count);
run;
%macro createit;
%do i=1 %to &numgroups;
data new_&&groupcnt&i;
set count;
where count=&&groupcnt&i;
run;
%end;
%mend createit;
/* get the number of rows in each dataset and save them as macro variables*/
%macro get_obs;
%do i=1 %to &numgroups;
data _null_;
set Rong.new_&&groupcnt&i NOBS=size&i;
call symputx("macvar&i",size&i,'g');
stop;
run;
%end;
%mend;
/* do interpolation for each dataset*/
%macro interpolation;
%do i=1 %to &numgroups;
proc sort data=new_&&groupcnt&i;
by IGN;
run;
proc transreg data=new_&&groupcnt&i;
model identity(Y)=spline(X /degree=1 nknots=%eval(&&macvar&i-2));
output out=prediction&i predicted;
run;
%end;
%mend interpolation;
/* call the macros */
options mprint;
%createit;
libname rong (work);
%get_obs;
%interpolation;
The issues were (already fixed in above code):
1. scope of macro variable
WARNING: Apparent symbolic reference MACVAR1 not resolved.
You get this warning because macro variables MACVAR<n> get created in macro %get_obs with a local scope. They only exist with the macro and you can't use them in macro %interpolation.
To create the variables with a global scope use the 'g' option in the call symputx() function.
2. Calculations on macro level require %EVAL() or %SYSEVALF() function.
98 ! identity(Y)=spline(X /degree=1 nknots=&&macvar&i-2); output out=prediction&i predicted; run;
__
22
ERROR 22-322: Syntax error, expecting one of the following: ), AFTER, AIC, AICC, ALPHA, CENTER, CLL, CONVENIENT, CPREFIX, CV,
DEGREE, EFFECTS, EVENLY, EXKNOTS, GCV, GEOMETRICMEAN, KNOTS, LAMBDAS, LPREFIX, NKNOTS, ORDER, ORIGINAL, ORTHOGONAL,
PARAMETER, RANGE, REFLECT, SBC, SEPARATORS, SM, STANDORTH, TSTANDARD, Z, ZERO.
... View more