Як генерувати випадкову матрицю кореляції, яка має приблизно нормально розподілені позадіагональні записи із заданим стандартним відхиленням?


11

Я хотів би створити випадкову кореляційну матрицю таким, щоб розподіл її позадіагональних елементів виглядав приблизно як нормальний. Як я можу це зробити?

Мотивація така. Для набору даних із часових рядів кореляційний розподіл часто виглядає досить близьким до нормального. Я хотів би генерувати багато "нормальних" кореляційних матриць для представлення загальної ситуації та використовувати їх для обчислення кількості ризику.n


Я знаю один метод, але отримане стандартне відхилення (розподілу недіагональних елементів) занадто мало для моєї мети: генерувати рівномірних або нормальних випадкових рядків матриці \ mathbf X , стандартизувати рядки (віднімати середнє значення, ділимо на стандартне відхилення), тоді матриця кореляції вибірки \ frac {1} {n-1} \ mathbf X \ mathbf X ^ \ top зазвичай розподіляє позадіагональні записи [ Оновити після коментарів: стандартне відхилення буде \ sim n ^ {-1/2} ].XnX1n1XXn1/2

Чи може хтось запропонувати кращий метод, за допомогою якого я можу контролювати стандартне відхилення?


1
@Richard, дякую за запитання. На жаль, описаний вище метод не дасть записів, які зазвичай розподіляються. Діагоналі дорівнюють 1 імовірності одна, а позадіагоналі обмежені між і . Тепер масштабовані записи перейдуть асимптотично до нормального розподілу, орієнтованого навколо нуля. Чи можете ви дати нам більше інформації про проблему, яку ви насправді намагаєтеся вирішити? І чому ви хочете "нормально розподіляти" діагоналі? 1+1
кардинал

1
@ Річард, що я маю на увазі, припустимо, що і - два незалежні вектори, такі, що записи кожного з них є стандартними нормальними. Обчислити ; тобто зразок кореляції між і . Тоді у розподілі до стандартної нормальної випадкової величини. Під перерахунком я мав на увазі множення на , що потрібно для отримання не виродженого обмежуючого розподілу. X=(X1,X2,,Xn)Y=(Y1,Y2,,Yn)ρ^n=sxy/(sxsy)XYn1/2ρ^nn1/2
кардинал

1
@ Річард, суть "проблеми" полягає в тому, що, зробивши два обмеження (а), що норми кожного рядка дорівнюють 1 і (б), що записи генеруються з випадкової вибірки, ви обов'язково змушуєте кореляції бути досить малий (на порядок . Причина полягає в тому, що ви не можете мати довільно великих кореляцій між рядками і все-таки отримувати норми кожного ряду, щоб бути 1 при наявності такої великої незалежності.n1/2
кардинал

1
... тепер ви можете отримати більші кореляції за величиною, спочатку співвідносивши рядки між собою перед перенормовуванням. Але у вас, по суті, є лише один параметр, з яким і асимптотичне середнє значення, і дисперсія будуть прив'язані до цього параметра. Отже, це, мабуть, також не дасть вам гнучкості, яку, здається, хочете.
кардинал

1
Звичайно, візьмемо простий випадок. Викличте генеруючу матрицю , яка будемо вважати без втрати загальності. Тепер, генерувати стовпці з в якості н.о.р. векторів таким чином, щоб елементи кожного вектора є стандартними нормальними випадковими величинами, які equicorrelated з кореляційної . Тепер скористайтеся процедурою, якою ви були. Нехай позначають кореляції вибірки між - їм і я * поруч * з . Тоді для фіксованого , нехай ,XХ р р я J я J Х м п п 1 / 2 ( р я J - р ) N ( 0 , ( 1 - р 2 ) 2 )m×nXρρ^ijijXmnn1/2(ρ^ijρ)переходить у розподілі до випадкової величини. N(0,(1ρ2)2)
кардинал

Відповіді:


5

Я спершу представив те, що зараз вважаю, як неоптимальну відповідь; тому я відредагував свою відповідь, щоб почати з кращої пропозиції.


Використовуючи метод виноградної лози

У цій темі: Як ефективно генерувати випадкові матриці кореляції з позитивом-напівдефін? - Я описав і надав код для двох ефективних алгоритмів генерації випадкових кореляційних матриць. І те й інше походять з документа Левандовського, Куровіки та Джо (2009).

Будь ласка, дивіться мою відповідь там, щоб отримати багато цифр та код matlab. Тут я хотів би лише сказати, що метод виноградної лози дозволяє генерувати випадкові матриці кореляції з будь-яким розподілом часткових кореляцій (зверніть увагу на слово "частковий") і може бути використаний для генерації кореляційних матриць з великими позадіагональними значеннями. Ось відповідна цифра з цієї теми:

Виноградний метод

