python中的copula:Frank、Clayton和Gumbel copula模型估计与可视化

简介: python中的copula:Frank、Clayton和Gumbel copula模型估计与可视化

你可能会问,为什么是copulas?我们指的是数学上的概念。简单地说,copulas是具有均匀边缘分布的联合分布函数。最重要的是,它们允许你将依赖关系与边缘分布分开研究。有时你对边缘分布的信息比对数据集的联合函数的信息更多,而copulas允许你建立关于依赖关系的 "假设 "情景。copulas可以通过将一个联合分布拟合到均匀分布的边缘分布上而得到,这个边缘分布是通过对你感兴趣的变量的cdf进行量化转换而得到的。

这篇文章是关于Python的(有numpy、scipy、scikit-learn、StatsModels和其他你能在Anaconda找到的好东西),但是R对于统计学来说是非常棒的。我重复一遍,R对统计学来说是非常棒的。如果你是认真从事统计工作的,不管你是否喜欢R,你至少应该看看它,看看有哪些包可以帮助你。很有可能,有人已经建立了你所需要的东西。 而且你可以从python中使用R(需要一些设置)。

说了这么多关于R的好处,我们还是要发一篇关于如何在python中使用一个特定的数学工具的文章。因为虽然R很牛,但python确实有令人难以置信的灵活性,可以用来处理其他事务。

这篇文章中即将出现的大部分内容都会用Jupyter Notebooks来构建。

软件

我很惊讶,scikit-learn或scipy中没有明确的copula包的实现。

2D数据的Frank、Clayton和Gumbel copula

测试

第一个样本(x)是从一个β分布中产生的,(y)是从一个对数正态中产生的。β分布的支持度是有限的,而对数正态的右侧支持度是无穷大的。对数的一个有趣的属性。两个边缘分布都被转换到了单位范围。

我们对样本x和y拟合了三个族(Frank, Clayton, Gumbel)的copulas,然后从拟合的copulas中提取了一些样本,并将采样输出与原始样本绘制在一起,以观察它们之间的比较。

  #等同于ppf,但直接从数据中构建 
    sortedvar=np.sort(var)    

    #绘制

    for index,family in enumerate(\['Frank', 'clayton', 'gumbel'\]):

            #获得伪观测值
            u,v = copula\_f.generate\_uv(howmany)

        #画出伪观测值
        axs\[index\]\[0\].scatter(u,v,marker='o',alpha=0.7)

      

    plt.show()

#总样本与伪观测值的对比
sz=300
loc=0.0 #对大多数分布来说是需要的
sc=0.5
y=lognorm.rvs(sc,loc=loc, size=sz)

独立(不相关)数据

我们将从β分布中抽取(x)的样本,从对数正态中抽取(y)的样本。这些样本是伪独立的(我们知道,如果你用计算机来抽取样本,就不会有真正的独立,但好在是合理的独立)。

#不相关的数据:一个β值(x)和一个对数正态(y)。
a= 0.45#2. #alpha
b=0.25#5. #beta

#画出不相关的x和y 
plt.plot(t, beta.pdf(t,a,b), lw=5, alpha=0.6, label='x:beta')


#绘制由不相关的x和y建立的共线性图
title='来自不相关数据的共线性 x: beta, alpha {} beta {}, y: lognormal, mu {}, sigma dPlot(title,x,y,pseudoobs)

相依性(相关)数据

自变量将是一个对数正态(y),变量(x)取决于(y),关系如下。初始值为1(独立)。然后,对于每一个点i, 如果 , 那么 , 其中c是从1的分数列表中统一选择的,否则, .

#相关数据:一个对数正态(y)。

#画出相关数据

 np.linspace(0, lognorm.ppf(0.99, sc), sz)
