Ошибка макроса: найдено больше позиционных параметров, чем определено - PullRequest
0 голосов
/ 22 мая 2018

Пример данных:

Reportstatestatus age male hospid radm30 uniquekey Timemonths clinical_cond1 clinical_cond2  
ca1                33  0    1232   1      1           13       0              1
ca1                22  1    2321   1      2           10       1              0
ca0               22   1    2222   0      3           10       1              0

У меня есть такой макрос (код, разработанный кем-то другим):

 DSN = Dataset Name 
PARMS = Parameters from multivariate model 
KEY = Unique ID or key to match observations 
DEPENDENT = Dependent variable specified in model 
INDEPENDENT = Independent variables separated with spaces 
CLASS = Class variable of interest to calculate marginal effects 
NAME_1 = User provided name for the first data element of class variable 
(Name limited to 30 characters) 
NAME_2 = User provided name for the second data element of class variable 
(Name limited to 30 characters) 
*************************************************************** 
EXAMPLE OF MACRO CALL 
***************************************************************/ 
%MARGINAL(cabg, /* Name of original dataset */ 
parms_OpDeath, /* Parameter estimates from model */ 
medRecN, /* Key */ 
yom, /* Dependent variable */ 
age_n, /* Independent variables listed */ 
GENDER, /* Class variable for marginal effects */ 
Male, /* User-supplied name of first data element*/ 
Female); /* User-supplied name of second data element*/ 
/****************************************************************/ 


%MACRO MARGINAL (DSN,PARMS,KEY,DEPENDENT,INDEPENDENT,CLASS,NAME_1,NAME_2);  
data OUT_1;  
length &CLASS $30
;  
set &DSN (rename=(&CLASS = OLD_CLASS )) ;  
&CLASS = "&NAME_1";  
RUN;  
**** Apply model to entire data; 
PROC LOGISTIC inmodel= &PARMS Descending;  
score data=OUT_1  
OUT= PRED_1 (KEEP = &KEY &DEPENDENT &CLASS &INDEPENDENT OLD_CLASS P_1);  
title "Applying the Risk Model to Entire Data Assuming Every Observation’s 
Class Variable Value = First Data Element of the Class Variable";  
RUN;  
data OUT_2;  
length &CLASS $
30
;  
set &DSN (rename=(&CLASS = OLD_CLASS )) ;  
&CLASS = "&NAME_2";  
RUN;  
**** Apply model to entire data; 
PROC LOGISTIC inmodel= &PARMS Descending;  
score data=OUT_2  
OUT= PRED_2 (KEEP = &KEY &DEPENDENT &CLASS &INDEPENDENT OLD_CLASS P_1);  
title1 "Applying the Risk Model to Data assuming Every Observation’s Class 
Variable Value = Second Data Element of the Class Variable";  
RUN;  
**** Join the data; 
data OUT_1_N;  
set PRED_1;  
p_&NAME_1 = p_1;  
KEEP &KEY &DEPENDENT &CLASS &INDEPENDENT OLD_CLASS p_&NAME_1 ;  
RUN;  
proc sort data=OUT_1_N; by &KEY; RUN;  
data OUT_2_N;  
set PRED_2;  
p_&NAME_2 = p_1;  
KEEP &KEY &DEPENDENT &CLASS &INDEPENDENT OLD_CLASS p_&NAME_2 ;  
RUN;  
proc sort data=OUT_2_N; by &KEY; run;  
data join;  
merge OUT_1_N OUT_2_N;  
by &KEY;  
RUN;  
title "Compare Observed Response Variable: Class Variable Value 1 vs. Class 
Variable Value 2";  
PROC TTEST data=join;  
class OLD_CLASS;  
var &DEPENDENT;  
RUN;  
title "Compare predicted Response Variable with Recycle Prediction Method";  
PROC MEANS data=join n mean std min max lclm uclm;  
var p_&NAME_1 p_&NAME_2 ;  
RUN;  
PROC TTEST data=join;  
paired p_&NAME_1 * p_&NAME_2;  
RUN;  
%MEND MARGINAL;

Когда я запускаю макрос следующим образом:

libname inputf "F:\ccorp\mray\processed\Readmission";
data work.readmdata;
set INPUTF.readm_caonly;  
run;

