2016-07-19 16 views
0

Dies ist mein erster Ausflug in die Verwendung von SAS-Makros, und ich folge this page von der erstaunlichen UCLA Stats Consulting Group. Ich bin daran interessiert, Makro-Variablen in PROC MIXED zu verwenden, um das Kopieren und Einfügen von Code-Blöcken zu vermeiden (mein tatsächlicher Datensatz hat ~ 400 Variablen).SAS-Makrovariablen in PROC MIXED

Mein Beispiel ändert das UCLA-Beispiel, um Schüler in vielen Schulen zu haben. Partitur mit einem der anderen Variablen

data hsb3; 
    input id school female race ses prog 
     read write math science socst; 
datalines; 
1 1 0 4 1 1 57 52 41 47 57 
2 1 1 4 2 3 68 59 53 63 61 
3 1 0 2 3 1 44 33 54 58 31 
4 1 0 4 3 3 63 44 47 53 56 
5 1 0 4 2 2 47 51 43 50 61 
6 1 1 4 2 2 44 52 51 50 61 
7 1 0 3 2 1 50 59 60 56 52 
8 1 0 1 2 2 34 46 52 53 57 
9 1 0 4 2 2 63 57 51 63 61 
19 2 0 3 1 2 57 63 41 63 61 
20 2 1 4 2 2 60 57 51 58 31 
21 2 0 4 3 2 57 55 51 53 56 
22 2 0 4 3 2 73 46 71 50 61 
23 2 0 4 2 1 54 65 57 50 61 
24 2 1 4 2 2 45 60 50 56 52 
25 2 0 3 2 1 42 63 43 53 57 
26 2 0 1 1 2 34 57 51 63 61 
27 2 0 4 2 2 63 49 60 55 31 
10 3 1 3 2 2 57 55 51 55 31 
11 3 1 4 3 3 60 46 71 31 56 
12 3 1 4 2 2 57 66 57 55 61 
13 3 0 3 3 2 50 60 50 31 61 
14 3 0 4 3 2 57 57 57 55 46 
15 3 0 3 3 3 68 55 50 31 56 
16 3 0 4 1 2 34 46 43 50 56 
17 3 0 4 3 2 34 65 51 50 56 
18 3 0 4 1 2 63 60 60 47 57 
28 4 1 3 2 2 57 52 52 53 61 
29 4 1 4 2 3 60 57 51 63 61 
30 4 1 1 2 2 57 65 51 55 46 
31 4 0 4 3 2 73 60 71 31 56 
32 4 0 4 3 2 54 63 57 55 46 
33 4 0 3 1 2 45 57 50 31 56 
34 4 0 1 1 1 42 49 43 50 56 
35 4 0 4 3 2 47 52 51 50 56 
36 4 0 4 2 1 57 57 60 56 52 
; 
run; 

Das UCLA Beispiel zeigt, wie mit proc reg Makrovariablen verwenden, mehr einfachen linearen Regressionsmodelle zu tun, um vorhersagen zu lesen:

%let indvars = write math female socst; 

proc reg data = hsb3; 
    model read = &indvars; 
run; 
quit; 

diese Einnahme Schule zu tun in Konto, können wir PROC statt MIXED verwenden:

proc mixed data = hsb3; 
    class school; 
    model read = &indvars; 
    random school; 
run; 
quit; 

Aber was ich möchte wirklich zu sehen, ist zu tun, wenn eine der Noten nach Geschlecht unterscheiden sich (noch Schule berücksichtigt) .

%let scores = read write math science socst; 

proc mixed data = hsb3; 
    class school; 
    model &scores = female; 
    random school; 
run; 
quit; 

Jetzt bekomme ich den Fehler:

NOTE: The SAS System stopped processing this step because of errors. 
167 class school; 
168 model &indvars = female; 
         - 
         22 
         200 
NOTE: Line generated by the macro variable "INDVARS". 
1  write math female socst 
      ---- 
      73 
ERROR 22-322: Syntax error, expecting one of the following: a name, ;, (, *, -, /, :, @, 
       _CHARACTER_, _CHAR_, _NUMERIC_, |. 
ERROR 200-322: The symbol is not recognized and will be ignored. 
ERROR 73-322: Expecting an =. 

Irgendwie ist der Makrovariable nicht funktioniert. Gibt es ein Problem bei der Verwendung von Makrovariablen als Antwortvariable in PROC MIXED? Sie als Antwortvariable in PROC REG arbeiten ....

proc reg data = hsb3; 
    model &scores = female; 
run; 
quit; 

Antwort

0

Ihr Problem hat nichts mit Makrovariablen oder Makrocode zu tun. Stattdessen erstellen Sie keine gültige MODEL-Anweisung für die Verwendung in PROC MIXED.

The MODEL statement names a single dependent variable ...

Versuchen Sie, die Daten vielleicht zu transformieren?

%let scores = read write math science socst; 
data want ; set hsb3 ; 
    array scores &scores ; 
    do i=1 to dim(scores); 
    score=scores(i); 
    name=vname(scores(i)); 
    output; 
    end; 
run; 
proc sort; by name ; run; 

proc mixed data = want; 
    by name; 
    class school; 
    model score = female; 
    random school; 
run; 
+0

Deshalb war ich für die Makrovariablen geign. Wenn ich sie in proc reg (letzter Codeblock) verwende, macht sie fünf Regressionen mit jeweils einer Antwort (die fünf Makrovariablen der Reihe nach), nicht eine einzige multivariate Regression mit fünf Antwortvariablen. Ich suchte nach dem mit PROC MIXED passieren. Können wir nicht Makrovariablen damit verwenden, um fünf gemischte Modelle mit jeweils einer einzelnen Antwortvariablen zu erhalten? Ohne den Codeblock mehr als 5 Mal zu schreiben? – emudrak

+0

Nicht gemäß der Dokumentation. Sie müssten mehrere PROC MIXED-Schritte generieren. Sie können die Daten so transformieren, dass der Wert jeder Variablen in separaten Beobachtungen erscheint, und dann eine BY-Anweisung verwenden. Jemand, der MIXED besser versteht, kennt vielleicht eine andere Methode. – Tom

+0

Aus der von Tom zitierten Dokumentation sieht es wie folgt aus: Die PROC MIXED-Modellanweisung lässt keine Variablenliste für die abhängige Variable zu. Ich würde damit beginnen, den SAS-Code zu schreiben, um Run 3-Modelle so zu erstellen, wie Sie möchten. Und dafür, dass SAS-Code funktioniert. Dann können Sie wahrscheinlich die Makrosprache verwenden, um den Code für diese 3 Modelle (oder 300) zu generieren. Oder Toms By-Statement-Ansatz ist wahrscheinlich besser. Wenn Sie den SAS-Code bereitstellen, den Sie als Teil Ihrer Frage generieren möchten, können Ihnen die Mitarbeiter besser helfen. Beachten Sie, dass die gesamte Makrosprache SAS-Code generiert – Quentin