【问题标题】:SAS macro variables in PROC MIXEDPROC MIXED 中的 SAS 宏变量
【发布时间】:2016-07-19 17:57:13
【问题描述】:

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

我的示例修改了 UCLA 示例,以在许多学校中拥有学生。

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;

【问题讨论】:

    标签: sas sas-macro mixed


    【解决方案1】:

    您的问题与宏变量或宏代码无关。相反,您没有创建要在 PROC MIXED 中使用的有效 MODEL 语句。

    MODEL 语句命名单个因变量 ...

    也许尝试转换数据?

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

    【讨论】:

    • 这就是为什么我要研究宏变量。当我在 proc reg (最后一个代码块)中使用它们时,它会执行五个回归,每个回归一个响应(依次是五个宏变量),而不是一个具有五个响应变量的多元回归。我一直在寻找 PROC MIXED 发生这种情况。我们不能使用宏变量来获得五个混合模型,每个模型都有一个不同的单个响应变量吗?不写代码块超过 5 次?
    • 不根据文档。您需要生成多个 PROC MIXED 步骤。您可以转换数据,以便每个变量的值出现在单独的观察中,然后使用 BY 语句。更了解 MIXED 的人可能知道另一种方法。
    • 从汤姆引用的文档看来,PROC MIXED 模型语句不允许因变量的变量列表。我将首先编写 SAS 代码以根据需要运行 3 个模型。并让它成为有效的 SAS 代码。然后您可以使用宏语言为这 3 个模型(或 300 个)生成代码。或者汤姆的 BY 语句方法可能更好。如果您将要生成的 SAS 代码作为问题的一部分发布,人们可以更好地帮助您。请注意,宏语言所做的只是生成 SAS 代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2021-08-11
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多