在Python中生成具有指定边际的与copula相关的样本

时间:2019-09-25 08:46:20

标签: python random statistics

我有N个随机变量(X1,...,XN),每个变量都分布在特定的边际(正态,对数正态,泊松...)上,我想生成p个联合实现的样本假设这些变量Xi是使用Python 3与给定的Copula相关联的,我知道R是更好的选择,但我想在Python中做到这一点。

按照this方法,我设法用高斯Copula做到了。现在,我想调整方法以使用Archimedean Copula(Gumbel,Frank ...)或Student Copula。在高斯copula方法的开始,您从多元正态分布中提取了p个实现的样本。为了使它适应另一个变量,例如双变量Gumbel,我的想法是从joint distribution of a bivariate Gumbel中抽取一个样本,但是我不确定如何实现它。

我尝试使用多个Python 3软件包:copulaecopulacopulas都提供了n选项,以将特定的copula拟合到数据集,但不允许绘制随机样本来自给定的copula。

您能否提供一些算法上的见解,以了解如何从具有均匀边际的给定Copula中抽取多元随机样本?

2 个答案:

答案 0 :(得分:1)

以下代码实现了Clayton和AMH copulas。 this paper的第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]

答案 1 :(得分:0)

请检查此页面"Create a composed distribution"。我认为这就是您要寻找的

例如,如果您有2个分布x1:[1,3]上的均匀分布,而x2:正态(0,2),并且如果您知道依赖结构copula,则可以构建多维分布X =(x1,x2 )。

$('input#first-input').change(function() {
    $('form#search-form').submit(); 
});

import openturns as ot x1 = ot.Uniform(1, 3) x2 = ot.Normal(0, 2) copula = ot.IndependentCopula() X = ot.ComposedDistribution([x1, x2], copula) 将返回大小= 5的样本:

X.getSample(5)

您可以2D模式查看云

>>>   [ 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 ]

enter image description here

如果您选择import matplotlib.pyplot as plt sample = dist.getSample(1000) plt.scatter(sample[:, 0], sample[:, 1], s=2) ,结果将是:

enter image description here

使用GumbelCopula(2):

enter image description here