【问题标题】:Macro error: More positional parameters found than defined宏错误:找到的位置参数比定义的多
【发布时间】:2018-05-22 06:17:19
【问题描述】:

样本数据:

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(这没有运行。它给出了更多错误)。 我仍然得到错误。

请帮忙。

【问题讨论】:

  • 这有没有用过?如果是,那么您能否提供一个对%marginal 有效的示例调用。还可以尝试使用options symbolgen; 之类的宏选项,并可能在错误消息周围显示更多日志。我们需要确保错误消息与%marginal 相关。
  • 为什么包含%NRBQUOTE()?没有什么需要引用的。也许您还没有结束之前的宏引用尝试。您可以从一个新的 SAS 会话开始并重试吗?

标签: macros sas


【解决方案1】:

为了测试这一点,一个样本数据会有很长的路要走,但我相信宏引用功能应该用于单个宏参数,而不是所有参数一起使用。在无法测试的情况下,我建议尝试这样的事情:

%MARGINAL(读取数据, 估计斜率CA, 唯一键, RADM30, %bquote(&indep), 报告状态,
CA1, CA0);

【讨论】:

  • 我试过这个建议,还是有错误。我不知道如何显示数据。我有一张大桌子。
  • 您不需要显示实际数据或整个数据,只需几行来显示每个变量可以采用的可能值,这将有助于确定要使用的正确引用函数以及如何进行调用。 .
  • 我已经输入了数据的 sn-p。谢谢@John Doe
  • 我仍然无法重现您的问题,因为estimates_slopeCA 是我没有的数据集。顺便说一句,您是否将 indep 作为宏变量 &indep. 调用?
  • 我希望能提供更多信息,但我不知道如何提供或提供什么。数据 sn-p 显示每个变量的类型。我有 100,000 行这样的行。谢谢
【解决方案2】:

如果宏调用本身存在问题,则不需要数据(甚至不需要所有宏代码)。也就是说,我无法复制您的问题。

为了调试,我会做一个简单的宏,比如:

%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,我也不会收到错误消息。

我建议您编辑您的问题以制作可重复的示例。

【讨论】:

    【解决方案3】:

    我会将函数放在代码中,而不是放在宏输入参数中。 然后在您的使用中强制引用它... 如果你把你的整个宏定义给我,我可以帮忙!

    【讨论】:

    • 抱歉,我在发布后看到了宏
    • 我刚刚注意到你有 ( 或 ) 在错误的地方 %MARGINAL (%nrbquote(readmdata), /* 原始数据集的名称 /estimates_slopeCA, / 来自模型的参数估计/ UniqueKey, / Key / RADM30, / 因变量 / indep, / 自变量列出 / Reportstatestatus, /边际效应的类变量/CA1,/用户提供的第一个数据元素的名称*/CA0); /* 用户提供的第二个数据元素的名称*/
    【解决方案4】:

    只有最后两个参数可能需要对其应用宏引用才能进行调用。这两个参数需要字符串来匹配指定类变量的可能值。即使这样,只有当值包含逗号、前导空格、不平衡引号或不平衡括号时,您才需要添加宏引用。

    其他参数都需要数据集或变量名称或其他有效的 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*/ 
    );
    

    【讨论】:

      猜你喜欢
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多