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
* Вопрос: Как мне рандомизировать наблюдения из разных (несвязанных) выборок чтобы составить пары для T-проверки связанных выборок?
* Обратите внимание, что пример файла данных в коде ОТСУТСТВУЕТ. 

* Условия запуска макроса.
* Контрольные переменные (control) имеют целые значения от 0 до 9.
* Переменные, задающие выборки (sample), имеют значение 1 (для одной выборки) либо какие-то другие значения (для другой выборки).
* Максимальная длина имён контрольных переменных -  7.
* (это связано с тем, что в ходе решения к их имени добавляется символ "1").
* В выборках в сумме менее 100,000 наблюдений.

* Указанные ограничения могут быть сняты за счёт доработки предлагаемого макроса.
* Автор: Raynald Levesque, Raynald@spsstools.net

*Измените установку с OFF на ON, если вам нужны более подробные сведения в окне результатов.
SET MPRINT=OFF.

*////////////////////////////////////////// Начало определения макроса ////////////////////////////.

DEFINE !paired (sample	=!CHAREND('/')
		/control	=!CHAREND('/')
		/dv	=!CHAREND('/')
		/fname	=!DEFAULT("") !CMDEND)
*GET FILE='C:\\temp\\riskfact.sav'.

*Создадим единую группирующую переменную
* как коды всевозможных комбинаций уровней контрольных переменных.
COMPUTE criter=0.
!DO !var !IN (!control)
+	COMPUTE criter=criter*10 + !var.
!DOEND.

EXECUTE.

SELECT IF(~MISSING(criter)).
COMPUTE draw=UNIFORM(1).
SORT CASES BY !sample criter.
RANK
  VARIABLES=draw  (A) BY !sample criter  /RANK /PRINT=YES
  /TIES=MEAN .

SORT CASES BY criter rdraw.

*Вычислим критерий составления пар из разных выборок.
COMPUTE criter2=criter*100000+rdraw.
SAVE OUTFILE='C:\\temp\\all_data.sav'.
SELECT IF (!sample=1).
SAVE OUTFILE='C:\\temp\\normal pop.sav'.

GET FILE='C:\\temp\\all_data.sav'.
SELECT IF (!sample<>1).


!DO !var !IN (!control)
+	RENAME VARIABLES (!var=!CONCAT(!var,1)).
!DOEND.
!LET !dv1=!NULL.
!DO !var !IN (!dv)
+	RENAME VARIABLES (!var=!CONCAT(!var,1)).
+	!LET !dv1=!CONCAT(!dv1," ",!var,1)
!DOEND.

RENAME VARIABLES (rdraw=rdraw1).
SAVE OUTFILE='C:\\temp\\pathological pop.sav'.

MATCH FILES /FILE=*
 /FILE='C:\\temp\\normal pop.sav'
 /RENAME (!sample = d0)
 /BY criter2
 /DROP=d0.

* Next line is to keep only cases which have a match.
SELECT IF (~MISSING(!dv) AND ~MISSING(!dv1)).
EXECUTE.


!IF (!LENGTH(!fname) !NE 0) !THEN
SAVE OUTFILE=!QUOTE(!CONCAT('C:\\temp\\',!fname,'.sav')).
!IFEND

T-TEST
  PAIRS= !dv  WITH !dv1 (PAIRED)
  /CRITERIA=CIN(.95)
  /MISSING=ANALYSIS.
!ENDDEFINE.
*////////////////////////////////////////// Конец определения макроса /////////////////////////////////////.


**** Пример 1: вызов макроса для подвыборок labfibg ****.

!paired 	sample	=labfibg 
	/control	=altgrp1 sex rr2grp diabet nikotin
	/dv	= Іbag Іher
	/fname	=labfibg controling for 5 var. 

*Макропеременные:
*sample		=переменная, задающая выборки.
*control	=контрольные переменные.
*dv 		=зависимые переменные.
*fname		=имя файла для записи рандомизированных пар.
*		(оставьте этот параметр пустым, если сохранение результата рандомизации не требуется).

**** Пример 2: вызов макроса для подвыборок l_cholgr ****.

!paired 	sample	= l_cholgr
	/control	=altgrp1 sex rr2grp nikotin gewicht 
	/dv	= Іbag Іher
	/fname	=. 

* Примеч. к примеру 2: параметр fname остался пустым - результаты рандомизации не будут сохранены в отдельный файл.