Как создать матрицу случайной корреляции, которая имеет приблизительно нормально распределенные недиагональные записи с заданным стандартным отклонением?


11

Я хотел бы создать матрицу случайной корреляции так, чтобы распределение ее недиагональных элементов выглядело примерно как нормальное. Как я могу это сделать?

Мотивация такая. Для набора данных из временных рядов распределение корреляции часто выглядит достаточно близким к нормальному. Я хотел бы создать много «нормальных» матриц корреляции для представления общей ситуации и использовать их для расчета числа рисков.n


Я знаю один метод, но полученное стандартное отклонение (распределения недиагональных элементов) слишком мало для моей цели: сгенерировать равномерных или нормальных случайных строк матрицы , стандартизировать строки (вычесть среднее значение, разделить на стандартное отклонение), тогда образец корреляционной матрицы обычно распределяет недиагональные записи [ Обновление после комментариев: стандартное отклонение будет ].X 1nX~п-1/21n1XXn1/2

Кто-нибудь может предложить лучший метод, с помощью которого я могу контролировать стандартное отклонение?


1
@Richard, спасибо за твой вопрос. К сожалению, метод, который вы описали выше, не будет производить записи, которые обычно распространяются. Диагонали 1 с вероятностью один, а недиагоналы ограничены от до . Теперь масштабированные записи будут асимптотически сходиться к нормальному распределению с центром около нуля. Можете ли вы дать нам больше информации о проблеме, которую вы на самом деле пытаетесь решить? И почему вы хотите "нормально распределить" по диагонали? + 11+1
кардинал

1
@Richard, что я имел в виду, предположим, что и являются двумя независимыми векторами, так что записи каждого из них являются стандартными нормальными. Вычислить ; то есть образец корреляции между и . Тогда сходится по распределению к стандартной нормальной случайной переменной. Под «масштабированием» я подразумевал умножение на что необходимо для получения невырожденного предельного распределения. У = ( Y 1 , Y 2 , ... , Y п ) ρ п = ев х у / ( ы X ев у ) Х У п 1 / 2 ρ п п 1 / 2X=(X1,X2,,Xn)Y=(Y1,Y2,,Yn)ρ^n=sxy/(sxsy)XYn1/2ρ^nn1/2
кардинал

1
@Richard, суть «проблемы» заключается в том, что, устанавливая два ограничения (а) на то, что нормы каждой строки равны 1, и (б) на то, что записи генерируются из случайной выборки, вы обязательно заставляете корреляции быть достаточно маленький (порядка . Причина в том, что вы не можете иметь сколь угодно большие корреляции между рядами и все же получить нормы каждой строки равными 1 при наличии такой большой независимости.n1/2
Кардинал

1
... теперь вы можете получить большие корреляции по величине, сначала сопоставив ряды между собой перед перенормировкой. Но, по сути, у вас есть только один параметр, с которым можно играть, поэтому и асимптотическое среднее, и дисперсия будут привязаны к этому параметру. Так что это, вероятно, не даст вам гибкости, которую вы, кажется, хотите, либо.
кардинал

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

Ответы:


5

Сначала я предоставил то, что теперь считаю неоптимальным ответом; поэтому я отредактировал свой ответ, чтобы начать с лучшего предложения.


Используя метод лозы

В этой теме: Как эффективно генерировать случайные матрицы положительной-полуопределенной корреляции? - Я описал и предоставил код для двух эффективных алгоритмов генерации матриц случайной корреляции. Оба взяты из статьи Левандовски, Куровицки и Джо (2009).

Пожалуйста, смотрите мой ответ там для большого количества цифр и кода Matlab. Здесь я хотел бы только сказать, что метод виноградной лозы позволяет генерировать матрицы случайной корреляции с любым распределением частичных корреляций (обратите внимание на слово «частичный») и может использоваться для генерации матриц корреляции с большими недиагональными значениями. Вот соответствующая цифра из этой темы:

Винный метод

Единственное, что меняется между участками, - это один параметр, который контролирует, насколько сильно распределение частичных корреляций сосредоточено вокруг . Поскольку OP запрашивал приблизительно нормальное распределение вне диагонали, вот график с гистограммами недиагональных элементов (для тех же матриц, что и выше):±1

Недиагональные элементы

Я думаю, что это распределение достаточно «нормальное», и можно увидеть, как стандартное отклонение постепенно увеличивается. Я должен добавить, что алгоритм очень быстрый. Смотрите связанные темы для деталей.


Мой оригинальный ответ

Прямая модификация вашего метода может помочь (в зависимости от того, насколько близко вы хотите, чтобы распределение было нормальным). Этот ответ был вдохновлен комментариями @ cardinal выше и ответом @ 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.