2016-07-19 160 views
0

这是我第一次尝试使用SAS宏,我正在追踪来自UCLA Stats Consulting Group的this page。我有兴趣在PROC MIXED中使用宏变量来避免复制和粘贴代码块(我的实际数据集有大约400个变量)。PROC宏中的SAS宏变量

我的例子修改了加州大学洛杉矶分校的例子,让许多学校的学生。

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; 

加州大学洛杉矶分校的示例演示了如何使用宏变量与PROC REG做几件简单的线性回归模型来预测阅读成绩的任何其他变量:

%let indvars = write math female socst; 

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

为此承担学校办成帐户,我们可以使用PROC MIXED代替:

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

但我真正想要做的是看看是否有任何成绩的性别差异(还带着学校在内) 。

%let scores = read write math science socst; 

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

现在我得到的错误:

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 =. 

不知何故,宏变量是行不通的。 在PROC MIXED中使用宏变量作为响应变量是否存在问题?他们在PROC REG响应变量工作....

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

回答

0

您的问题不会有任何与宏变量或宏代码。相反,您并未创建在PROC MIXED中使用的有效MODEL语句。

The MODEL statement names a single dependent variable ...

尝试转换数据吗?

%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

这就是为什么我是为宏观变量。当我在proc reg(最后一个代码块)中使用它们时,它会进行五次回归,每次回应一个回应(五个宏变量),而不是具有五个回应变量的单个多变量回归。 我一直在寻找与PROC MIXED一起发生的事情。我们不能使用宏变量来获得五个混合模型,每个混合模型都有一个不同的单一响应变量?不写代码块5次? – emudrak

+0

不依据文档。您需要生成多个PROC MIXED步骤。您可以转换数据,以便每个变量的值出现在单独的观察值上,然后使用BY语句。有人更好地理解MIXED可能会知道另一种方法。 – Tom

+0

从Tom引用的文档看来,它看起来不是,PROC MIXED模型语句不允许变量列表用于因变量。我会首先编写SAS代码,以便按需要运行3个模型。并得到这个工作的SAS代码。然后,您可以使用宏语言为这3个模型(或300)生成代码。或者汤姆的BY声明方法可能会更好。如果您发布想要作为问题一部分生成的SAS代码,人们可以更好地帮助您。请注意,所有宏语言都会生成SAS代码 – Quentin