使用SAS/IML中生成的向量作为宏变量
题
我正在编写一个宏,它将运行PROC与使用PARMS语句固定为近零值的1级残差方差混合。我正在尝试使用SAS/IML为PARMS语句生成大部分起始值,类似于:
%macro test (dataset= , classroom= , preds= , outcome=);
proc iml;
/*count number of variables*/
%let nvars = 0;
%do %while(%qscan(&preds,&nvars+1,%str( )) ne %str());
%let nvars = %eval(&nvars+1);
%end;
/*determine location of level-1 residual in the start value vector*/
%let error_location = %eval(((&nvars*(&nvars-1))/2)+&nvars+1);
/*create vector of start values from lower triangle of identity matrix*/
start_vector = symsqr(I(&nvars));
%let starts = %str(start_vector[label=""]);
/*analyze data*/
proc mixed data=&dataset noprofile method=ml;
class &classroom;
model &outcome = &preds /noint;
random &preds /type=un sub=&classroom g;
parms
&starts
.00000001 /hold= &error_location;
run;
quit;
%mend;
没有PROC混合代码中的PARMS语句,代码工作正常。然而,当我按原样运行代码时,SAS显然将字面字符串'start_vector[label=""]'放在PARMS之后,而不是列出IML生成的值。
如何避免此错误,并让SAS将START_VECTOR中包含的值指定为PARMS语句的起始值?
解决方案
你应该使用 SYMPUT
或 SYMPUTX
SAS/IML中的例程将向量转换为宏变量。
这是将向量转换为宏变量中的单个字符串的一种方法。
proc iml;
start = {"Hi","Bye"};
call symput("start",rowcat(start`));
%put &start;
quit;
使用数字向量,您需要使用 char
转换它:
proc iml;start_vector=j(5);调用symputx("start_vector",rowcat(char(j)));%put&start_vector;退出;
使用数字矩阵,您需要使用 SHAPE
把它弄平:
proc iml;
start_vector = j(5,5);
call symputx("start_vector",rowcat(shape(char(start_vector),1)));
%put &start_vector;
quit;
其他提示
您的问题和两个解决方案在文章“将Proc IML的值传递到SAS程序“。
你必须用宏包装吗?如果是这样,则提交和Andubmit语句将无法正常工作,因为它们无法调用宏。但是,由于SAS / IML使您能够使用参数定义和调用模块,因此我通常避免宏语言并定义一个采用参数的模块,然后直接调用模块。
不隶属于 StackOverflow