1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
* Тема: Множественные проверки Манна-Уитни.
* Ключевые слова: проверка, тест, критерий, Манн-Уитни, Mann-Whitney, test, множественное, сравнение, сочетания, цикл, LOOP, макрос, Kruskal-Wallis, Краскала-Уоллиса.
* Опубликован: в SPSSX-L 03.01.2002, перевод: 27.10.2008.
* Автор: rlevesque@videotron.ca.
* Перевод: А. Балабанов.
* Размещение: http://www.spsstools.ru/Syntax/T-Test/MultipleMann-WhitneyTests.txt (.sps).
* Проверено: SPSS 15.0.0.


*(Вопрос) Есть проблема со следующим макросом:

DEFINE multi(depvar=!CHAREND ('/') /factor=!CHAREND ('/') /min=!CHAREND
('/') /max=!CMDEND ).
DO IF $CASENUM=1.
WRITE OUTFILE "c:\\temp\\multiman.sps"
/"NPAR TESTS".
LOOP #I=!min to !max-1.
LOOP #J=#I+1 to !max.
WRITE OUTFILE "c:\\temp\\multiman.sps"
/ "  /M-W= !depvar BY !factor (" #I #J ")".
END LOOP.
END LOOP.
WRITE OUTFILE "c:\\temp\\multiman.sps" /".".
END IF.
EXECUTE.
INCLUDE FILE="c:\\temp\\multiman.sps".
!ENDDEFINE.

* Его задача - выполнить множественные проверки Манна-Уитни (Mann-Whitney) после проверки
Краскала-Уоллиса (Kruskal-Wallis). Но SPSS отказывается выполнять любые статистические процедуры 
внутри цикла LOOP. Я поэтому постарался использовать цикл чтобы записать файл синтаксиса
(multiman.sps), который бы включал весь набор инструкций, и запустить этот файл через INCLUDE.

* Пример *.

DATA LIST LIST /actype (F8.0) glucose (F8.0).
BEGIN DATA
1 51
1 56
1 58
1 60
1 62
2 60
2 65
2 66
2 68
2 68
3 69
3 73
3 74
3 78
3 79
4 70
4 75
4 76
4 77
4 79
END DATA.

multi depvar=glucose /factor=actype /min=1 /max=4.

* Когда я пытаюсь выполнить этот макрос, то получаю сообщения об ошибках, связанных с именами
!depvar и !factor, которые, видимо, распознаются только внутри макроса.

* То есть, непосредственно проблема в следующем:

* Созданный "multiman.sps" выглядит следующим образом:

NPAR TESTS
  /M-W= !depvar BY !factor (    1.00    2.00)
  /M-W= !depvar BY !factor (    1.00    3.00)
  /M-W= !depvar BY !factor (    1.00    4.00)
  /M-W= !depvar BY !factor (    2.00    3.00)
  /M-W= !depvar BY !factor (    2.00    4.00)
  /M-W= !depvar BY !factor (    3.00    4.00)
.

* А чтобы заставить его работать, я бы хотел, чтобы он выглядел вот так:

NPAR TESTS
  /M-W= glucose BY actype  (    1.00    2.00)
  /M-W= glucose BY actype  (    1.00    3.00)
  /M-W= glucose BY actype  (    1.00    4.00)
  /M-W= glucose BY actype  (    2.00    3.00)
  /M-W= glucose BY actype  (    2.00    4.00)
  /M-W= glucose BY actype  (    3.00    4.00)
.

Как мне записать эти имена переменных в multiman.sps?



**************************************************.
*(Ответ) Автор: rlevesque@videotron.ca, размещено в SPSSX-L 03.01.2002.
**************************************************.

SET MPRINT=no.
*////////////////.
DEFINE multi(depvar=!CHAREND('/') /factor=!CHAREND('/') 
	/min=!CHAREND('/') /max=!CMDEND)
STRING depvar factor(A8).
COMPUTE depvar=!QUOTE(!depvar).
COMPUTE factor=!QUOTE(!factor).
DO IF $CASENUM=1.
WRITE OUTFILE "c:\\temp\\multiman.sps" /"NPAR TESTS".
LOOP #I=!min to !max-1.
LOOP #J=#I+1 to !max.
WRITE OUTFILE "c:\\temp\\multiman.sps"
 /"  /M-W= "depvar" BY "factor" (" #I #J ")".
END LOOP.
END LOOP.
WRITE OUTFILE "c:\\temp\\multiman.sps" /".".
END IF.
EXECUTE.
INCLUDE FILE="c:\\temp\\multiman.sps".
!ENDDEFINE.
*////////////////.

* Пример *.

DATA LIST LIST /actype (F8.0) glucose (F8.0).
BEGIN DATA
1 51
1 56
1 58
1 60
1 62
2 60
2 65
2 66
2 68
2 68
3 69
3 73
3 74
3 78
3 79
4 70
4 75
4 76
4 77
4 79
END DATA.

SET MPRINT=yes.
multi depvar=glucose /factor=actype /min=1 /max=4.