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
* Опубликован: 29.12.2005.
Solution ID:	 	100000316	
Подтип вопроса:	 	Статистические распределения	
Заголовок:
Генерация многомерных нормальных данных с заданной ковариационной матрицей
 
Описание:
Вопрос: 
Как мне сгенерировать данные, имеющие многомерное нормальное распределение с той
ковариационной или корреляционной матрицей, котороую я укажу?

Ответ: 

В SPSS версий 4.0 и выше на неДОСовских платформах эта операция может быть выполнена с 
помощью матричного языка SPSS. Пользователи SPSS/PC+ или SPSSX мокут сделать
в SPSS часть этой работы, но некоторые вычисления матричной алгебры придётся сделать вне SPSS.
Подход, опирающийся на SPSS 4.0 здесь будет описан вначале, а затем мы расскажем, как это сделать
в SPSSX. Общий алгоритм описан в Rubinstein, R. (1981), "Simulation and the Monte Carlo Method", Wiley.


A) Метод SPSS 4.0 

Основная стратегия такова:
1. Перед вводом матрицы ковариаций сгенерируйте соответствующее число нормально
распределённых переменных, используя команду compute. Эти переменные будут иметь
многомерное нормальное распределение с корреляциями, близкими к 0, т.е. будут ПОЧТИ независимы.

2. Чтобы превратить этот набор переменных в вектор с многомерным нормальным распределением и СТРОГО независимыми (ортогональными) компонентами, используйте процедуру факторного анализа FACTOR(фактически - нужно провести анализ главных компонент) с переменными, созданными на первом шаге. Используйте метод извлечения по умолчанию (Principal Components - МГК), извлекая столько же
компонент, сколько переменных было включено в анализ. Сохраните эти переменные с помощью инструкции FACTOR /SAVE. Новые переменные будут многомерно нормально распределены, ортогональны друг другу(по алгоритму МГК) и иметь средние, равные 0 и дисперсии, равные 1.

3. Используя команды матричных операций, определите набор переменных, созданных на шаге 2 как матрицу Z, например. Затем определите целевую матрицу ковариаций S.

4. Вычислите множитель (фактор) Холецкого для целевой матрицы ковариаций. Это будет верхняя треугольная матрица, являющаяся "квадратным корнем" из ковариационной матрицы. Если V - это множитель Холецкого для матрицы S  и VT - 
транспонированная матрица V, тогда VT*V = S, где * - оператор умножения матриц.

5. Умножьте справа матрицу независимых нормальных величин Z на фактор Холецкого V для получения новой матрицы X. Если целевая матрица была матрицей корреляций и вы хотите, чтобы новые переменные имели стандартные отклонения, отличные от 1, тогда умножайте компоненты X на нужное стандартное отклонение. Если хотите, чтобы результирующие переменные имели ненулевое среднее, добавляйте
нужное среднее к X (но ПОСЛЕ умножения на стандартное отклонение).
Если целевая матрица не была корреляционной, то дисперсии новых переменных будут эквивалентны диагональным значениям целевой (т.е. ковариационной) матрицы. Средние будут равны 0. Нужные средние могут быть добавлены к переменным с помощью compute до или после закрытия команды матрицы (matrix).

6. Сохраните матрицу X, содержащую новые переменные, в активном файле SPSS и закройте команду matrix.

Пример использования этого алгоритма приведён ниже. Целевая матрица - 
матрица корреляций пяти переменных, которые надо сгенерировать. Я добавил несколько инструкций для вывода определителя и числа обусловленности для целевой матрицы чтобы проверить, не является ли она вырожденной или плохо обусловленной. Я также вывожу на печать произведение VT*V для того, чтобы проверить воспроизводимость целевой матрицы. Все новые переменные были отшкалированны таким образом, чтобы иметь среднее значение 100 и стандарт,
равный 15 перед закрытием команды matrix. 
 
