Генерация корреляционных копул с указанными маргиналами в Python - PullRequest
1 голос
/ 25 сентября 2019

У меня есть N случайных величин (X1, ..., XN), каждая из которых распределена по определенному маргинальному значению (нормальное, логарифмическое, Пуассона ...), и я хочу сгенерировать выборку из p совместных реализацийэти переменные Xi, учитывая, что переменные соотносятся с заданным Копулой, используя Python 3. Я знаю, что R - лучший вариант, но я хочу сделать это на Python.

После это Метод, который мне удалось сделать с гауссовой копулой.Теперь я хочу адаптировать метод для использования архимедовой копулы (Гумбеля, Фрэнка ...) или студенческой копулы.В начале метода гауссовой копулы вы берете выборку из p реализаций из многомерного нормального распределения.Чтобы адаптировать это к другой связке, например, к двумерному Гумбелю, моя идея состоит в том, чтобы взять образец из совместного распределения двумерного Гумбеля , но я не уверен, как это реализовать.

Я пытался использовать несколько пакетов Python 3: copulae , copula и copula - все предоставляют возможность подгонять конкретную связку к набору данных, но не позволяютнарисовать случайную выборку из заданной связки.

Можете ли вы дать некоторое алгоритмическое представление о том, как рисовать многомерные случайные выборки из заданной копулы с равномерными маргиналами?

1 Ответ

0 голосов
/ 26 сентября 2019

Следующий код реализует связки Клейтона и AMH.Страница 4 из в этом документе показано, как можно реализовать другие виды связок.

import random
import math
import scipy.stats as st
def clayton(theta, n):
    v=random.gammavariate(1/theta,1)
    uf=[random.expovariate(1)/v for _ in range(n)]
    return [(k+1)**(-1.0/theta) for k in uf]

def amh(theta, n):
    # NOTE: Use SciPy RNG for convenience here
    v=st.geom(1-theta).rvs()
    uf=[random.expovariate(1)/v for _ in range(n)]
    return [(1-theta)/(math.exp(k)-theta) for k in uf]
...