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
147
148
149
150
*****Если даже через модуль TABLES не удаётся получить нужный вид.
* таблицы, решение - построить табличку "вручную".

*(Вопрос)
Последние несколько месяцев я занимаюсь поэлементным анализом одного теста и мне необходимо определённым образом выводить результаты обработки в SPSS. В частности, имеются переменные CI1, Q1, CI2,
Q2, CI3, Q3, и т.д...  Переменные CI1, CI2, CI3, и т.д. содержат, был ли ответ верным или неверным (или пропущенным) и закодированы следующим образом:

   -3=Пропуск       -2=Верно   -1=Неверно

с метками, заданными как…

value label ci1 -3'пропуск' -2'верно' -1'неверно'.

Возможные значения переменных q1, q2, и т.д.: 0, 1, 2, 3, 4,
где цифры обозначают выбранный вариант ответа.

Следующая таблица даёт почти то, что мне нужно:
variable label ci1 'q1' / ci2 'q2' /ci3 'q3'.
   * Частотная таблица.
TABLES
  /FORMAT BLANK MISSING('.') /TABLES
  (LABELS)  BY
  ( ci1 + q1 + ci2 + q2 + ci3 + q3 + ci4 + q4 +
    ci5 + q5 + ci6 + q6 + ci7 + q7 + ci8 + q8 + ci9 + q9 +
    ci10 + q10 + ci11 + q11 + ci12 + q12 + ci13 + q13 +
    ci14 + q14 + ci15 + q15 + ci16 + q16 + ci17 + q17 +
    ci18 + q18 + ci19 + q19 + ci20 + q20)
  /STATISTICS COUNT ((F5.0) '' )
       CPCT ((PCT7.1) '') .

Как только я получаю результат, я видоизменяю таблицу с помощью pivot table и получаю следующее:

         Верно Неверно Пропуск  0     1     2     3     4
    Q1    51    23
          68%   31%
                                  1     2    51     20
                                  1%    3%   69%    27%

    Q2    69    5
          93%   7%
                           69     5
                           93%    7%
    Q3    69    5		1
          93%   6%
                                  2     3    69
                                  3%    4%   93%

и т.д...

Однако что мне действительно нужно, это вот что::

         Right Wrong Blank  0     1     2     3     4

    Q1    51    23                1     2    51     20
          68%   31%               1%    3%   69%    27%

    q2    69    5          69     5
          93%   7%         93%    7%

    q3    69    5       1         2     3    69
          93%   6%                3%    4%   93%

То есть табличка должна быть сжата по вертикали - распределение ответов на вопрос должно находиться в той же строке, что и распределение верных и неверных ответов.

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


* Сгенерируем данные чтобы продемонстрировать работу.
INPUT PROGRAM.
VECTOR ci(20F8.0) /q(20F8.0).
LOOP cnt=1 TO 120.
LOOP #cnt=1 TO 20.
COMPUTE ci(#cnt)=TRUNC(UNIFORM(1)+.5)-3.
COMPUTE q(#cnt)=TRUNC(UNIFORM(4)+.5).
IF (UNIFORM(1)<.005) ci(#cnt)=-1.
END LOOP.
END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
EXECUTE.

* Начинаем обработку.
* Преобразуем из "широкого" в "высокий" формат.
VECTOR ci=ci1 to ci20 / q=q1 to q20.
LOOP q=1 TO 20.
COMPUTE answeri=ci(q).
COMPUTE answer=q(q).
XSAVE OUTFILE='c:\\temp\\temp.sav' /KEEP=q answer answeri.
END LOOP.
EXECUTE.
GET FILE='c:\\temp\\temp.sav'.
FORMATS q(F4.0).

* Распределим данные из двух переменных по 5 колонкам - одной для каждого варианта и 3 колонкам для верного/неверного/пропущенного ответа.
VECTOR q(5F2.0) /qi(3F2.0).
COMPUTE qi(answeri + 4)=1.
COMPUTE q(answer+1)=1.
AGGREGATE
  /OUTFILE=*
  /BREAK=q
  /qi1 TO qi3 = SUM(qi1 TO qi3) /q1 TO q5 = SUM(q1 TO q5) .

* Подсчитаем проценты.
COMPUTE #sum1=SUM(qi1 TO qi3).
VECTOR nb=qi1 TO q5 /pc(8F8.2).
LOOP #=1 TO 8.
COMPUTE pc(#)=nb(#)/#sum1.
END LOOP.

* Поместим проценты в те же колонки, что и абсолютные частоты.
VECTOR col=qi1 TO pc8 /c(8F8.2).
LOOP #=1 TO 2.
COMPUTE #base=(#-1)*8.
LOOP #idx=1 TO 8.
COMPUTE c(#idx)=col(#base + #idx).
END LOOP.
XSAVE OUTFILE='c:\\temp\\temp2.sav' /KEEP=q c1 TO c8.
END LOOP.
EXECUTE.
GET FILE='c:\\temp\\temp2.sav'.

* К этому этапу все необходимые цифры подсчитаны. Можно выводить табличку.
SUMMARIZE
  /TABLES=q c1 c2 c3 c4 c5 c6 c7 c8
  /FORMAT=VALIDLIST NOCASENUM TOTAL
  /TITLE='Сводка'
  /MISSING=VARIABLE
  /CELLS=COUNT .

* Но можно ещё сделать пару "косметических" усовершенствований (покажем % и зададим метки).
* Это требует создания строковых переменных.
VECTOR col(8A5) /c=c1 TO c8.
LOOP #=1 TO 8.
DO IF MOD($CASENUM,2)=1.
COMPUTE col(#)=STRING(c(#),F4.0).
ELSE.
COMPUTE col(#)=STRING(c(#)*100,PCT3.0).
END IF.
END LOOP.
EXECUTE.

VARIABLE LABEL col1 'Верно' col2 'Неверно' col3 'Пропуск' 
	col4 '0' col5 '1' col6 '2' col7 '3' col8 '4'. 
SUMMARIZE
  /TABLES=q col1 TO col8
  /FORMAT=VALIDLIST NOCASENUM TOTAL
  /TITLE='Анализ теста'
  /MISSING=VARIABLE
  /CELLS=NONE.