Domanda

Sto scrivendo una macro che eseguirà PROC miscelato con la varianza residua di livello 1 fissata a un valore quasi zero usando la dichiarazione del parms.Sto cercando di generare la maggior parte dei valori di partenza per l'istruzione dei parmi usando SAS / IML, qualcosa del genere come:

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

Il codice funziona bene senza l'istruzione dei perfesti nel codice misto proc.Quando eseguo il codice come è, tuttavia, SAS apparentemente mette la stringa letterale 'Start_Vector [Etichetta=""]' dopo i parmi anziché elencare i valori generati da IML.

Come posso evitare questo errore e avere SAS Specificare i valori contenuti in Start_Vector come valori di partenza per l'istruzione dei parmi?

È stato utile?

Soluzione

È necessario utilizzare le routine SYMPUT o SYMPUTX in SAS / IML per convertire un vettore in una variabile a macroistruzione.

Questo è un modo per ottenere un vettore in una singola stringa in una variabile macro.

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

Con un vettore numerico, è necessario utilizzare char per convertirlo:

PROC IML; start_vector= j (5); Chiama SymputX ("Start_Vector", RowCat (Char (J))); % put & start_vector; smettere;

Con una matrice numerica, è necessario utilizzare SHAPE per appiattirlo:

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

Altri suggerimenti

Il tuo problema e due soluzioni sono discusse nell'articolo " Valori di passaggio da PROC IML nelle procedure SAS . "

Devi avvolgere questo in una macro?In tal caso, le dichiarazioni di invio e endsubmit non funzioneranno, poiché non possono essere chiamate formare una macro.Tuttavia, poiché SAS / IML consente di definire e chiamare moduli con argomenti, di solito evito la lingua macro e definire un modulo che prende argomenti, quindi chiamare direttamente il modulo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top