0
votes

I am following a published method to identify matched cases. I am getting the following error

 ERROR: No matching %MACRO statement for this %MEND statement.
 WARNING: Apparent invocation of macro MATCH not resolved.
 137        %MEND MATCH;
 138        
 139        %MATCH (g.ps_match,Match4,scase4,scontrol4, abuser, 0.0001);
            _
            180

 ERROR 180-322: Statement is not valid or it is used out of proper order.

How do I correctly call the macro? I am using SAS University Edition.

The method is from http://www2.sas.com/proceedings/sugi25/25/po/25p225.pdf

Part 2: Perform the Match The next part of the macro program performs the match and outputs the matched pairs. First, the cases data set is selected. Curob is used to keep track of the current case. Matchto is used to identify matched pairs of cases and controls. Start and oldi are initialized to control processing of the controls data set DO loop.

data &lib..&matched.
(drop=Cmatch randnum aprob cprob start
oldi curctrl matched);
set &lib..&SCase. ;
curob + 1;
matchto = curob;
if curob = 1 then do;
start = 1;
oldi = 1;
end;

Next, the controls data set is selected. Processing starts at the first unmatched observation. The data set is searched until a match is found, or it is determined no match can be made. Error checking is performed to avoid an infinite loop. Curctrl is used to keep track of current control.

DO i = start to n;
set &lib..&Scontrol. point = i nobs = n;
if i gt n then goto startovr;
if _Error_ = 1 then abort;
curctrl = i;

If the propensity score of the current case (aprob) matches the propensity score of the current control (cprob), then a match was found. Update Cmatch to 1=Yes. Output the control. Update matched to keep track of last matched control. Exit the DO loop. If the propensity score of the current control is greater than the propensity score of the current case, then no match will be found for the current case. Stop the DO loop processing.

if aprob = cprob then
do;
Cmatch = 1;
output &lib..&matched.;
matched = curctrl;
goto found;
end;
else if cprob gt aprob then
goto nextcase;
startovr: if i gt n then
goto nextcase;
END; 

/* end of DO LOOP */

nextcase:
if Cmatch=0 then start = oldi;
found:
if Cmatch = 1 then do;
oldi = matched + 1;
start = matched + 1;
 set &lib..&SCase. point = curob;
output &lib..&matched.;
end;
retain oldi start;
if _Error_=1 then _Error_=0;
run;
%MEND MATCH;

MACRO MATCH CALL STATEMENT The following are call statements to the macro program MATCH. The first performs a 4-digit match; the second performs a 3-digit match.

%MATCH(STUDY,Propen,Match4,SCase4,
SContrl4,Interven,.0001);
%MATCH(STUDY,Propen,Match3,SCase3,
SContrl3,Interven,.001);
1
ERROR: No matching %MACRO statement for this %MEND statement. indicates the amount of macro code you copied from the paper was not complete. Update the question to show the complete SAS code submitted for the macro MATCHRichard
does your macro code start with something like %macro match(. Because the error suggests that you do not have any macro named match to call.samkart

1 Answers

2
votes

Presumably, you didn't include the beginning of the macro (i.e., the %MACRO MATCH(... portion, earlier in the paper). This is a macro, it's not intended to be run in pieces the way it's written - you need to include all of the code from %MACRO MATCH to %MEND and then the calls.