sas - 使用在 SAS/IML 中生成的向量作为宏变量

标签 sas sas-macro sas-iml

我正在编写一个宏,它将运行 PROC MIXED,使用 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 MIXED 代码中没有 PARMS 语句,代码也能正常工作。然而,当我按原样运行代码时,SAS 显然将文字字符串“start_vector[label=""]' 放在 PARMS 之后,而不是列出 IML 生成的值。

如何避免此错误并让 SAS 将 START_VECTOR 中包含的值指定为 PARMS 语句的起始值?

最佳答案

您应该使用 SAS/IML 中的 SYMPUTSYMPUTX 例程将向量转换为宏变量。

这是一种将向量转化为宏变量中的单个字符串的方法。

proc iml;
  start = {"Hi","Bye"};
  call symput("start",rowcat(start`));
  %put &start;
quit;

对于数值向量,你需要使用char来转换它:

进程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;

关于sas - 使用在 SAS/IML 中生成的向量作为宏变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25042043/

相关文章:

sas - sas 9.2 的距离函数

random - 如何在SAS宏中包含do循环?

sql - SAS/SQL - 使用自定义函数创建 SELECT 语句

SAS 为组的其余部分返回组中的第一个值

char - SAS 在没有被要求的情况下将字符变量转换为数字

SAS:如何在目录中存储宏

sas - SAS 是否有宏来格式化用户编写的 DI 转换的输出?

sas - 如何在 proc iml 内有条件地定义宏变量?

r - 如何将要在 SAS、SPSS 或 STATA 中使用的数据导入 R?