изменить или масштабировать два нормальных распределения, чтобы иметь определенный коэффициент корреляции - PullRequest
0 голосов
/ 07 октября 2018

Итак, мой вопрос: если у нас есть две нормально распределенные случайные величины, например, если n1 (8, 1) и n2 (5, 1) имеют rho = 0,2, я хочу изменить n1 и n2 таким образом, чтобы rho =0,8 или любое другое значение.

как это можно сделать в c ++?
существует ли какая-либо библиотека, пакет или алгоритм для реализации?

Любая помощь или комментарии будут высоко оценены.

Привет

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Редактировать: Я зафиксировал уравнения.

Если предположить, что x_1 и x_2 распределены по n1 (8, 1) и n2 (5, 1) соответственно скорреляция rho.Тогда, используя две независимые n (0,1) переменные w_1 и w_2, мы можем написать x_1 и x_2 следующим образом:

x_1 = w_1 + 8,
x_2 = sqrt(1 - rho^2) * w_2 + rho * w_1 + 5.

С другой стороны, если мы предположимy_1 и y_2 распределены в n1 (8, 1) и n2 (5, 1) в корреляции rho', мы также можем написать

y_1 = w_1 + 8,
y_2 = sqrt(1 - rho'^2) * w_2 + rho'* w_1 + 5.

Следовательно, мы можем получить новое совместное распределениес различной корреляцией rho' по следующему алгоритму:

y_1 = x_1,
y_2 = sqrt((1 - rho'^2)/(1 - rho^2)) * (x_2 - rho * (x_1 - 8) - 5) + rho' * (x_1 - 8) + 5.

Мы также можем напрямую генерировать y_1 и y_2, используя независимый генератор нормального распределения (w_1 и w_2) в C ++.

0 голосов
/ 07 октября 2018

Это двумерное нормальное распределение с ковариационной матрицей:

1, 0,2

0,2, 1

Вы можете использовать функцию MATLAB "mvnrnd"

https://www.mathworks.com/help/stats/mvnrnd.html

Я не нахожу библиотек c ++.Может быть, вам следует реализовать это по методу mvnrnd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...