Verwendung eines in SAS/IML generierten Vektors als Makrovariable
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?
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.