Макропеременные SAS в PROC MIXED

Это моя первая попытка использовать макросы SAS, и я слежу за этой страницей от удивительной консалтинговой группы UCLA Stats Consulting Group. Меня интересует использование макропеременных в 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;

Пример UCLA показывает, как использовать макропеременные с 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;

person emudrak    schedule 19.07.2016    source источник


Ответы (1)


Ваша проблема не имеет ничего общего с макропеременными или кодом макроса. Вместо этого вы не создаете допустимый оператор MODEL для использования в PROC MIXED.

Оператор 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;
person Tom    schedule 19.07.2016
comment
Вот почему я был заинтересован в макропеременных. Когда я использую их в proc reg (последний блок кода), он выполняет пять регрессий с одним ответом на каждую (пять макропеременных по очереди), а не одну многомерную регрессию с пятью переменными ответа. Я ожидал, что это произойдет с PROC MIXED. Разве мы не можем использовать с ним макропеременные, чтобы получить пять смешанных моделей, каждая из которых имеет отдельную переменную одного ответа? Без написания блока кода более 5 раз? - person emudrak; 19.07.2016
comment
Не согласно документации. Вам нужно будет создать несколько шагов PROC MIXED. Вы можете преобразовать данные так, чтобы значение каждой переменной отображалось в отдельных наблюдениях, а затем использовать оператор BY. Тот, кто лучше разбирается в MIXED, может знать другой метод. - person Tom; 19.07.2016
comment
Из документации, которую процитировал Том, похоже, нет, оператор модели PROC MIXED не разрешает список переменных для зависимой переменной. Я бы начал с написания кода SAS, чтобы запускать 3 модели, как вы хотите. И получите работающий код SAS. Затем вы, вероятно, можете использовать макроязык для генерации кода для этих 3 моделей (или 300). Или подход Тома BY, вероятно, лучше. Если вы опубликуете код SAS, который хотите сгенерировать, как часть своего вопроса, люди смогут лучше вам помочь. Обратите внимание, что все, что делает макроязык, это генерирует код SAS. - person Quentin; 19.07.2016