2016-07-19 2 views
0

Это мой первый набег на использование макросов SAS, и я следую this page из удивительной консалтинговой группы UCLA Stats. Я заинтересован в использовании макропеременных в PROC MIXED, чтобы избежать копирования и вставки блоков кода (у моего фактического набора данных есть ~ 400 переменных).SAS макропеременные в PROC MIXED

Мой пример изменяет пример 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 рег сделать несколько простых модели линейной регрессии для прогнозирования чтения счета с любым из других переменных:

%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

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

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

Не в соответствии с документацией. Вам нужно будет генерировать mulitple PROC MIXED. Вы можете преобразовать данные так, чтобы значение каждой переменной отображалось в отдельных наблюдениях, а затем использовало оператор BY. Кто-то, кто лучше понимает MIXED, может знать другой метод. – Tom

+0

Из документации, процитированной Том, она выглядит как нет, инструкция модели PROC MIXED не позволяет список переменных для зависимой переменной. Я бы начал с написания кода SAS, чтобы сделать 3 модели, как вам хотелось бы. И получите это, чтобы работать с кодом SAS. Затем вы можете использовать макроязык для генерации кода для этих трех моделей (или 300). Похоже, что подход Tom's BY Statement лучше. Если вы публикуете код SAS, который хотите сгенерировать как часть вашего вопроса, люди могут помочь вам лучше. Обратите внимание, что весь макроязык - это код SAS. – Quentin

Смежные вопросы