SAS: нет соответствующего оператора% MACRO - PullRequest
0 голосов
/ 03 мая 2018

Я следую опубликованному методу, чтобы определить подходящие случаи. Я получаю следующую ошибку

 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.

Как правильно назвать макрос? Я использую SAS University Edition.

Метод из http://www2.sas.com/proceedings/sugi25/25/po/25p225.pdf

Часть 2. Выполнение матча Следующая часть макропрограммы выполняет сопоставление и выводит согласованные пары. Во-первых, набор данных случаев выбран. Curob используется для отслеживания текущего дела. Matchto используется для идентификации совпадающих пар случаев и управления. Start и oldi инициализируются для управления обработкой Цикл DO набора данных управления.

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;

Далее выбирается набор данных управления. Обработка начинается в первое бесподобное наблюдение. Набор данных ищется пока совпадение не найдено или не определено, совпадение не может быть сделал. Проверка ошибок выполняется, чтобы избежать бесконечного цикла. Curctrl используется для отслеживания текущего контроля.

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;

Если показатель склонности текущего случая (апроб) соответствует оценка склонности текущего контроля (cprob), затем совпадение был найден. Обновите Cmatch до 1 = Да. Выведите контроль. Обновление соответствует, чтобы отслеживать последний соответствующий элемент управления. Выход цикл DO. Если показатель склонности текущего контроля больше, чем показатель склонности текущего случая, то нет совпадение будет найдено для текущего случая. Остановить цикл DO обработка.

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; 

/ * конец 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;

ЗАЯВЛЕНИЕ О МАКРОМАТЧЕ Ниже приведены операторы вызова макроса программа MATCH. Первый выполняет 4-значный матч; второй выполняет трехзначное сопоставление.

%MATCH(STUDY,Propen,Match4,SCase4,
SContrl4,Interven,.0001);
%MATCH(STUDY,Propen,Match3,SCase3,
SContrl3,Interven,.001);

1 Ответ

0 голосов
/ 03 мая 2018

Предположительно, вы не включили начало макроса (то есть, часть %MACRO MATCH(..., ранее в статье). Это макрос, он не предназначен для запуска по частям так, как он написан - вам нужно включить весь код от %MACRO MATCH до %MEND и затем вызовы.

...