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
* Автор: David Marso.
* Опубликован: 09.12.2005.

/***********************************************************/
/* Макрос SPSS: */
/* Доверительный интервал по методу бутстреп для альфа Кронбаха */
/* Требует указания трёх аргументов: */
/* NSAMP: число выборок бутстреп */
/* VARLIST: набор переменных, составляющих шкалу */
/* INTWID : доверительный интервал (95 = 95%) */
/* Пример : !CA_BOOT NSAMP 2000 */
/* / VARLIST V1 TO V10 */
/* / INTWID 95 */
/* */
/* Внимание: Этот макрос создаёт и удаляет два файла в текущей рабочей директории */
/* 'NMACRO.INC' и 'BOOTSAMP.SAV'. Исходный файл данных сохраняется как */
/* 'RAWDATA.SAV' и затем восстанавливается после завершения работы макроса. */

/***********************************************************/.

DEFINE !CA_BOOT (NSAMP !CHAREND('/')
/VARLIST !CHAREND('/')
/ INTWID !CMDEND ).

*0 Сохраняем исходный файл данных после добавления ключевой переменной *.
COMPUTE BOOTID=$CASENUM.
SAVE OUTFILE 'RAWDATA.SAV'.

*1 Находим размер выборки и создаём макрос для неё *.
COMPUTE NOBREAK=1.
AGGREGATE OUTFILE * / PRESORTED / BREAK=NOBREAK / N=N.
WRITE OUTFILE 'NMACRO.INC' 
/ 'DEFINE !NCASE ( ) ',N,' !ENDDEFINE '.
EXECUTE.
SET ERRORS OFF.
INCLUDE 'NMACRO.INC'.
SET ERRORS ON.

*2 Строим выборки бутстреп * .
VECTOR #SUBJ( !NCASE).
LOOP SAMPLE=1 TO !NSAMP.
* Инициализируем вектор индикаторов наблюдений * .
+ LOOP #I=1 TO !NCASE.
+ COMPUTE #SUBJ(#I)=0.
+ END LOOP.

*3 Отмечаем для каждого наблюдения сколько раз оно должно войти в выборки *.
+ LOOP #ITER=1 TO !NCASE.
+ COMPUTE INDEX=TRUNC(UNIFORM(!NCASE))+1.
+ COMPUTE #SUBJ(INDEX)=#SUBJ(INDEX)+1.
+ END LOOP.

*4 Записываем наблюдения и вес для каждой выборки бутстреп *. 
+ LOOP BOOTID=1 TO !NCASE.
+ DO IF #SUBJ(BOOTID) > 0.
+ COMPUTE BOOTWGT=#SUBJ(BOOTID) .
+ XSAVE OUTFILE 'BOOTSAMP.SAV' / KEEP SAMPLE BOOTID BOOTWGT. 
+ END IF.
+ END LOOP.
END LOOP.
EXECUTE.

*5 Присоединяем исходный файл с помощью ключевой таблицы *.
GET FILE 'BOOTSAMP.SAV' .
SORT CASES BY BOOTID.
MATCH FILES FILE * / TABLE 'RAWDATA.SAV' / BY BOOTID.

*6 Взвешиваем наблюдения по числу их вхождений в выборки *.
WEIGHT BY BOOTWGT.

*7 Рассчитываем альфу Кронбаха для каждой выборки * .
COMPUTE SCALE = SUM(!VARLIST).
AGGREGATE OUTFILE *
/ BREAK SAMPLE
/ !VARLIST SCALE=SD(!VARLIST SCALE).
DO REPEAT V=!VARLIST SCALE.
COMPUTE V=V**2.
END REPEAT.
COMPUTE NV=NVALID(!VARLIST).
COMPUTE C_ALPHA =(NV/(NV-1))*(1-(SUM(!VARLIST)/SCALE)).

* 8 Находим нижнюю и верхнюю доверительные границы для альфы * .
SORT CASES BY C_ALPHA.
COMPUTE #=#+1.
COMPUTE CPCT=#/!NSAMP.
COMPUTE #IW=!INTWID/100.
SELECT IF (CPCT <=(1-#IW)/2) OR (CPCT >= 1-(1-#IW)/2 ).
COMPUTE TAG=CPCT > (1-#IW)/2.
MATCH FILES FILE * 
/ FIRST=TOP / LAST=BOT
/ BY TAG 
/ KEEP C_ALPHA CPCT TAG.
SELECT IF (NOT (TAG) AND BOT) OR (TAG AND TOP).
DO IF TAG.
COMPUTE LCL=LAG(C_ALPHA).
COMPUTE UCL=C_ALPHA.
PRINT /!QUOTE(!CONCAT(!INTWID,"% доверит интервал для альфа Кронбаха")) /!QUOTE(!CONCAT("Основан на ",!NSAMP," выборках")) /"Нижняя граница=",LCL,' Верхняя граница=',UCL .
END IF.
EXECUTE.
SELECT IF TOP.
EXECUTE.
ERASE FILE 'BOOTSAMP.SAV'.
ERASE FILE 'NMACRO.INC'.
GET FILE 'RAWDATA.SAV'.
!ENDDEFINE .


* Создаём файл данных и запускаем макрос * .
* (случайно генерируем данные) *.

INPUT PROGRAM.
LOOP #CASE=1 to 33.
COMPUTE #SEED=NORMAL(1).
DO REPEAT V=V1 TO V10.
COMPUTE V=.7 * #SEED + NORMAL(1).
END REPEAT.
END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
* END OF DATA SIMULATION *.

* Запускайте макрос следующей командой.
* Измениет 2000 на то количество бутстреп-выборок, которое вам необходимо.
* Измените  V1 TO V10 на ваш список переменных .
* Измените 95 на доверительный уровень, который желаете получить.

!CA_BOOT NSAMP=2000 / VARLIST V1 TO V10 / INTWID 95 .