Як створити довільну матрицю коваріації


21

Наприклад, в R, MASS::mvrnorm()функція корисна для генерації даних для демонстрації різних речей у статистиці. Він бере обов'язковий Sigmaаргумент, який є симетричною матрицею, що визначає коваріаційну матрицю змінних. Як би я створив симетричну матрицю з довільними записами?n×n


3
Я думаю, що це питання вигодило б відредагувати, щоб зосередитись на тому, як "я можу створити довільну коваріаційну матрицю" та менше на аспект кодування. Тут, безумовно, є актуальна статистика, про що свідчить відповідь.
Срібна рибка

Відповіді:


22

Створіть матрицю An×nA з довільними значеннями

а потім використовувати Σ=ATA в якості матриці коваріації.

Наприклад

n <- 4  
A <- matrix(runif(n^2)*2-1, ncol=n) 
Sigma <- t(A) %*% A

Точно так же, Sigma <- A + t(A).
rsl

6
@MoazzemHossen: Ваша пропозиція створить симетричну матрицю, але вона не завжди може бути позитивною напівдекітністю (наприклад, ваша пропозиція може створити матрицю з негативними власними значеннями), і тому вона може не бути придатною як матриця коваріації
Генрі

Так, я помітив, що R повертає помилку в тому випадку, якщо запропонований нами спосіб створив непридатну матрицю.
rsl

4
Зауважте, що якщо ви віддаєте перевагу кореляційній матриці для кращої інтерпретаційності, існує функція ? Cov2cor , яку можна застосувати згодом.
gung - Відновіть Моніку

1
@ B11b: Вам потрібна матриця коваріації, щоб вона була напіввизначеною. Це поставило б деякі обмеження на значення коваріації, не зовсім очевидні, коли n>2
Генрі

24

Мені подобається контролювати об’єкти, які я створюю, навіть коли вони можуть бути довільними.

Тоді розглянемо, що всі можливі матриць коваріації Σ можна виразити у виглядіn×nΣ

Σ=P Diagonal(σ1,σ2,,σn) P

де - ортогональна матриця і σ 1σ 2σP .σ1σ2σn0

Геометрично це описує структуру коваріації з діапазоном основних компонентів розмірів . Ці компоненти вказують в напрямках рядків P . Див. Малюнки, присвячені аналізу основного компонента, власних векторів та власних значень для прикладів з n = 3 . Встановлення σ i встановить величини коваріацій та їх відносні розміри, тим самим визначивши будь-яку бажану еліпсоїдальну форму. Ряди Р орієнтують осі фігури, як вам зручніше.σiPn=3σiP

Одна алгебраїчна та обчислювальна перевага цього підходу полягає в тому, що при ,σn>0 легко інвертується (що є звичайною операцією на коваріаційних матрицях):Σ

Σ1=P Diagonal(1/σ1,1/σ2,,1/σn) P.

σin2n

n <- 5
p <- qr.Q(qr(matrix(rnorm(n^2), n)))

n

ΣPσicrossprodRσ=(σ1,,σ5)=(5,4,3,2,1)

Sigma <- crossprod(p, p*(5:1))

σP

svd(Sigma)

Зворотний Sigmaзвичайно отримується лише шляхом зміни множення наσ

Tau <- crossprod(p, p/(5:1))

zapsmall(Sigma %*% Tau)n×nσi01/σiσi


P

1
Можливо, варто згадати, що поодинокі значення svd(Sigma)будуть перепорядковані - це на хвилину збентежило мене.
FrankD

1

Ви можете імітувати випадкові позитивні певні матриці з розподілу Wishart за допомогою функції "rWishart" з широко використовуваного пакету "stats".

n <- 4
rWishart(1,n,diag(n))

1

Існує спеціально для цього пакет, clusterGeneration (написаний серед інших Гаррі Джо, великим ім'ям у цій галузі).

Є дві основні функції:

  • genPositiveDefMat генерують коваріаційну матрицю, 4 різні методи
  • rcorrmatrix : генерувати кореляційну матрицю

Короткий приклад:

library(clusterGeneration)
#> Loading required package: MASS
genPositiveDefMat("unifcorrmat",dim=3)
#> $egvalues
#> [1] 15.408962  5.673916  1.228842
#> 
#> $Sigma
#>          [,1]     [,2]     [,3]
#> [1,] 6.714871 1.643449 6.530493
#> [2,] 1.643449 6.568033 2.312455
#> [3,] 6.530493 2.312455 9.028815
genPositiveDefMat("eigen",dim=3)
#> $egvalues
#> [1] 8.409136 4.076442 2.256715
#> 
#> $Sigma
#>            [,1]       [,2]      [,3]
#> [1,]  2.3217300 -0.1467812 0.5220522
#> [2,] -0.1467812  4.1126757 0.5049819
#> [3,]  0.5220522  0.5049819 8.3078880

Створено 2019-10-27 пакетом reprex (v0.3.0)

Нарешті, зауважте, що альтернативний підхід - це спершу спробувати з нуля, а потім використовувати, Matrix::nearPD()щоб ваша матриця була позитивно визначеною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.