<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Issue when running a macro for propensity score in Statistical Procedures</title>
    <link>https://communities.sas.com/t5/Statistical-Procedures/Issue-when-running-a-macro-for-propensity-score/m-p/284067#M14989</link>
    <description>&lt;P&gt;Hello! I am running the following macro&amp;nbsp;for my propensity score matching which I have copy pasted from this code published online - &lt;A href="http://www2.sas.com/proceedings/sugi29/165-29.pdf" target="_blank"&gt;http://www2.sas.com/proceedings/sugi29/165-29.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;What this code essentially does is generates&amp;nbsp;propensity scores in the first part of the logistic regression and the macro then assigns cases to controls.&amp;nbsp;Based on the number of controls one chooses to assign to each case, it will assing one control, two controls or three controls.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This is the code -&amp;nbsp;&lt;/P&gt;&lt;P&gt;ods graphics on;&lt;/P&gt;&lt;P&gt;proc logistic data = aim1.propensity_group1_step10 plots(maxpoints = none) outest=betas;&lt;BR /&gt;model oo&amp;nbsp;(event = '1') = age gender CCI_score sum_ED sum_Inpatient sum_Outpatient sum_Others phar_count&amp;nbsp;/ lackfit outroc=roc1;&lt;BR /&gt;;&lt;BR /&gt;output out= aim1.propen prob=prob ;&lt;BR /&gt;title 'logistic regression for Group 1';&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;ods graphics off;&lt;/P&gt;&lt;P&gt;/* Call Macro and Perform 1:1 Match */&lt;BR /&gt;%OneToManyMTCH(aim1,propen,overdose,encrypted_mbr,Matches_1,1);&lt;/P&gt;&lt;P&gt;/* Call Macro and Perform 1:2 Match */&lt;BR /&gt;%OneToManyMTCH(aim1,propen,overdose,encrypted_mbr,Matches_2,2);&lt;/P&gt;&lt;P&gt;/* Call Macro and Perform 1:3 Match */&lt;BR /&gt;%OneToManyMTCH(aim1,propen,overdose,encrypted_mbr,Matches_3,3);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/* ***************************************** */&lt;BR /&gt;/* ***************************************** */&lt;BR /&gt;/* Matching Macro */&lt;BR /&gt;/* ***************************************** */&lt;BR /&gt;/* ***************************************** */&lt;BR /&gt;%MACRO OneToManyMTCH (&lt;BR /&gt;Lib, /* Library Name */&lt;BR /&gt;Dataset, /* Data set of all patients */&lt;BR /&gt;depend, /* Dependent variable that indicates Case or Control */&lt;BR /&gt;/* Code 1 for Cases, 0 for Controls */&lt;BR /&gt;PatientN, /* Patient ID */&lt;BR /&gt;matches, /* Output data set of matched pairs */&lt;BR /&gt;NoContrls); /* Number of controls to match to each case */&lt;/P&gt;&lt;P&gt;/* ********************* */&lt;BR /&gt;/* Macro to Create the Case and Control Data sets */&lt;BR /&gt;/* ********************* */&lt;BR /&gt;%MACRO INITCC(CaseAndCtrls,digits);&lt;BR /&gt;data tcases (drop=cprob)&lt;BR /&gt;tctrl (drop=aprob) ;&lt;BR /&gt;set &amp;amp;CaseAndCtrls. ;&lt;BR /&gt;/* Create the data set of Controls */&lt;BR /&gt;if &amp;amp;depend. = 0 and prob ne . then&lt;BR /&gt;do;&lt;BR /&gt;cprob = Round(prob,&amp;amp;digits.);&lt;BR /&gt;Cmatch = 0;&lt;BR /&gt;Length RandNum 8;&lt;BR /&gt;RandNum=ranuni(1234567);&lt;BR /&gt;Label RandNum='Uniform Randomization Score';&lt;BR /&gt;output tctrl;&lt;BR /&gt;end;&lt;BR /&gt;/* Create the data set of Cases */&lt;BR /&gt;else if &amp;amp;depend. = 1 and prob ne . then&lt;BR /&gt;do;&lt;BR /&gt;Cmatch = 0;&lt;BR /&gt;aprob =Round(prob,&amp;amp;digits.);&lt;BR /&gt;output tcases;&lt;BR /&gt;end;&lt;BR /&gt;run;&lt;BR /&gt;%SORTCC;&lt;BR /&gt;%MEND INITCC;&lt;BR /&gt;/* ********************* */&lt;BR /&gt;/* Macro to sort the Cases and Controls data set */&lt;BR /&gt;/* ********************* */&lt;BR /&gt;%MACRO SORTCC;&lt;BR /&gt;proc sort data=tcases out=&amp;amp;LIB..Scase;&lt;BR /&gt;by prob;&lt;BR /&gt;run;&lt;BR /&gt;proc sort data=tctrl out=&amp;amp;LIB..Scontrol;&lt;BR /&gt;by prob randnum;&lt;BR /&gt;run;&lt;BR /&gt;%MEND SORTCC;&lt;BR /&gt;/* ********************* */&lt;BR /&gt;/* Macro to Perform the Match */&lt;BR /&gt;/* ********************* */&lt;BR /&gt;%MACRO MATCH (MATCHED,DIGITS);&lt;BR /&gt;data &amp;amp;lib..&amp;amp;matched. (drop=Cmatch randnum aprob cprob start oldi curctrl matched);&lt;BR /&gt;/* select the cases data set */&lt;BR /&gt;set &amp;amp;lib..SCase ;&lt;BR /&gt;curob + 1;&lt;BR /&gt;matchto = curob;&lt;BR /&gt;if curob = 1 then do;&lt;BR /&gt;start = 1;&lt;BR /&gt;oldi = 1;&lt;BR /&gt;end;&lt;BR /&gt;/* select the controls data set */&lt;BR /&gt;DO i = start to n;&lt;BR /&gt;set &amp;amp;lib..Scontrol point = i nobs = n;&lt;BR /&gt;if i gt n then goto startovr;&lt;BR /&gt;if _Error_ = 1 then abort;&lt;BR /&gt;curctrl = i;&lt;BR /&gt;/* output control if match found */&lt;BR /&gt;if aprob = cprob then&lt;BR /&gt;do;&lt;BR /&gt;Cmatch = 1;&lt;BR /&gt;output &amp;amp;lib..&amp;amp;matched.;&lt;BR /&gt;matched = curctrl;&lt;BR /&gt;goto found;&lt;BR /&gt;end;&lt;BR /&gt;/* exit do loop if out of potential matches */&lt;BR /&gt;else if cprob gt aprob then&lt;BR /&gt;goto nextcase;&lt;BR /&gt;startovr: if i gt n then&lt;BR /&gt;goto nextcase;&lt;BR /&gt;END; /* end of DO LOOP */&lt;BR /&gt;/* If no match was found, put pointer back*/&lt;BR /&gt;nextcase:&lt;BR /&gt;if Cmatch=0 then start = oldi;&lt;BR /&gt;/* If a match was found, output case and increment pointer */&lt;BR /&gt;found:&lt;BR /&gt;if Cmatch = 1 then do;&lt;BR /&gt;oldi = matched + 1;&lt;BR /&gt;start = matched + 1;&lt;BR /&gt;set &amp;amp;lib..SCase point = curob;&lt;BR /&gt;output &amp;amp;lib..&amp;amp;matched.;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;retain oldi start;&lt;BR /&gt;if _Error_=1 then _Error_=0;&lt;BR /&gt;run;&lt;BR /&gt;/* get files of unmatched cases and controls */&lt;BR /&gt;proc sort data=&amp;amp;lib..scase out=sumcase;&lt;BR /&gt;by encrypted_mbr;&lt;BR /&gt;run;&lt;BR /&gt;proc sort data=&amp;amp;lib..scontrol out=sumcontrol;&lt;BR /&gt;by encrypted_mbr;&lt;BR /&gt;run;&lt;BR /&gt;proc sort data=&amp;amp;lib..&amp;amp;matched. out=smatched (keep=encrypted_mbr matchto);&lt;BR /&gt;by encrypted_mbr;&lt;BR /&gt;run;&lt;BR /&gt;data tcases (drop=matchto);&lt;BR /&gt;merge sumcase(in=a) smatched;&lt;BR /&gt;by encrypted_mbr;&lt;BR /&gt;if a and matchto = . ;&lt;BR /&gt;cmatch = 0;&lt;BR /&gt;aprob =Round(prob,&amp;amp;digits.);&lt;BR /&gt;run;&lt;BR /&gt;data tctrl (drop=matchto);&lt;BR /&gt;merge sumcontrol(in=a) smatched;&lt;BR /&gt;by encrypted_mbr;&lt;BR /&gt;if a and matchto = . ;&lt;BR /&gt;cmatch = 0;&lt;BR /&gt;cprob = Round(prob,&amp;amp;digits.);&lt;BR /&gt;run;&lt;BR /&gt;%SORTCC&lt;BR /&gt;%MEND MATCH;&lt;BR /&gt;/* ********************* */&lt;BR /&gt;/* Macro to call Macro MATCH for each of the 8-digit to 1-digit matchs */&lt;BR /&gt;/* ********************* */&lt;BR /&gt;%MACRO CallMATCH;&lt;BR /&gt;/* Do a 8-digit match */&lt;BR /&gt;/*%MATCH(Match8,.0000001);*/&lt;BR /&gt;/* Do a 7-digit match on remaining unmatched*/&lt;BR /&gt;/*%MATCH(Match7,.000001);*/&lt;BR /&gt;/* Do a 6-digit match on remaining unmatched*/&lt;BR /&gt;/*%MATCH(Match6,.00001);*/&lt;BR /&gt;/* Do a 5-digit match on remaining unmatched*/&lt;BR /&gt;%MATCH(Match5,.0001);&lt;BR /&gt;/* Do a 4-digit match on remaining unmatched */&lt;BR /&gt;%MATCH(Match4,.001);&lt;BR /&gt;/* Do a 3-digit match on remaining unmatched */&lt;BR /&gt;%MATCH(Match3,.01);&lt;BR /&gt;/* Do a 2-digit match on remaining unmatched */&lt;BR /&gt;%MATCH(Match2,.1);&lt;BR /&gt;/* Do a 1-digit match on remaining unmatched */&lt;BR /&gt;%MATCH(Match1,.1);&lt;BR /&gt;%MEND CallMATCH;&lt;BR /&gt;/* ********************* */&lt;BR /&gt;/* Macro to Merge all the matches files into one file */&lt;BR /&gt;/* ********************* */&lt;BR /&gt;%MACRO MergeFiles(MatchNo);&lt;BR /&gt;data &amp;amp;matches.&amp;amp;MatchNo. (drop = matchto);&lt;BR /&gt;set &amp;amp;lib..match5(in=a) &amp;amp;lib..match4(in=b) &amp;amp;lib..match3(in=c)&lt;BR /&gt;&amp;amp;lib..match2(in=d) &amp;amp;lib..match1(in=e);&lt;BR /&gt;if b then matchto=matchto + 100000;&lt;BR /&gt;if c then matchto=matchto + 10000000;&lt;BR /&gt;if d then matchto=matchto + 1000000000;&lt;BR /&gt;if e then matchto=matchto + 100000000000;&lt;BR /&gt;run;&lt;BR /&gt;/*set &amp;amp;lib..match8(in=a) &amp;amp;lib..match7(in=b) &amp;amp;lib..match6(in=c) &amp;amp;lib..match5(in=d)&lt;BR /&gt;&amp;amp;lib..match4(in=e)&lt;BR /&gt;&amp;amp;lib..match3(in=f) &amp;amp;lib..match2(in=g) &amp;amp;lib..match1(in=h);&lt;BR /&gt;if a then match_&amp;amp;MatchNo. = matchto;&lt;BR /&gt;if b then match_&amp;amp;MatchNo. = matchto + 10000;&lt;BR /&gt;if c then match_&amp;amp;MatchNo. = matchto + 100000;&lt;BR /&gt;if d then match_&amp;amp;MatchNo. = matchto + 1000000;&lt;BR /&gt;if e then match_&amp;amp;MatchNo. = matchto + 10000000;&lt;BR /&gt;if f then match_&amp;amp;MatchNo. = matchto + 100000000;&lt;BR /&gt;if g then match_&amp;amp;MatchNo. = matchto + 1000000000;&lt;BR /&gt;if h then match_&amp;amp;MatchNo. = matchto + 10000000000;&lt;BR /&gt;run;*/&lt;BR /&gt;%MEND MergeFiles;&lt;BR /&gt;/* ******************************* */&lt;BR /&gt;/* ******************************* */&lt;BR /&gt;/* Perform the initial 1:1 Match */&lt;BR /&gt;/* ******************************* */&lt;BR /&gt;/* ******************************* */&lt;BR /&gt;/* Create file of cases and controls */&lt;BR /&gt;%INITCC(&amp;amp;LIB..&amp;amp;dataset.,.00000001);&lt;BR /&gt;/* Perform the 8-digit to 1-digit matches */&lt;BR /&gt;%CallMATCH;&lt;BR /&gt;/* Merge all the matches files into one file */&lt;BR /&gt;%MergeFiles(1)&lt;BR /&gt;/* ********************************* */&lt;BR /&gt;/* ********************************* */&lt;BR /&gt;/* Perform the remaining 1:N Matches */&lt;BR /&gt;/* ********************************* */&lt;BR /&gt;/* ********************************* */&lt;BR /&gt;%IF &amp;amp;NoContrls. gt 1 %Then %DO;&lt;BR /&gt;%DO i = 2 %TO &amp;amp;NoContrls.;&lt;/P&gt;&lt;P&gt;%let Lasti=%eval(&amp;amp;i. - 1);&lt;/P&gt;&lt;P&gt;/* ********** */&lt;BR /&gt;/* Start with Cases from the last Matched Cases file and the remaining Un-Matched */&lt;BR /&gt;/* Controls. NOTE: The Unmatched Controls file (Scontrol) is created at end of the */&lt;BR /&gt;/* previous match */&lt;BR /&gt;/* Select the Matched Cases from the last Matched File */&lt;BR /&gt;data &amp;amp;LIB..Scase;&lt;BR /&gt;set &amp;amp;matches.&amp;amp;Lasti.;&lt;BR /&gt;where &amp;amp;Depend. = 1;&lt;BR /&gt;run;&lt;BR /&gt;/* ********** */&lt;BR /&gt;/* Perform the 8-1 digit matches between Matched Cases and the Unmatched Controls */&lt;BR /&gt;%CallMATCH;&lt;BR /&gt;/* ********** */&lt;BR /&gt;&lt;STRONG&gt;/* &lt;U&gt;Merge the 8-digit to 1-digit matches files into one file&lt;/U&gt; */&lt;/STRONG&gt;&lt;BR /&gt;%MergeFiles (&amp;amp;i.)&lt;/P&gt;&lt;P&gt;%DO m=1 %TO &amp;amp;Lasti.;&lt;BR /&gt;data &amp;amp;matches.&amp;amp;i;&lt;BR /&gt;set &amp;amp;matches.&amp;amp;i.;&lt;BR /&gt;if &amp;amp;Depend.=0 then &lt;STRONG&gt;Match&lt;/STRONG&gt;_&amp;amp;m. = .;&lt;BR /&gt;run;&lt;BR /&gt;%END;&lt;/P&gt;&lt;P&gt;/* ********** */&lt;BR /&gt;/* Determine which OLD Controls correspond to the kept Cases */&lt;BR /&gt;%DO c = 1 %TO &amp;amp;Lasti.;&lt;BR /&gt;/* Select the KEPT Cases */&lt;BR /&gt;proc sort data=&amp;amp;matches.&amp;amp;i. out=skeepcases (keep = Match_&amp;amp;c.);&lt;BR /&gt;by Match_&amp;amp;c.;&lt;BR /&gt;where &amp;amp;Depend. = 1;&lt;BR /&gt;run;&lt;BR /&gt;/* Get the OLD Controls */&lt;BR /&gt;proc sort data = &amp;amp;matches.&amp;amp;Lasti. out = soldcontrols&amp;amp;c.;&lt;BR /&gt;by Match_&amp;amp;c.;&lt;BR /&gt;where &amp;amp;Depend. = 0 and Match_&amp;amp;c. ne . ;&lt;BR /&gt;run;&lt;BR /&gt;/* Get the OLD Controls that correspond to the kept Cases */&lt;BR /&gt;data keepcontrols&amp;amp;c.;&lt;BR /&gt;merge skeepcases (in = a) soldcontrols&amp;amp;c. (in = b);&lt;BR /&gt;by Match_&amp;amp;c.;&lt;BR /&gt;if a;&lt;BR /&gt;run;&lt;BR /&gt;%END;&lt;BR /&gt;/* ********** */&lt;BR /&gt;/* Combine all the OLD Controls into one file */&lt;BR /&gt;data keepcontrols;&lt;BR /&gt;set keepcontrols1 (obs=0);&lt;BR /&gt;run;&lt;BR /&gt;%DO k = 1 %TO &amp;amp;Lasti.;&lt;BR /&gt;data keepcontrols;&lt;BR /&gt;set keepcontrols keepcontrols&amp;amp;k.;&lt;BR /&gt;run;&lt;BR /&gt;%END;&lt;BR /&gt;/* ********** */&lt;BR /&gt;/* Append the OLD matched Controls to the new file of matched cases and controls */&lt;BR /&gt;data &amp;amp;matches.&amp;amp;i.;&lt;BR /&gt;set &amp;amp;matches.&amp;amp;i. keepcontrols;&lt;BR /&gt;run;&lt;BR /&gt;/* ********** */&lt;BR /&gt;/* If there are more matches to be made, add the previously matched, but not kept, */&lt;BR /&gt;/* controls back into the pool of unmatched controls */&lt;BR /&gt;%if &amp;amp;i. lt &amp;amp;NoContrls. %then %do;&lt;/P&gt;&lt;P&gt;%DO z = 1 %TO &amp;amp;Lasti.;&lt;BR /&gt;/* Select all the KEPT Cases */&lt;BR /&gt;proc sort data=&amp;amp;matches.&amp;amp;i. out=skeepcases (keep = Match_&amp;amp;z.);&lt;BR /&gt;by Match_&amp;amp;z.;&lt;BR /&gt;where &amp;amp;Depend. = 1;&lt;BR /&gt;run;&lt;BR /&gt;/* Select all the OLD Controls */&lt;BR /&gt;proc sort data = &amp;amp;matches.&amp;amp;Lasti. out = soldcontrols&amp;amp;z.;&lt;BR /&gt;by Match_&amp;amp;z.;&lt;BR /&gt;where &amp;amp;Depend. = 0 and Match_&amp;amp;z. ne .;&lt;BR /&gt;run;&lt;BR /&gt;/* Keep the OLD Controls that correspond to the NOT KEPT Cases */&lt;BR /&gt;/* Drop the previuos Match_X variable */&lt;BR /&gt;data AddBackControls&amp;amp;z. (drop = Match_&amp;amp;z.);&lt;BR /&gt;merge skeepcases (in = a) soldcontrols&amp;amp;z. (in = b);&lt;BR /&gt;by Match_&amp;amp;z.;&lt;BR /&gt;if b and not a;&lt;BR /&gt;run;&lt;BR /&gt;%END; /* End DO */&lt;BR /&gt;/* Drop the previuos Match_X variable */&lt;BR /&gt;data &amp;amp;LIB..Scontrol (drop = Match_&amp;amp;lasti. );&lt;BR /&gt;set &amp;amp;LIB..Scontrol;&lt;BR /&gt;run;&lt;BR /&gt;/* Append */&lt;BR /&gt;%DO y = 1 %TO &amp;amp;Lasti.;&lt;BR /&gt;data &amp;amp;LIB..Scontrol;&lt;BR /&gt;set &amp;amp;LIB..Scontrol AddBackControls&amp;amp;y.;&lt;BR /&gt;run;&lt;BR /&gt;%END; /* End DO */&lt;BR /&gt;%end; /* End IF */&lt;/P&gt;&lt;P&gt;%END; /* End Main DO */&lt;BR /&gt;%END; /* End Main IF */&lt;BR /&gt;/* ************************************* */&lt;BR /&gt;/* ************************************* */&lt;BR /&gt;/* Save the final matched pairs data set */&lt;BR /&gt;/* ************************************* */&lt;BR /&gt;/* ************************************* */&lt;BR /&gt;/* Sort file by Treatment Variable */&lt;BR /&gt;proc sort data=&amp;amp;matches.&amp;amp;NoContrls. out = &amp;amp;lib..&amp;amp;matches.;&lt;BR /&gt;by &amp;amp;depend.;&lt;BR /&gt;run;&lt;BR /&gt;%MEND OneToManyMTCH;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;The problem is - in the section that I have bolded, the work Match in "Match_&amp;amp;m." appears as red and therefore, the macro does not run as it is supposed to. I also tried re-typing that section but I am not sure what is going wrong.&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I would greatly appreciate any help with this!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you.&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 15 Jul 2016 14:01:49 GMT</pubDate>
    <dc:creator>batulelec</dc:creator>
    <dc:date>2016-07-15T14:01:49Z</dc:date>
    <item>
      <title>Issue when running a macro for propensity score</title>
      <link>https://communities.sas.com/t5/Statistical-Procedures/Issue-when-running-a-macro-for-propensity-score/m-p/284067#M14989</link>
      <description>&lt;P&gt;Hello! I am running the following macro&amp;nbsp;for my propensity score matching which I have copy pasted from this code published online - &lt;A href="http://www2.sas.com/proceedings/sugi29/165-29.pdf" target="_blank"&gt;http://www2.sas.com/proceedings/sugi29/165-29.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;What this code essentially does is generates&amp;nbsp;propensity scores in the first part of the logistic regression and the macro then assigns cases to controls.&amp;nbsp;Based on the number of controls one chooses to assign to each case, it will assing one control, two controls or three controls.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This is the code -&amp;nbsp;&lt;/P&gt;&lt;P&gt;ods graphics on;&lt;/P&gt;&lt;P&gt;proc logistic data = aim1.propensity_group1_step10 plots(maxpoints = none) outest=betas;&lt;BR /&gt;model oo&amp;nbsp;(event = '1') = age gender CCI_score sum_ED sum_Inpatient sum_Outpatient sum_Others phar_count&amp;nbsp;/ lackfit outroc=roc1;&lt;BR /&gt;;&lt;BR /&gt;output out= aim1.propen prob=prob ;&lt;BR /&gt;title 'logistic regression for Group 1';&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;ods graphics off;&lt;/P&gt;&lt;P&gt;/* Call Macro and Perform 1:1 Match */&lt;BR /&gt;%OneToManyMTCH(aim1,propen,overdose,encrypted_mbr,Matches_1,1);&lt;/P&gt;&lt;P&gt;/* Call Macro and Perform 1:2 Match */&lt;BR /&gt;%OneToManyMTCH(aim1,propen,overdose,encrypted_mbr,Matches_2,2);&lt;/P&gt;&lt;P&gt;/* Call Macro and Perform 1:3 Match */&lt;BR /&gt;%OneToManyMTCH(aim1,propen,overdose,encrypted_mbr,Matches_3,3);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/* ***************************************** */&lt;BR /&gt;/* ***************************************** */&lt;BR /&gt;/* Matching Macro */&lt;BR /&gt;/* ***************************************** */&lt;BR /&gt;/* ***************************************** */&lt;BR /&gt;%MACRO OneToManyMTCH (&lt;BR /&gt;Lib, /* Library Name */&lt;BR /&gt;Dataset, /* Data set of all patients */&lt;BR /&gt;depend, /* Dependent variable that indicates Case or Control */&lt;BR /&gt;/* Code 1 for Cases, 0 for Controls */&lt;BR /&gt;PatientN, /* Patient ID */&lt;BR /&gt;matches, /* Output data set of matched pairs */&lt;BR /&gt;NoContrls); /* Number of controls to match to each case */&lt;/P&gt;&lt;P&gt;/* ********************* */&lt;BR /&gt;/* Macro to Create the Case and Control Data sets */&lt;BR /&gt;/* ********************* */&lt;BR /&gt;%MACRO INITCC(CaseAndCtrls,digits);&lt;BR /&gt;data tcases (drop=cprob)&lt;BR /&gt;tctrl (drop=aprob) ;&lt;BR /&gt;set &amp;amp;CaseAndCtrls. ;&lt;BR /&gt;/* Create the data set of Controls */&lt;BR /&gt;if &amp;amp;depend. = 0 and prob ne . then&lt;BR /&gt;do;&lt;BR /&gt;cprob = Round(prob,&amp;amp;digits.);&lt;BR /&gt;Cmatch = 0;&lt;BR /&gt;Length RandNum 8;&lt;BR /&gt;RandNum=ranuni(1234567);&lt;BR /&gt;Label RandNum='Uniform Randomization Score';&lt;BR /&gt;output tctrl;&lt;BR /&gt;end;&lt;BR /&gt;/* Create the data set of Cases */&lt;BR /&gt;else if &amp;amp;depend. = 1 and prob ne . then&lt;BR /&gt;do;&lt;BR /&gt;Cmatch = 0;&lt;BR /&gt;aprob =Round(prob,&amp;amp;digits.);&lt;BR /&gt;output tcases;&lt;BR /&gt;end;&lt;BR /&gt;run;&lt;BR /&gt;%SORTCC;&lt;BR /&gt;%MEND INITCC;&lt;BR /&gt;/* ********************* */&lt;BR /&gt;/* Macro to sort the Cases and Controls data set */&lt;BR /&gt;/* ********************* */&lt;BR /&gt;%MACRO SORTCC;&lt;BR /&gt;proc sort data=tcases out=&amp;amp;LIB..Scase;&lt;BR /&gt;by prob;&lt;BR /&gt;run;&lt;BR /&gt;proc sort data=tctrl out=&amp;amp;LIB..Scontrol;&lt;BR /&gt;by prob randnum;&lt;BR /&gt;run;&lt;BR /&gt;%MEND SORTCC;&lt;BR /&gt;/* ********************* */&lt;BR /&gt;/* Macro to Perform the Match */&lt;BR /&gt;/* ********************* */&lt;BR /&gt;%MACRO MATCH (MATCHED,DIGITS);&lt;BR /&gt;data &amp;amp;lib..&amp;amp;matched. (drop=Cmatch randnum aprob cprob start oldi curctrl matched);&lt;BR /&gt;/* select the cases data set */&lt;BR /&gt;set &amp;amp;lib..SCase ;&lt;BR /&gt;curob + 1;&lt;BR /&gt;matchto = curob;&lt;BR /&gt;if curob = 1 then do;&lt;BR /&gt;start = 1;&lt;BR /&gt;oldi = 1;&lt;BR /&gt;end;&lt;BR /&gt;/* select the controls data set */&lt;BR /&gt;DO i = start to n;&lt;BR /&gt;set &amp;amp;lib..Scontrol point = i nobs = n;&lt;BR /&gt;if i gt n then goto startovr;&lt;BR /&gt;if _Error_ = 1 then abort;&lt;BR /&gt;curctrl = i;&lt;BR /&gt;/* output control if match found */&lt;BR /&gt;if aprob = cprob then&lt;BR /&gt;do;&lt;BR /&gt;Cmatch = 1;&lt;BR /&gt;output &amp;amp;lib..&amp;amp;matched.;&lt;BR /&gt;matched = curctrl;&lt;BR /&gt;goto found;&lt;BR /&gt;end;&lt;BR /&gt;/* exit do loop if out of potential matches */&lt;BR /&gt;else if cprob gt aprob then&lt;BR /&gt;goto nextcase;&lt;BR /&gt;startovr: if i gt n then&lt;BR /&gt;goto nextcase;&lt;BR /&gt;END; /* end of DO LOOP */&lt;BR /&gt;/* If no match was found, put pointer back*/&lt;BR /&gt;nextcase:&lt;BR /&gt;if Cmatch=0 then start = oldi;&lt;BR /&gt;/* If a match was found, output case and increment pointer */&lt;BR /&gt;found:&lt;BR /&gt;if Cmatch = 1 then do;&lt;BR /&gt;oldi = matched + 1;&lt;BR /&gt;start = matched + 1;&lt;BR /&gt;set &amp;amp;lib..SCase point = curob;&lt;BR /&gt;output &amp;amp;lib..&amp;amp;matched.;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;retain oldi start;&lt;BR /&gt;if _Error_=1 then _Error_=0;&lt;BR /&gt;run;&lt;BR /&gt;/* get files of unmatched cases and controls */&lt;BR /&gt;proc sort data=&amp;amp;lib..scase out=sumcase;&lt;BR /&gt;by encrypted_mbr;&lt;BR /&gt;run;&lt;BR /&gt;proc sort data=&amp;amp;lib..scontrol out=sumcontrol;&lt;BR /&gt;by encrypted_mbr;&lt;BR /&gt;run;&lt;BR /&gt;proc sort data=&amp;amp;lib..&amp;amp;matched. out=smatched (keep=encrypted_mbr matchto);&lt;BR /&gt;by encrypted_mbr;&lt;BR /&gt;run;&lt;BR /&gt;data tcases (drop=matchto);&lt;BR /&gt;merge sumcase(in=a) smatched;&lt;BR /&gt;by encrypted_mbr;&lt;BR /&gt;if a and matchto = . ;&lt;BR /&gt;cmatch = 0;&lt;BR /&gt;aprob =Round(prob,&amp;amp;digits.);&lt;BR /&gt;run;&lt;BR /&gt;data tctrl (drop=matchto);&lt;BR /&gt;merge sumcontrol(in=a) smatched;&lt;BR /&gt;by encrypted_mbr;&lt;BR /&gt;if a and matchto = . ;&lt;BR /&gt;cmatch = 0;&lt;BR /&gt;cprob = Round(prob,&amp;amp;digits.);&lt;BR /&gt;run;&lt;BR /&gt;%SORTCC&lt;BR /&gt;%MEND MATCH;&lt;BR /&gt;/* ********************* */&lt;BR /&gt;/* Macro to call Macro MATCH for each of the 8-digit to 1-digit matchs */&lt;BR /&gt;/* ********************* */&lt;BR /&gt;%MACRO CallMATCH;&lt;BR /&gt;/* Do a 8-digit match */&lt;BR /&gt;/*%MATCH(Match8,.0000001);*/&lt;BR /&gt;/* Do a 7-digit match on remaining unmatched*/&lt;BR /&gt;/*%MATCH(Match7,.000001);*/&lt;BR /&gt;/* Do a 6-digit match on remaining unmatched*/&lt;BR /&gt;/*%MATCH(Match6,.00001);*/&lt;BR /&gt;/* Do a 5-digit match on remaining unmatched*/&lt;BR /&gt;%MATCH(Match5,.0001);&lt;BR /&gt;/* Do a 4-digit match on remaining unmatched */&lt;BR /&gt;%MATCH(Match4,.001);&lt;BR /&gt;/* Do a 3-digit match on remaining unmatched */&lt;BR /&gt;%MATCH(Match3,.01);&lt;BR /&gt;/* Do a 2-digit match on remaining unmatched */&lt;BR /&gt;%MATCH(Match2,.1);&lt;BR /&gt;/* Do a 1-digit match on remaining unmatched */&lt;BR /&gt;%MATCH(Match1,.1);&lt;BR /&gt;%MEND CallMATCH;&lt;BR /&gt;/* ********************* */&lt;BR /&gt;/* Macro to Merge all the matches files into one file */&lt;BR /&gt;/* ********************* */&lt;BR /&gt;%MACRO MergeFiles(MatchNo);&lt;BR /&gt;data &amp;amp;matches.&amp;amp;MatchNo. (drop = matchto);&lt;BR /&gt;set &amp;amp;lib..match5(in=a) &amp;amp;lib..match4(in=b) &amp;amp;lib..match3(in=c)&lt;BR /&gt;&amp;amp;lib..match2(in=d) &amp;amp;lib..match1(in=e);&lt;BR /&gt;if b then matchto=matchto + 100000;&lt;BR /&gt;if c then matchto=matchto + 10000000;&lt;BR /&gt;if d then matchto=matchto + 1000000000;&lt;BR /&gt;if e then matchto=matchto + 100000000000;&lt;BR /&gt;run;&lt;BR /&gt;/*set &amp;amp;lib..match8(in=a) &amp;amp;lib..match7(in=b) &amp;amp;lib..match6(in=c) &amp;amp;lib..match5(in=d)&lt;BR /&gt;&amp;amp;lib..match4(in=e)&lt;BR /&gt;&amp;amp;lib..match3(in=f) &amp;amp;lib..match2(in=g) &amp;amp;lib..match1(in=h);&lt;BR /&gt;if a then match_&amp;amp;MatchNo. = matchto;&lt;BR /&gt;if b then match_&amp;amp;MatchNo. = matchto + 10000;&lt;BR /&gt;if c then match_&amp;amp;MatchNo. = matchto + 100000;&lt;BR /&gt;if d then match_&amp;amp;MatchNo. = matchto + 1000000;&lt;BR /&gt;if e then match_&amp;amp;MatchNo. = matchto + 10000000;&lt;BR /&gt;if f then match_&amp;amp;MatchNo. = matchto + 100000000;&lt;BR /&gt;if g then match_&amp;amp;MatchNo. = matchto + 1000000000;&lt;BR /&gt;if h then match_&amp;amp;MatchNo. = matchto + 10000000000;&lt;BR /&gt;run;*/&lt;BR /&gt;%MEND MergeFiles;&lt;BR /&gt;/* ******************************* */&lt;BR /&gt;/* ******************************* */&lt;BR /&gt;/* Perform the initial 1:1 Match */&lt;BR /&gt;/* ******************************* */&lt;BR /&gt;/* ******************************* */&lt;BR /&gt;/* Create file of cases and controls */&lt;BR /&gt;%INITCC(&amp;amp;LIB..&amp;amp;dataset.,.00000001);&lt;BR /&gt;/* Perform the 8-digit to 1-digit matches */&lt;BR /&gt;%CallMATCH;&lt;BR /&gt;/* Merge all the matches files into one file */&lt;BR /&gt;%MergeFiles(1)&lt;BR /&gt;/* ********************************* */&lt;BR /&gt;/* ********************************* */&lt;BR /&gt;/* Perform the remaining 1:N Matches */&lt;BR /&gt;/* ********************************* */&lt;BR /&gt;/* ********************************* */&lt;BR /&gt;%IF &amp;amp;NoContrls. gt 1 %Then %DO;&lt;BR /&gt;%DO i = 2 %TO &amp;amp;NoContrls.;&lt;/P&gt;&lt;P&gt;%let Lasti=%eval(&amp;amp;i. - 1);&lt;/P&gt;&lt;P&gt;/* ********** */&lt;BR /&gt;/* Start with Cases from the last Matched Cases file and the remaining Un-Matched */&lt;BR /&gt;/* Controls. NOTE: The Unmatched Controls file (Scontrol) is created at end of the */&lt;BR /&gt;/* previous match */&lt;BR /&gt;/* Select the Matched Cases from the last Matched File */&lt;BR /&gt;data &amp;amp;LIB..Scase;&lt;BR /&gt;set &amp;amp;matches.&amp;amp;Lasti.;&lt;BR /&gt;where &amp;amp;Depend. = 1;&lt;BR /&gt;run;&lt;BR /&gt;/* ********** */&lt;BR /&gt;/* Perform the 8-1 digit matches between Matched Cases and the Unmatched Controls */&lt;BR /&gt;%CallMATCH;&lt;BR /&gt;/* ********** */&lt;BR /&gt;&lt;STRONG&gt;/* &lt;U&gt;Merge the 8-digit to 1-digit matches files into one file&lt;/U&gt; */&lt;/STRONG&gt;&lt;BR /&gt;%MergeFiles (&amp;amp;i.)&lt;/P&gt;&lt;P&gt;%DO m=1 %TO &amp;amp;Lasti.;&lt;BR /&gt;data &amp;amp;matches.&amp;amp;i;&lt;BR /&gt;set &amp;amp;matches.&amp;amp;i.;&lt;BR /&gt;if &amp;amp;Depend.=0 then &lt;STRONG&gt;Match&lt;/STRONG&gt;_&amp;amp;m. = .;&lt;BR /&gt;run;&lt;BR /&gt;%END;&lt;/P&gt;&lt;P&gt;/* ********** */&lt;BR /&gt;/* Determine which OLD Controls correspond to the kept Cases */&lt;BR /&gt;%DO c = 1 %TO &amp;amp;Lasti.;&lt;BR /&gt;/* Select the KEPT Cases */&lt;BR /&gt;proc sort data=&amp;amp;matches.&amp;amp;i. out=skeepcases (keep = Match_&amp;amp;c.);&lt;BR /&gt;by Match_&amp;amp;c.;&lt;BR /&gt;where &amp;amp;Depend. = 1;&lt;BR /&gt;run;&lt;BR /&gt;/* Get the OLD Controls */&lt;BR /&gt;proc sort data = &amp;amp;matches.&amp;amp;Lasti. out = soldcontrols&amp;amp;c.;&lt;BR /&gt;by Match_&amp;amp;c.;&lt;BR /&gt;where &amp;amp;Depend. = 0 and Match_&amp;amp;c. ne . ;&lt;BR /&gt;run;&lt;BR /&gt;/* Get the OLD Controls that correspond to the kept Cases */&lt;BR /&gt;data keepcontrols&amp;amp;c.;&lt;BR /&gt;merge skeepcases (in = a) soldcontrols&amp;amp;c. (in = b);&lt;BR /&gt;by Match_&amp;amp;c.;&lt;BR /&gt;if a;&lt;BR /&gt;run;&lt;BR /&gt;%END;&lt;BR /&gt;/* ********** */&lt;BR /&gt;/* Combine all the OLD Controls into one file */&lt;BR /&gt;data keepcontrols;&lt;BR /&gt;set keepcontrols1 (obs=0);&lt;BR /&gt;run;&lt;BR /&gt;%DO k = 1 %TO &amp;amp;Lasti.;&lt;BR /&gt;data keepcontrols;&lt;BR /&gt;set keepcontrols keepcontrols&amp;amp;k.;&lt;BR /&gt;run;&lt;BR /&gt;%END;&lt;BR /&gt;/* ********** */&lt;BR /&gt;/* Append the OLD matched Controls to the new file of matched cases and controls */&lt;BR /&gt;data &amp;amp;matches.&amp;amp;i.;&lt;BR /&gt;set &amp;amp;matches.&amp;amp;i. keepcontrols;&lt;BR /&gt;run;&lt;BR /&gt;/* ********** */&lt;BR /&gt;/* If there are more matches to be made, add the previously matched, but not kept, */&lt;BR /&gt;/* controls back into the pool of unmatched controls */&lt;BR /&gt;%if &amp;amp;i. lt &amp;amp;NoContrls. %then %do;&lt;/P&gt;&lt;P&gt;%DO z = 1 %TO &amp;amp;Lasti.;&lt;BR /&gt;/* Select all the KEPT Cases */&lt;BR /&gt;proc sort data=&amp;amp;matches.&amp;amp;i. out=skeepcases (keep = Match_&amp;amp;z.);&lt;BR /&gt;by Match_&amp;amp;z.;&lt;BR /&gt;where &amp;amp;Depend. = 1;&lt;BR /&gt;run;&lt;BR /&gt;/* Select all the OLD Controls */&lt;BR /&gt;proc sort data = &amp;amp;matches.&amp;amp;Lasti. out = soldcontrols&amp;amp;z.;&lt;BR /&gt;by Match_&amp;amp;z.;&lt;BR /&gt;where &amp;amp;Depend. = 0 and Match_&amp;amp;z. ne .;&lt;BR /&gt;run;&lt;BR /&gt;/* Keep the OLD Controls that correspond to the NOT KEPT Cases */&lt;BR /&gt;/* Drop the previuos Match_X variable */&lt;BR /&gt;data AddBackControls&amp;amp;z. (drop = Match_&amp;amp;z.);&lt;BR /&gt;merge skeepcases (in = a) soldcontrols&amp;amp;z. (in = b);&lt;BR /&gt;by Match_&amp;amp;z.;&lt;BR /&gt;if b and not a;&lt;BR /&gt;run;&lt;BR /&gt;%END; /* End DO */&lt;BR /&gt;/* Drop the previuos Match_X variable */&lt;BR /&gt;data &amp;amp;LIB..Scontrol (drop = Match_&amp;amp;lasti. );&lt;BR /&gt;set &amp;amp;LIB..Scontrol;&lt;BR /&gt;run;&lt;BR /&gt;/* Append */&lt;BR /&gt;%DO y = 1 %TO &amp;amp;Lasti.;&lt;BR /&gt;data &amp;amp;LIB..Scontrol;&lt;BR /&gt;set &amp;amp;LIB..Scontrol AddBackControls&amp;amp;y.;&lt;BR /&gt;run;&lt;BR /&gt;%END; /* End DO */&lt;BR /&gt;%end; /* End IF */&lt;/P&gt;&lt;P&gt;%END; /* End Main DO */&lt;BR /&gt;%END; /* End Main IF */&lt;BR /&gt;/* ************************************* */&lt;BR /&gt;/* ************************************* */&lt;BR /&gt;/* Save the final matched pairs data set */&lt;BR /&gt;/* ************************************* */&lt;BR /&gt;/* ************************************* */&lt;BR /&gt;/* Sort file by Treatment Variable */&lt;BR /&gt;proc sort data=&amp;amp;matches.&amp;amp;NoContrls. out = &amp;amp;lib..&amp;amp;matches.;&lt;BR /&gt;by &amp;amp;depend.;&lt;BR /&gt;run;&lt;BR /&gt;%MEND OneToManyMTCH;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;The problem is - in the section that I have bolded, the work Match in "Match_&amp;amp;m." appears as red and therefore, the macro does not run as it is supposed to. I also tried re-typing that section but I am not sure what is going wrong.&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I would greatly appreciate any help with this!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 15 Jul 2016 14:01:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Statistical-Procedures/Issue-when-running-a-macro-for-propensity-score/m-p/284067#M14989</guid>
      <dc:creator>batulelec</dc:creator>
      <dc:date>2016-07-15T14:01:49Z</dc:date>
    </item>
    <item>
      <title>Re: Issue when running a macro for propensity score</title>
      <link>https://communities.sas.com/t5/Statistical-Procedures/Issue-when-running-a-macro-for-propensity-score/m-p/284086#M14992</link>
      <description>&lt;P&gt;In general, seeing red in the SAS program editor does NOT necessarily imply that there is a syntax error. &amp;nbsp;If the program does not run, use MPRINT and check the log to find outpwhat the problem is.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To convince yourself that the syntax is correct, replace the line&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;if &amp;amp;Depend.=0 then &lt;/SPAN&gt;&lt;FONT color="#FF0000"&gt;&lt;STRONG&gt;Match&lt;/STRONG&gt;&lt;/FONT&gt;&lt;SPAN&gt;&lt;FONT color="#FF0000"&gt;_&lt;/FONT&gt;&amp;amp;m. = .;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;with the line&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;if &amp;amp;Depend.=0 then y&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;= .;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Notice that the red text disappears.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 13 Jul 2016 15:28:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Statistical-Procedures/Issue-when-running-a-macro-for-propensity-score/m-p/284086#M14992</guid>
      <dc:creator>Rick_SAS</dc:creator>
      <dc:date>2016-07-13T15:28:26Z</dc:date>
    </item>
    <item>
      <title>Re: Issue when running a macro for propensity score</title>
      <link>https://communities.sas.com/t5/Statistical-Procedures/Issue-when-running-a-macro-for-propensity-score/m-p/284116#M14994</link>
      <description>&lt;P&gt;I am using mprint and that helps, thank you! Still trying to fix some issues but it was helpful.&lt;/P&gt;</description>
      <pubDate>Wed, 13 Jul 2016 16:48:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Statistical-Procedures/Issue-when-running-a-macro-for-propensity-score/m-p/284116#M14994</guid>
      <dc:creator>batulelec</dc:creator>
      <dc:date>2016-07-13T16:48:07Z</dc:date>
    </item>
  </channel>
</rss>