Єдине, що змінюється між субплотами, - це один параметр, який контролює, наскільки сконцентрований розподіл часткових кореляцій навколо . Оскільки ОП просив приблизно нормального розподілу поза діагоналі, ось графік з гістограмами позадіагональних елементів (для тих же матриць, що і вище):±1

Позадіагональні елементи

Я думаю, що такі розподіли є досить «нормальними», і видно, як поступово збільшується стандартне відхилення. Додам, що алгоритм дуже швидкий. Детальні відомості див. У пов'язаній нитці.


Моя оригінальна відповідь

Пряма модифікація вашого методу може зробити трюк (залежно від того, наскільки близько ви хочете, щоб розподіл було нормальним). Ця відповідь надихнула коментарів @ кардинала вище та відповіді @ psarka на моє власне запитання Як створити велику повномасштабну матрицю випадкової кореляції з наявними сильними кореляціями?

Хитрість полягає в тому, щоб зробити зразки вашого співвіднесеними (не функції, а зразки). Ось приклад: я генерую випадкову матрицю розміром (всі елементи зі стандартного нормального), а потім додаю випадкове число з до кожного рядка для . Для кореляційна матриця (після стандартизації функцій) матиме недіагональні елементи, приблизно нормально розподілені зі стандартним відхиленням . ДляX 1000 × 100 [ - a / 2 , a / 2 ] a = 0 , 1 , 2 , 5 a = 0 XX 1 / XX1000×100[a/2,a/2]a=0,1,2,5a=0XX a>0aa=0,1,2,51/1000a>0, Я обчислюю матрицю кореляції без центрування змінних (це зберігає вставлені кореляції), а стандартне відхилення недіагональних елементів зростає з як показано на цій фігурі (рядки відповідають ):aa=0,1,2,5

випадкові кореляційні матриці

Усі ці матриці, звичайно, є позитивними. Ось код matlab:

offsets = [0 1 2 5];
n = 1000;
p = 100;

rng(42) %// random seed

figure
for offset = 1:length(offsets)
    X = randn(n,p);
    for i=1:p
        X(:,i) = X(:,i) + (rand-0.5) * offsets(offset);
    end
    C = 1/(n-1)*transpose(X)*X; %// covariance matrix (non-centred!)

    %// convert to correlation
    d = diag(C);
    C = diag(1./sqrt(d))*C*diag(1./sqrt(d));

    %// displaying C
    subplot(length(offsets),3,(offset-1)*3+1)
    imagesc(C, [-1 1])

    %// histogram of the off-diagonal elements
    subplot(length(offsets),3,(offset-1)*3+2)
    offd = C(logical(ones(size(C))-eye(size(C))));
    hist(offd)
    xlim([-1 1])

    %// QQ-plot to check the normality
    subplot(length(offsets),3,(offset-1)*3+3)
    qqplot(offd)

    %// eigenvalues
    eigv = eig(C);
    display([num2str(min(eigv),2) ' ... ' num2str(max(eigv),2)])
end

Вихід цього коду (мінімальні та максимальні власні значення):

0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48

чи можете ви накреслити значення найменших власних значень, отриманих цим методом, поряд із вами графіками?
user603

1
Не змінюючи фігури, я можу просто написати тут, що найменші власні значення 0,5, 0,4, 0,3 та 0,1 відповідно (для кожного рядка моєї фігури). Найбільші зростають з 1,7 до 48.
амеба

але це власні значення кореляційної матриці чи значення X'X ?.
user603

Це власні значення моєї матриці , яка нормалізується, щоб мати діагоналі, - так це кореляційна матриця. Я оновив свою відповідь, щоб ви могли бачити її в коді. Чи можу я запитати, що змушує вас сумніватися, що це можливо? Чи є підстави думати, що великі кореляційні матриці повинні мати дуже маленькі позадіагональні елементи? C
амеба

Я не думаю, що це неможливо, я просто не міг бачити це з коду (не використовував matlab протягом багатьох років у цей момент)
user603


1

Якщо ви намагаєтеся генерувати випадкові матриці кореляції, розгляньте вибірку з розподілу Wishart. Це наступне питання надає інформацію про розподіл Вішарта, а також поради щодо вибірки: Як ефективно генерувати випадкові позитивні-напівдефінітні матриці кореляції?


Але чи можна керувати стандартним відхиленням результуючих недіагональних елементів з параметрами розподілу Вішарта? Якщо так, то як?
амеба

1

Це не дуже складна відповідь, але я не можу не стверджувати, що це все-таки хороша відповідь ...

Якщо ваша мотивація полягає в тому, що параметри кореляції, отримані за даними часових рядів, як правило, виглядають нормально, чому б не просто імітувати дані часових рядів, обчислити параметри кореляції та використовувати їх?

У вас можуть бути вагомі причини цього не робити, але мені це не зрозуміло з вашого запитання.

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