原文链接:http://tecdat.cn/?p=23646 

你可能会问,为什么是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=300loc=0.0 #对大多数散布来说是须要的sc=0.5y=lognorm.rvs(sc,loc=loc, size=sz)

独立(不相干)数据

咱们将从散布中抽取(x)的样本,从对数正态中抽取(y)的样本。这些样本是伪独立的(咱们晓得,如果你用计算机来抽取样本,就不会有真正的独立,但好在是正当的独立)。

#不相干的数据:一个值(x)和一个对数正态(y)。a= 0.45#2. #alphab=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工作。这两种办法在笔记本中都有实现。

因而,你必须本人写代码来为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') #上限


最受欢迎的见解

1.在python中应用lstm和pytorch进行工夫序列预测

2.python中利用长短期记忆模型lstm进行工夫序列预测剖析

3.应用r语言进行工夫序列(arima,指数平滑)剖析

4.r语言多元copula-garch-模型工夫序列预测

5.r语言copulas和金融工夫序列案例

6.应用r语言随机稳定模型sv解决工夫序列中的随机稳定

7.r语言工夫序列tar阈值自回归模型

8.r语言k-shape工夫序列聚类办法对股票价格工夫序列聚类

9.python3用arima模型进行工夫序列预测