Pregunta

Estoy escribiendo una macro que ejecutará PROC MIXED con la varianza residual de nivel 1 fijada en un valor cercano a cero usando la declaración PARMS.Estoy intentando generar la mayor parte de los valores iniciales para la declaración PARMS usando SAS/IML, algo como:

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

El código funciona bien sin la declaración PARMS en el código PROC MIXED.Sin embargo, cuando ejecuto el código tal como está, SAS aparentemente coloca la cadena literal 'start_vector[label=""]' después de PARMS en lugar de enumerar los valores generados por IML.

¿Cómo puedo evitar este error y hacer que SAS especifique los valores contenidos en START_VECTOR como valores iniciales para la declaración PARMS?

¿Fue útil?

Solución

Deberías usar el SYMPUT o SYMPUTX Rutinas en SAS/IML para convertir un vector en una macro variable.

Esta es una forma de convertir un vector en una sola cadena en una variable macro.

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

Con un vector numérico, necesitas usar char para convertirlo:

proceso iml;vector_inicio = j(5);llamar a symputx("start_vector",rowcat(char(j)));%poner &start_vector;abandonar;

Con una matriz numérica, necesitas usar SHAPE para aplanarlo:

proc iml; 
    start_vector = j(5,5); 
    call symputx("start_vector",rowcat(shape(char(start_vector),1))); 
    %put &start_vector;
quit;

Otros consejos

Su problema y dos soluciones se discuten en el artículo " valores que pasan de Proc IML a los procedimientos SAS ".

¿Tienes que envolver esto en una macro?Si es así, las declaraciones PRESENTARIAS y FIDMIT no funcionarán, ya que no se les puede llamar a formar una macro.Sin embargo, dado que SAS / IML le permite definir y llamar a los módulos con argumentos, generalmente evito el lenguaje macro y definir un módulo que toma argumentos, luego llame al módulo directamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top