Frage

Ich schreibe ein Makro, das PROC MIXED ausführt, wobei die Restvarianz der Ebene 1 mithilfe der PARMS-Anweisung auf einen Wert nahe Null festgelegt wird.Ich versuche, den Großteil der Startwerte für die PARMS-Anweisung mithilfe von SAS/IML zu generieren, etwa so:

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

Der Code funktioniert ohne die PARMS-Anweisung im PROC MIXED-Code einwandfrei.Wenn ich den Code jedoch so ausführe, wie er ist, fügt SAS offenbar die Literalzeichenfolge „start_vector[label=""]‘ nach PARMS ein, anstatt die von IML generierten Werte aufzulisten.

Wie kann ich diesen Fehler vermeiden und SAS veranlassen, die in START_VECTOR enthaltenen Werte als Startwerte für die PARMS-Anweisung anzugeben?

War es hilfreich?

Lösung

Sie sollten das verwenden SYMPUT oder SYMPUTX Routinen in SAS/IML zum Konvertieren eines Vektors in eine Makrovariable.

Dies ist eine Möglichkeit, einen Vektor in eine einzelne Zeichenfolge in einer Makrovariablen umzuwandeln.

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

Bei einem numerischen Vektor müssen Sie verwenden char um es umzuwandeln:

proc iml;start_vector = j(5);call symputx("start_vector",rowcat(char(j)));%put &start_vector;aufhören;

Mit einer numerischen Matrix müssen Sie verwenden SHAPE um es flacher zu machen:

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

Andere Tipps

Ihr Problem und zwei Lösungen werden im Artikel " Werte von PROC IML in SAS-Verfahren übergeben. "

Müssen Sie dies in ein Makro einwickeln?Wenn ja, funktioniert die Anweisungen zum Senden und den Ansubmit-Anweisungen nicht, da sie nicht als Formular ein Makro bezeichnet werden können.Da SAS / IML jedoch Module mit Argumenten definieren und anrufen kann, vermeiden Sie normalerweise die Makrosprache und definieren Sie ein Modul, das Argumente annimmt, und dann das Modul direkt anrufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top