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
*(Вопрос) Когда сравниваем две группы (экспериментальную и контрольную), 
бывает полезно учесть неоднородность этих групп, которая может сильно искажать результаты.
Так, в одной группе могут оказаться более тяжёлые пациенты, чем в другой. Один из 
способов нейтрализации неоднородностей групп - подбор контрольной группы на основе
т.н. propensity score - показателя схожести с экспериментальной группой. Идея такова, что
сравнивать нужно наблюдения из разных групп, похожие друг на друга, то есть, со схожими propensity scrores.
Один из способов создания propensity scores - логистическая регрессия. Я всё это сделал и,
в результате, получил следующие переменные в файле данных:
A. Переменная группы. Указывает, находился ли пациент в контрольной или экспериментальной группе (0 или 1).
B. Переменная со значениями propensity. Показывает шансы пациента находиться в экспериментальной
группе при его характеристиках (по полу, возрасту, истории болезни и т.д., т.е. по тем предикторам, 
которые использовались в логистической регрессии).
C. Переменная с результатами лечения (абсолютные или процентные показатели улучшения).

Теперь передо мной стоит уже не теоретический или статистический вопрос, а, скорее, технический:
определить номера пациентов, составляющих "улучшенную" контрольную группу
(похожую на экспериментальную). Более точно, требуется новая переменная, в которой
для каждой строки с пациентом из экспериментальной группы будет содержаться % улучшения
для наиболее похожего на него пациента из контролькной группы.

*(Ответ) Размещён в SPSSX-L, автор: rlevesque@videotron.ca, 7.11.2001.
* http://www.spsstools.net

* Решение предполагает, что число наблюдений в экспериментальной группе известно.
* Если необходимо, это ограничение можно релаксировать доработкой синтаксиса.

* Создадим данные для примера.

INPUT PROGRAM.
SET SEED=2365847.
LOOP caseid=1 TO 20.
COMPUTE treatm=TRUNC(UNIFORM(1)+.5).
COMPUTE propen=UNIFORM(100).
COMPUTE improv=UNIFORM(100).
END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
SORT CASES BY treatm(D) propen.
COMPUTE idx=$CASENUM.
SAVE OUTFILE='c:\\temp\\mydata.sav'.

* Удалим ранее созданный файл результатов, если таковой имелся.
ERASE FILE='c:\\temp\\results.sav'.
COMPUTE key=1.
SELECT IF (1=0).
* Создадим пустой файл, в который быдем записывать результаты.
SAVE OUTFILE='c:\\temp\\results.sav'.

********************************************.
* Определим рабочий макрос.
********************************************.

SET MPRINT=no.
*////////////////////////////////.
DEFINE !match (nbtreat=!TOKENS(1))
!DO !cnt=1 !TO !nbtreat
GET FILE='c:\\temp\\mydata.sav'.
SELECT IF idx=!cnt OR treatm=0.

DO IF $CASENUM=1.
COMPUTE #target=propen.
ELSE.
COMPUTE delta=propen-#target.
END IF.
EXECUTE.
SELECT IF ~MISSING(delta).
IF (delta<0) delta=-delta.

SORT CASES BY delta.
SELECT IF $CASENUM=1.
COMPUTE key=!cnt.
ADD FILES FILE=* 
	/FILE='c:\\temp\\results.sav'.
SAVE OUTFILE='c:\\temp\\results.sav'.
!DOEND
!ENDDEFINE.
*////////////////////////////////.

SET MPRINT=yes.

**************************.
* Вызовем макрос (мы знаем, что в экспериментальной группе есть 7 наблюдений).
**************************.
!match nbtreat=7.

* Отсортируем файл результатов, чтобы можно было выполнить слиянеие.

GET FILE='c:\\temp\\results.sav'.
SORT CASES BY key.
SAVE OUTFILE='c:\\temp\\results.sav'.

* Сопоставим каждому наблюдению из экспериментальной группы наиболее похожее наблюдение из контрольной.

GET FILE='c:\\temp\\mydata.sav'.
MATCH FILES /FILE=*
 /FILE='C:\\Temp\\results.sav'
 /RENAME (idx = d0) caseid=caseid2 improv=improv2 propen=propen2
  treatm=treatm2 key=idx
 /BY idx
 /DROP= d0.
EXECUTE.

* Готово!.