%LET indep = age Male TimeMonths Reportstatestatus Hx_CTSURG 
Cardiogenic_Shock COPD MCANCER DIABETES MALNUTRITION DIS_FLUID OBESITY 
HEMATOLOGICAL DEMENTIA MAJOR_PSYCH PARALYSIS_FUNCTDIS POLYNEUROPATHY 
CHF ARRHYTHMIAS CEREB_HEMORR CEREB_DISEASE VASDIS_WCOMP FIBROSIS_LUNG 
PNEUMONIA OTHER_LUNG_DIS DIALYSIS RENALFAILURE DECUBITUS_ULCER ;

(переменные после Reportstatestatus являются клиническими состояниями)

%MARGINAL (%nrbquote(readmdata, /* Name of original dataset */ 
estimates_slopeCA, /* Parameter estimates from model */ 
UniqueKey, /* Key */ 
RADM30, /* Dependent variable */ 
indep, /* Independent variables listed */ 
Reportstatestatus, /* Class variable for marginal effects */ 
CA1, /* User-supplied name of first data element*/ 
CA0)); /* User-supplied name of second data element*/ 

выдает ошибку:

ОШИБКА: найдено больше позиционных параметров, чем определено.

Я исследовал онлайн и попробовал,% STR или% NRSTR,% BQUOTE или% SUPERQ (это не запустилось. Дало больше ошибок).Я все еще получаю ошибку.

Пожалуйста, помогите.

Ответы [ 4 ]

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

Только к последним двум параметрам может потребоваться применить к ним кавычки макросов для выполнения вызова.Эти два параметра требуют, чтобы строки соответствовали возможным значениям указанной переменной класса.И даже тогда, только если значение включает запятые, начальные пробелы, несбалансированные кавычки или несбалансированные скобки, вам нужно будет добавить макрос кавычки.

Все остальные параметры требуют набора данных или имен переменных или другого допустимого синтаксиса SAS, поэтомуне нужно добавлять кавычки макросов.

%MARGINAL
(DSN=cabg /* Name of original dataset */ 
,PARMS=parms_OpDeath /* Parameter estimates from model */ 
,KEY=medRecN /* Key */ 
,DEPENDENT=yom /* Dependent variable */ 
,INDEPENDENT=age_n /* Independent variables listed */ 
,CLASS=GENDER /* Class variable for marginal effects */ 
,NAME_1=%bquote(1, Male) /* User-supplied name of first data element*/ 
,NAME_2=%bquote(2, Female) /* User-supplied name of second data element*/ 
);
0 голосов
/ 22 мая 2018

Если есть проблема в самом вызове макроса, вам не нужны данные (или даже весь код макроса).Тем не менее, я не мог повторить вашу проблему.

Для отладки я бы сделал простой макрос вроде:

%MACRO MARGINAL (DSN,PARMS,KEY,DEPENDENT,INDEPENDENT,CLASS,NAME_1,NAME_2);  
  %put _user_ ; 
%MEND MARGINAL;

Я успешно вызвал этот макрос с вашим кодом:

%MARGINAL (%nrbquote(readmdata, /* Name of original dataset */ 
estimates_slopeCA, /* Parameter estimates from model */ 
UniqueKey, /* Key */ 
RADM30, /* Dependent variable */ 
indep, /* Independent variables listed */ 
Reportstatestatus, /* Class variable for marginal effects */ 
CA1, /* User-supplied name of first data element*/ 
CA0)); /* User-supplied name of second data element*/ 

Под словом "успешно" я имею в видуон выполнил макрос и не выдал ошибку вашего отчета.Из-за использования% NRBQUOTE () значение присваивается только параметру DSN.Это, вероятно, не предполагаемое поведение, но оно не создает ошибку.Даже если я удалю% NRBQUOTE, я не получу сообщение об ошибке.

Я предлагаю вам отредактировать ваш вопрос, чтобы сделать воспроизводимый пример.

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

Я бы поместил функцию в код, а не во входной параметр макроса.тогда принудительно процитируй это в своем использовании ... Если ты дашь мне всю свою макроопределенность, я могу помочь!

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

Чтобы проверить это, выборочные данные прошли бы долгий путь, но я действительно считаю, что функция цитирования макросов должна использоваться для отдельных параметров макроса, а не для всех параметров вместе.Не имея возможности протестировать, я бы предложил попробовать что-то вроде этого:

% MARGINAL (readmdata, оценка_slopeCA, UniqueKey, RADM30,% bquote (& indep), Reportstatestatus,
CA1, CA0);

...