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

У меня есть два списка для двух разных функций распределения вероятностей (pdf), p (x) и p (y).Я знаю, что между ними есть корреляция, и хочу создать совместное распределение p (x, y), чтобы я мог рассчитать их взаимную информацию.

Я провел исследование и открыл теорию связок в статистике, и, по-видимому, это способ решения моей проблемы.Однако, даже сделав связку, я не знаю, как генерировать p (x, y).Я пробовал пакеты "copulalib", "copula", и до сих пор лучшее, чего я мог достичь, было с "ambhas" (хотя мне пришлось изменить некоторые вещи в классе).Вот мой код:

import scipy as sp
import scipy.interpolate
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import rcParams
plt.rcParams.update({'font.size': 10})
rcParams.update({'figure.autolayout': True})
from ambhas.errlib import rmse, correlation
from ambhas.copula import Copula
import seaborn as sns

def log_interp1d(xx, yy, kind='linear'):
    logx = np.log10(xx)
    logy = np.log10(yy)
    lin_interp = sp.interpolate.interp1d(logx, logy, kind=kind)
    log_interp = lambda zz: np.power(10.0, lin_interp(np.log10(zz)))
    return log_interp

def derivada(f,x):
    dx = x[1] - x[0]
    flinha = []
    for i in range(1,len(f)):
        flinha.append((f[i]-f[i-1])/dx)
    return flinha

#interpolating logarithmic data and generating the cumulated distribution

xx = [1e-10, 0.00014, 0.00042, 0.0014, 0.0042, 0.014,0.07]
yy = [1e-20, 0.125, 0.275, 0.4711, 0.775, 0.875,1]
f = log_interp1d(xx,yy)
xnew = np.linspace(xx[0], xx[-1], num=10000, endpoint=True)
fda_cerc = f(xnew) #cdf
x_cerc = xnew

xx = [1e-10, 2.1e-6,2.1e-5,2.1e-4,2.1e-3, 0.007, 0.021, 0.049, 0.07]
yy = [1e-20, 0.0583, 0.1, 0.1083, 0.5083, 0.7583, 0.9917, 0.9917, 1]
f = log_interp1d(xx,yy)
fda_imida = f(xnew) #cdf
x_imida = xnew

#generatin p(x) and p(y)
pdf_imida = np.array(derivada(fda_imida,x_imida)) #p(x)
pdf_cerconil = np.array(derivada(fda_cerc,x_cerc)) #p(y)

c = correlation(pdf_imida,pdf_cerconil)


foo = Copula(pdf_imida, pdf_cerconil, 'frank')

u,v = foo.generate_uv(9999)
plt.plot(v)

h = sns.jointplot(u,v,kind = 'kde')
plt.savefig('copulas.jpg', dpi = 400)

Сгенерированная фигура согласуется с теорией связок, но что я могу сделать, чтобы сгенерировать p (x, y)?Есть ли простой способ?

...