Использование вектора, сгенерированного в SAS / IML, в качестве макропеременной

StackOverflow https://stackoverflow.com//questions/25042043

  •  21-12-2019
  •  | 
  •  

Вопрос

Я пишу макрос, который будет запускать процедуру, СМЕШАННУЮ с остаточной дисперсией уровня 1, фиксированной до почти нулевого значения, используя оператор PARMS.Я пытаюсь сгенерировать основную часть начальных значений для оператора PARMS, используя SAS / IML, что-то вроде:

%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;

Код отлично работает без инструкции PARMS в СМЕШАННОМ коде PROC.Однако, когда я запускаю код как есть, 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 чтобы преобразовать его:

процесс iml;start_vector = j(5);вызовите symputx("start_vector",rowcat(char(j)));%put &start_vector %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 .

Вы должны обернуть это в макросе?Если это так, утверждение и заканчиваемые операторы не будут работать, поскольку они не могут быть вызваны образующимися макросом.Однако, поскольку SAS / IML позволяет вам определить и вызовывать модули с аргументами, я обычно избегаю языка макроса и определяю модуль, который принимает аргументы, затем вызовов модуль напрямую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top