input program. 
+ loop #i = 1 to 10000. 
+ do repeat response=r1 to r5 . 
+ compute response = normal(1) . 
+ end repeat. 
+ end case. 
+ end loop. 
+ end file. 
end input program. 
correlations r1 to r5 / statistics=descriptives. 
* Командой Factor мы вычисляем переменные pr1 - pr5 - полностью ортогональные многомерные нормальные с.в. 
factor variables = r1 to r5 / print = default det 
/criteria = factors(5) /save=reg (all,pr). 
* используем матричные команды для определения матрицы корреляций. 
* x есть матрица независимых стандартизированных нормальных с.в. размерности 10,000 на 5. 
* cor - целевая ковариационная матрица. 
* cho - фактор Холецкого для cor . 
* newx - новая матрица данных размерности 10,000 на 5, имеющая целевую ковариационную матрицу. 
matrix. 
get x / variables=pr1 to pr5. 
compute cor={1, 0.4, 0.3, 0.2, 0.1 ; 
0.4, 1, 0.4, 0.3, 0.2 ; 
0.3, 0.4, 1, 0.4, 0.3 ; 
0.2, 0.3, 0.4, 1, 0.4 ; 
0.1, 0.2, 0.3, 0.4, 1 }. 
compute deter=det(cor). 
print deter / title "определитель матрицы corr" / format=f10.7 . 
print sval(cor) / title "разложение по сингулярным числам матрицы corr". 
print eval(cor) / title "собственные значения corr". 
* В симметричных матрицах sval и eval будут идентичны; Используем первое. 
compute condnum=mmax(sval(cor))/mmin(sval(cor)). 
print condnum / title "число обусловленности матрицы corr" / format=f10.2 . 
compute cho=chol(cor). 
print cho / title "фактор Холецкого для матрицы corr" . 
compute chochek=t(cho)*cho. 
print chochek / title "Умножение фактора Холецкого слева на себя же, но транспонированного" /format=f10.2 . 
compute newx=x*cho. 
compute newx=newx*15 + 100. 
save newx /outfile=* /variables= nr1 to nr5. 
end matrix. 
correlations nr1 to nr5 / statistics=descriptives. 

B) Метод для пользователей SPSSX и SPSS/PC+ 
Если матричный язык недоступен, пользователи могут использовать множитель Холецкого прямо в команде compute и скорректировать стандартные нормальные переменные, полученные ранее, таким образом, чтобы они стали кореллированными.
Однако само разложение Холецкого (получение множителя) потребуется провести где-то в другом месте, вне SPSS. Алгоритм вычисления множителя Холецкого приведен в книге Рубинштейна, упоминавшейся выше и книге Bock (1975), "Multivariate 
Statistical Methods in Behavioral Research", McGraw-Hill.
Пример, приведённые ниже, применяет множитель Холецкого для целевой матрицы предыдущего примера. Матрица-множитель Холецкого приводится ниже. Для обработки каждой переменной требуется одна инструкция COMPUTE. Обратите внимания, что содержимое столбцов матрицы Холецкого выступают в качестве весов для исходный переменных и новые переменные строятся как взвешенные комбинации исходных.

Множитель Холецкого для целевой корреляционной матрицы из примера выше:
1.0 0.4 0.3 0.2 0.1 
0 0.91652 0.30551 0.24004 0.17457 
0 0 0.9037 0.29508 0.23976 
0 0 0 0.90294 0.29608 
0 0 0 0 0.90243 
* SPSS-X, SPSS или SPSS/PC+: предполагаем, что в активном файле уже существуют 5 независимых случайных переменных, созданных как compute r1=normal(1). 
correlations r1 to r5 / statistics=descriptives. 
* Данная корреляционная матрица должна быть почти единичной: единицы на главной диагонали и нули в остальных местах. 
factor variables = r1 to r5 / print = default det 
/criteria = factors(5) /save=reg (all,pr). 
correlations pr1 to pr5 / statistics=descriptives. 
* Данная корреляционная матрица является единичной матрицей. 
* используем серию команд compute для умножения справа матрицы данных на матрицу-множитель Холецкого, вычисленную вне spss . 
compute nr1 = pr1. 
compute nr2 = 0.4*pr1 + 0.91652*pr2 . 
compute nr3 = 0.3*pr1 + 0.30551*pr2 + 0.9037*pr3. 
compute nr4 = 0.2*pr1 + 0.24004*pr2 + 0.29508*pr3 + 0.90294*pr4. 
compute nr5 = 0.1*pr1 + 0.17457*pr2 + 0.23976*pr3 + 0.29608*pr4 + 0.90243*pr5. 
correlations nr1 to nr5 / statistics=descriptives. 
* Корреляционная матрица должна быть целевой корреляционной матрицей.