我有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软件包:copulae,copula和copulas都提供了n选项,以将特定的copula拟合到数据集,但不允许绘制随机样本来自给定的copula。
您能否提供一些算法上的见解,以了解如何从具有均匀边际的给定Copula中抽取多元随机样本?
答案 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 ]
如果您选择import matplotlib.pyplot as plt
sample = dist.getSample(1000)
plt.scatter(sample[:, 0], sample[:, 1], s=2)
,结果将是:
使用GumbelCopula(2):