SAS中文论坛

标题: 求助:问题出在哪里? [打印本页]

作者: shiyiming    时间: 2012-7-7 16:36
标题: 求助:问题出在哪里?
大家好,我是一名医生,最近写文章要用到propensity score matching. 我在网上查到一篇文献,
<!-- m --><a class="postlink" href="http://www2.sas.com/proceedings/sugi29/165-29.pdf">http://www2.sas.com/proceedings/sugi29/165-29.pdf</a><!-- m --> 该文献可以进行1:n的配对。但我以前对SAS基本没接触,用的最多的是SPSS.硬着头皮下载了SAS软件,照猫画虎总算完成了propensity score的计算。但是在运行文献给出的macro的时候总是报错。有没有哪位大侠帮我看看到底是什么问题,不胜感谢。
出错的地方在这:
[color=#0000BF:2pwured9]NOTE: Line generated by the invoked macro &quot;MATCH&quot;.[/color:2pwured9]
1      data &amp;lib..&amp;matched. (drop=Cmatch randnum aprob cprob start oldi curctrl matched);  set
1  ! &amp;lib..SCase ; curob + 1; SUGI 29 Posters 8 matchto = curob; if curob = 1 then do; start = 1;
                             [color=#BF0000:2pwured9] ----
                              180[/color:2pwured9]
1  ! oldi = 1; end;  DO i = start to n; set &amp;lib..Scontrol point = i nobs = n
[color=#BF0000:2pwured9]ERROR 180-322: Statement is not valid or it is used out of proper order.[/color:2pwured9]


[color=#0000BF:2pwured9]NOTE: The SAS System stopped processing this step because of errors.[/color:2pwured9]
log上好像总说macro &quot;MATCH&quot;有错误,但我又不知道错在哪儿。
我下面把文献中macro &quot;MATCH&quot;那段也贴出来:
/* ********************* */
/* Macro to Perform the Match */
/* ********************* */
%MACRO MATCH (MATCHED,DIGITS);
data &amp;lib..&amp;matched. (drop=Cmatch randnum aprob cprob start oldi curctrl matched);
/* select the cases data set */
set &amp;lib..SCase ;
curob + 1;
SUGI 29 Posters
8
matchto = curob;
if curob = 1 then do;
start = 1;
oldi = 1;
end;
/* select the controls data set */
DO i = start to n;
set &amp;lib..Scontrol point = i nobs = n;
if i gt n then goto startovr;
if _Error_ = 1 then abort;
curctrl = i;
/* output control if match found */
if aprob = cprob then
do;
Cmatch = 1;
output &amp;lib..&amp;matched.;
matched = curctrl;
goto found;
end;
/* exit do loop if out of potential matches */
else if cprob gt aprob then
goto nextcase;
startovr: if i gt n then
goto nextcase;
END; /* end of DO LOOP */
/* If no match was found, put pointer back*/
nextcase:
if Cmatch=0 then start = oldi;
/* If a match was found, output case and increment pointer */
found:
if Cmatch = 1 then do;
oldi = matched + 1;
start = matched + 1;
set &amp;lib..SCase point = curob;
output &amp;lib..&amp;matched.;
end;
retain oldi start;
if _Error_=1 then _Error_=0;
run;
/* get files of unmatched cases and controls */
proc sort data=&amp;lib..scase out=sumcase;
by &amp;SiteN. &amp;PatientN.;
run;
proc sort data=&amp;lib..scontrol out=sumcontrol;
by &amp;SiteN. &amp;PatientN.;
run;
proc sort data=&amp;lib..&amp;matched. out=smatched (keep=&amp;SiteN. &amp;PatientN. matchto);
by &amp;SiteN. &amp;PatientN.;
run;
data tcases (drop=matchto);
merge sumcase(in=a) smatched;
by &amp;SiteN. &amp;PatientN.;
if a and matchto = . ;
cmatch = 0;
aprob =Round(prob,&amp;digits.);
run;
data tctrl (drop=matchto);
merge sumcontrol(in=a) smatched;
SUGI 29 Posters
9
by &amp;SiteN. &amp;PatientN.;
if a and matchto = . ;
cmatch = 0;
cprob = Round(prob,&amp;digits.);
run;
%SORTCC
%MEND MATCH;

所有的语句都在我提供的链接的文献里能找到。

谢谢大家了。
作者: shiyiming    时间: 2012-7-12 04:29
标题: Re: 求助:问题出在哪里?
assign lib a value first.
According to the code, lib is a libname, so define libname before you use it.
e.g.
%let lib=work; /*if your data scare is saved in work library*/




欢迎光临 SAS中文论坛 (http://www.mysas.net/forum/) Powered by Discuz! X3.2