plt.plot(t, gkxx.pdf(t), lw=5, alpha=0.6,

拟合copula参数

没有内置的方法来计算archimedean copulas的参数,也没有椭圆elliptic copulas的方法。但是可以自己实现。选择将一些参数拟合到一个scipy分布上,然后在一些样本上使用该函数的CDF方法,或者用一个经验CDF工作。这两种方法在笔记本中都有实现。

点击标题查阅相关内容


R语言实现 COPULA 算法建模相依性案例分析



左右滑动查看更多

因此,你必须自己写代码来为archimedean获取参数,将变量转化为统一的边缘分布,并对copula进行实际操作。它是相当灵活的。

#用于拟合copula参数的方法 

# === Frank参数拟合
    """
    对这个函数的优化将给出参数 
    """
   #一阶debye函数的积分值    int_debye = lambda t: t/(npexp(t)-1.) 
    debye = lambda alphaquad(int_debye , 
                               alpha
                              )\[0\]/alpha
    diff = (1.-kTau)/4.0-(debye(-alpha)-1.)/alpha



#================
#clayton 参数方法
def Clayton(kTau):
    try:
        return 2.*kTau/(1.-kTau)
 

#Gumbel参数方法
def Gumbel(kTau):
    try:
        return 1./(1.-kTau)


#================
#copula生成

    #得到协方差矩阵P
    #x1=norm.ppf(x,loc=0,scale=1)
    #y1=norm.ppf(y,loc=0,scale=1)
    #return norm.cdf((x1,y1),loc=0,scale=P)




#================
#copula绘图

    fig = pylab.figure()
    ax = Axes3D(fig)

        ax.text2D(0.05, 0.95, label, transform=ax.transAxes)
        ax.set_xlabel('X: {}'.format(xlabel))
        ax.set_ylabel('Y: {}'.format(ylabel))


    #sample是一个来自U,V的索引列表。这样,我们就不会绘制整个copula曲线。
    if plot:
  
        print "绘制copula {}的样本".format(copulaName)
        returnable\[copulaName\]=copulapoints
        if plot:
            zeFigure=plot3d(U\[样本\],V\[样本\],copulapoints\[样本\], label=copulaName,

生成一些输入数据

在这个例子中,我们使用的是与之前相同的分布,探索copula 。如果你想把这段代码改编成你自己的真实数据。

t = np.linspace(0, lognorm.ppf(0.99, sc), sz)

#从一些df中抽取一些样本
X=beta.rvs(a,b,size=sz)
Y=lognorm.rvs(sc,size=sz)
#通过对样本中的数值应用CDF来实现边缘分布
U=beta.cdf(X,a,b)
V=lognorm.cdf(Y,sc)

#画出它们直观地检查独立性
plt.scatter(U,V,marker='o',alpha=0.7)
plt.show()

可视化Copulas

没有直接的构造函数用于高斯或t_Copulas_,可以为椭圆_Copulas_(_Elliptic_ _Copulas_)建立一个更通用的函数。


Samples=700
#选择用于抽样的copula指数
np.random.choice(range(len(U)),Samples)


Plot(U,V)

<IPython.core.display.Javascript object>

Frechét-Höffding边界可视化

根据定理,我们将copula画在一起,得到了Frechét-Höffding边界。

#建立边界为copula的区域
plot_trisurf(U\[样本\],V\[样本\],copula\['min'\]\[样本\],
          c='red') #上限
plot_trisurf(U\[样本\],V\[样本\],copula\['max'\]\[样本\],
           c='green') #下限














相关文章
|
16天前
|
机器学习/深度学习 人工智能 PyTorch
200行python代码实现从Bigram模型到LLM
本文从零基础出发,逐步实现了一个类似GPT的Transformer模型。首先通过Bigram模型生成诗词,接着加入Positional Encoding实现位置信息编码,再引入Single Head Self-Attention机制计算token间的关系,并扩展到Multi-Head Self-Attention以增强表现力。随后添加FeedForward、Block结构、残差连接(Residual Connection)、投影(Projection)、层归一化(Layer Normalization)及Dropout等组件,最终调整超参数完成一个6层、6头、384维度的“0.0155B”模型
200行python代码实现从Bigram模型到LLM
|
1月前
|
机器学习/深度学习 人工智能 算法
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
本文介绍了如何使用 Python 和 YOLO v8 开发专属的 AI 视觉目标检测模型。首先讲解了 YOLO 的基本概念及其高效精准的特点,接着详细说明了环境搭建步骤,包括安装 Python、PyCharm 和 Ultralytics 库。随后引导读者加载预训练模型进行图片验证,并准备数据集以训练自定义模型。最后,展示了如何验证训练好的模型并提供示例代码。通过本文,你将学会从零开始打造自己的目标检测系统,满足实际场景需求。
307 0
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
|
5月前
|
数据采集 数据可视化 数据挖掘
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
本文探讨了金融资产波动率建模中的三种主流方法:GARCH、GJR-GARCH和HAR模型,基于SPY的实际交易数据进行实证分析。GARCH模型捕捉波动率聚类特征,GJR-GARCH引入杠杆效应,HAR整合多时间尺度波动率信息。通过Python实现模型估计与性能比较,展示了各模型在风险管理、衍生品定价等领域的应用优势。
677 66
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
|
2月前
|
数据采集 数据可视化 数据挖掘
基于Python的App流量大数据分析与可视化方案
基于Python的App流量大数据分析与可视化方案
|
3月前
|
数据可视化 前端开发 数据挖掘
使用Folium在Python中进行地图可视化:全面指南
Folium是基于Python的交互式地图可视化库,依托Leaflet.js实现地理空间数据展示。本文从安装、基础使用到高级功能全面解析Folium:包括创建地图、添加标记、保存文件,以及绘制热力图、多边形和Choropleth地图等高级操作。通过展示北京市景点与全球地震数据的实际案例,结合性能优化、自定义样式和交互性增强技巧,帮助用户掌握Folium的核心功能与应用潜力,为数据分析提供直观支持。
183 2
|
6月前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型的分布式训练
使用Python实现深度学习模型的分布式训练
302 73
|
6月前
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品消费需求分析的深度学习模型
使用Python实现智能食品消费需求分析的深度学习模型
180 21
|
6月前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费模式预测的深度学习模型
使用Python实现智能食品消费模式预测的深度学习模型
144 2
|
机器学习/深度学习 Python
Python3入门机器学习 - 模型泛化
模型正则化 在多项式回归中如果degree过大,会造成过拟合的情况,导致模型预测方差极大,因此,我们可以使用模型正则化的方式来减小过拟合导致的预测方差极大的问题 即在我们训练模型时,不仅仅需要将预测的y和训练集的y的均方误差达到最小,还要使参数向量最小。
1039 0
|
3月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。

热门文章

最新文章

推荐镜像

更多