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

Как можно сгенерировать случайные переменные с определенной функцией распределения и заданной корреляцией между ними с использованием метода Монте-Карло?
  • 20 марта 2024 г. 11:59
Ответы на вопрос 2
Для генерации случайных чисел, удовлетворяющих заданной функции распределения, можно использовать метод обратной функции. Суть данного метода заключается в том, что для каждого случайного числа, сгенерированного из равномерного распределения на отрезке [0, 1], находится значение функции обратной к заданной функции распределения. Таким образом, полученные числа будут иметь распределение, соответствующее заданной функции. 

Для задания определенного коэффициента корреляции между сгенерированными случайными числами можно применить метод центрирования. Сначала генерируются случайные числа с нужным распределением, затем их центрируют (вычитают среднее) и масштабируют (делят на стандартное отклонение), чтобы получить нужную корреляцию между ними.

Для генерации случайных переменных с определенной функцией распределения и корреляцией между ними с использованием метода Монте-Карло можно использовать следующий алгоритм:

1. Сгенерировать два независимых случайных вектора из равномерного распределения.
2. Применить функцию обратной к заданной функции распределения к каждому из сгенерированных векторов, чтобы получить два вектора с нужным распределением.
3. Сгенерировать матрицу ковариации с нужным коэффициентом корреляции.
4. Получить два вектора случайных чисел с нужной корреляцией из сгенерированных векторов, учитывая матрицу ковариации.

Таким образом, можно сгенерировать случайные переменные с заданным распределением и корреляцией, используя метод Монте-Карло.
В общем случае все сложно и тут как с интегрированием надо подходить с воображением и изобретательностью. 

Вообще, не для любых функций распределения можно получить любую корреляцию. Например, вы никак не сможете добиться полной (corr=1) корреляции равномерно распределенной величины и нормально распределенной величины.

Но, если функция для обеих величин одинаковая, то есть, например, такой способ:
1) Сгенерируйте случайную величину a согласно функции распределения.
2) C вероятностью k выдайте это же значение как и вторую переменную (b=a).
3) C вероятностью 1-k сгенерируйте случайную величину b согласно той же функции распределения.

Этот способ выдаст коэффициент корреляции k. Если нужна отрицательная корреляция, то можно выдать b=2Ea-a во втором шаге (отражение относительно матожидания). Но тогда в третьем шаге плотность распределения будет уже не такая же как у a. Если заданная функия распределения f(x), то там надо использовать g(x)=(f(x) -kf(2Ea-x))/(1-k). Суть в том, чтобы g(x)*(1-k)+k*f(2Ea-x) = f(x) - и итоговая плотность распределения будет одинаковая.

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

Другой вариант, сгенерировать случайную величину a ~ f(x), потом взять b = k*a+c, где c - это какая-то независимая случайная величина, распределенная как-то хитро (об этом ниже). Регулируя k можно получать разный уровень корреляции. Удобно работать уже с центрированными случайными величинами. Пусть Ea = Eb = Ec= 0.

Тогда коэффициент корреляции будет E((ka+c)a)/D(a) = (kEa^2+Eac)/D(a) = kE(a^2)/D(a) = k. Потому что a и c независимые случайные величины и Eac = Ea*Ec = 0*0. А D(a) = E(a^2)-Ea*Ea = E(a^2)-0*0.

Пусть функция распределения a и b - F(x) (плотность f(x)). Искомая функция для c - G(x) (плотность g(x)).

Надо будет решить интегральное уравнение:
Int -int..inf g(t)f((x-t)/k)/k dt = f(t)

Лучше всего это через преобразование лапласа это решать. Теоремму о свертке и свойство умножения на число примените.
Похожие вопросы