在Python中生成具有指定边际分布的相关联样本

3
我有N个随机变量(X1,...,XN),每个变量都分布在特定的边际分布上(正态分布,对数正态分布,泊松分布...),我想生成这些变量Xi的p个联合实现样本,假设这些变量与给定的Copula相关,并使用Python 3。我知道R是更好的选择,但我想在Python中完成它。
按照this方法,我成功地使用高斯Copula进行了操作。现在我想将该方法调整为使用Archimedean Copula(Gumbel,Frank ...)或Student Copula。在高斯Copula方法的开始,您从多元正态分布中抽取p个实现样本。为了适应另一个Copula,例如二元Gumbel,我的想法是从二元Gumbel的联合分布中抽取样本,但我不确定如何实现这一点。
我已经尝试使用几个Python 3包:copulaecopulacopulas,它们都提供了将一个特定的Copula拟合到数据集中,但不允许从给定的Copula中绘制随机样本。你能否提供一些算法洞察力,以便从具有均匀边际分布的给定Copula中绘制多元随机样本?
2个回答

3
请查看此页面"创建组合分布"。我认为这就是您要找的。
例如,如果您有两个分布x1:在[1,3]上均匀分布和x2:正态(0,2),并且如果您知道依赖结构copula,那么您可以非常轻松地构建多维分布X =(x1,x2)。
import openturns as ot

x1 = ot.Uniform(1, 3)
x2 = ot.Normal(0, 2)
copula = ot.IndependentCopula()

X = ot.ComposedDistribution([x1, x2], copula)

X.getSample(5)将返回样本大小为5:

>>>   [ X0         X1         ]
0 : [  1.87016    0.802719  ]
1 : [  1.72333    2.73565   ]
2 : [  1.00422    2.00869   ]
3 : [  1.47887    1.4831    ]
4 : [  1.51031   -0.0872247 ]

你可以以2D方式查看云。
import matplotlib.pyplot as plt

sample = dist.getSample(1000)
plt.scatter(sample[:, 0], sample[:, 1], s=2)

enter image description here

如果您选择 copula = ot.ClaytonCopula(2),结果将是:

enter image description here

使用GumbelCopula(2):

enter image description here


2
以下代码实现了Clayton和AMH copulas。第4页的这篇文章展示了如何实现其他类型的copulas。
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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接