• R语言代写实现 Copula 算法建模依赖性案例分析报告


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

    copula是将多变量分布函数与其边际分布函数耦合的函数,通常称为边缘或简单的边缘。Copula是建模和模拟相关随机变量的绝佳工具。

    Copula的主要吸引力在于,通过使用它们,您可以分别对相关结构和边缘(即每个随机变量的分布)进行建模。  例如,在R中,很容易从多元正态分布中生成随机样本,但是对于分别其边缘分别为Beta,Gamma和Student的分布来说,这样做并不容易。  

    copulas如何工作 

    但首先,让我们试着了解copula的实际工作方式。 

     set.seed(100)
    
    m < -  3
    n < -  2000
     
    z < -  mvrnorm(n,mu = rep(0,m),Sigma = sigma,empirical = T)
    

    现在我们使用cor()和配对图检查样本相关性。 

     
    pairs.panels(Z)
    
              [,1] [,2] [,3]
    [1,] 1.0000000 0.3812244 0.1937548
    [2,] 0.3812244 1.0000000 -0.7890814
    [3,] 0.1937548 -0.7890814 1.0000000
    


     


     
    pairs.panels(U)
    

    这是包含在中的新随机变量的配对图u。 



     我们可以绘制矢量的漂亮3D表示u。 


     

    现在,作为最后一步,我们只需要选择边距并应用它们u。我选择了边缘为Gamma,Beta和Student,并使用下面指定的参数进行分配。

    x1 < -  qgamma(u [,1],shape = 2,scale = 1)
    x2 < -  qbeta(u [,2],2,2)
    x3 < -  qt(u [,3],df = 5)
     

    下面是我们模拟数据的3D图。 


    df < -  cbind(x1,x2,x3)
    pairs.panels(DF)
     
              x1 x2 x3
    x1 1.0000000 0.3812244 0.1937548
    x2 0.3812244 1.0000000 -0.7890814
    x3 0.1937548 -0.7890814 1.0000000
    

    这是随机变量的配对图:

    使用copula

     让我们使用copula复制上面的过程。

     
    set.seed(100)
    myCop < -   (param = c(0.4,0.2,-0.8),dim = 3,dispstr =“un”)
    myMvd < -   (copula = myCop,margin = c(“gamma”,“beta”,“t”) 
                )
    

    现在我们已经通过copula(普通copula)指定了依赖结构并设置了边缘,该mvdc()函数生成了所需的分布。然后我们可以使用该rmvdc()函数生成随机样本。

     
    colnames(Z2)< -  c(“x1”,“x2”,“x3”)
    pairs.panels(Z2)
    

    模拟数据当然非常接近之前模拟的数据,并显示在下面的配对图中:


    一个简单的应用示例

    现在为现实世界的例子。我们将拟合两个股票 ,并尝试使用copula模拟 。 
    让我们在R中加载 

    cree < -  read.csv('cree_r.csv',header = F)$ V2
    yahoo < -  read.csv('yahoo_r.csv',header = F)$ V2
    

    在直接进入copula拟合过程之前,让我们检查两个股票收益之间的相关性并绘制回归线:

    我们可以看到 正相关 :


    在上面的第一个例子中,我选择了一个普通的copula模型而没有太多思考,但是,当将这些模型应用于实际数据时,应该仔细考虑哪些更适合数据。例如,许多copula更适合建模非对称相关,其他强调尾部相关性等等。我对股票回报的猜测是,t-copula应该没问题,但是猜测肯定是不够的。幸运的是,该软件包提供了一个很好的功能,告诉我们应该使用什么copula。本质上,允许我们通过函数使用BIC和AIC执行copula选择 

     
      pobs(as.matrix(cbind(cree,yahoo)))[,1]
      selectedCopula
     
    
    $ PAR
    [1] 0.4356302
    
    $ PAR2
    [1] 3.844534
    

     
    拟合算法确实选择了t-copula(在$family参考中编码为2 )并为我们估计了参数。 
    让我们尝试使用copula包装拟合建议的模型,并仔细检查参数拟合。

    t.cop  
    set.seed(500)
    m < -  pobs(as.matrix(cbind(cree,yahoo)))
     
    COEF(FIT)
    
      rho.1 df 
    0.43563 3.84453 
    

     我们来看看我们刚估计的copula的密度

    rho < -  coef(fit)[1]
    df < -  coef(fit)[2]
     
    


    现在我们只需要建立Copula并从中抽取3965个随机样本。

      rCopula(3965,tCopula(  = 2, ,df = df))
     
    
              [,1] [,2]
    [1,] 1.0000000 0.3972454
    [2,] 0.3972454 1.0000000
    

    这是载体中包含的样本的图u


     
    t-copula强调极端结果:它通常适用于在极值(分布的尾部)中存在高度相关性的建模现象。
     

    现在我们正面临着困难:对边缘进行建模。为简单起见,我们将假设正态分布 。因此,我们估计边际的参数

    cree_mu < -  mean(cree)
    cree_sd < -  sd(cree)
     

    让我们根据直方图绘制配件,以便直观地了解我们正在做的事情:

    hist(cree,breaks = 80,main ='Cree returns',freq = F,density = 30,col  
     hist(yahoo,breaks = 80,main ='Yahoo returns',density = 30,col ='cyan',freq = F,ylim = c(0,20),xlim = c(-0.2,0.2))
     

    两个直方图显示如下


     现在我们在函数中应用copula, ()然后用于 ()从生成的多变量分布中获取模拟观测值。最后,我们将模拟结果与原始数据进行比较。

    copula_dist < -   (copula = tCopula(rho,dim = 2,df = df 
                                          list(mean = yahoo_mu,sd = yahoo_sd)))
    sim < -  rmvdc(copula_dist,3965)
    

     

    这是在假设正常边缘和依赖结构的t-copula的情况下数据的最终散点图:


    正如您所看到的,t-copula导致结果接近实际观察结果 。 

     让我们尝试df=1df=8

    set.seed(4258)
    copula_dist < -  mvdc(copula = tCopula(rho,dim = 2,df = 1),margin = c(“norm”,“norm”),
                        paramMargins = list(list(mean = cree_mu,sd = cree_sd),
       
    copula_dist < -  mvdc(copula = tCopula(rho,dim = 2,df = 8),margin = c(“norm”,“norm”),
                        paramMargins = list(list(mean = cree_mu,sd = cree_sd),
                                          list(mean = yahoo_mu,sd = yahoo_sd)))
    sim < -  rmvdc(copula_dist,3965)
     
    
    [1] 0.3929509
    [1] 0.3911127
    

     
    显然,该参数df对于确定分布的形状非常重要。随着df增加,t-copula倾向于高斯copula。

    如果您有任何疑问,请在下面发表评论。   

  • 相关阅读:
    ASP.NET安全问题-- 创建安全的Web应用程序
    浅谈ASP.NET内部机制(八)
    ASP.NET 配置文件纵横谈(一)
    项目开发-让设计模式成为一种心智
    浅谈ASP.NET内部机制(七)
    ASP.NET 配置文件纵横谈(二)
    GridView的分页是否真的是鸡肋呢?
    SQL开发中容易忽视的一些小地方(四)
    SQL开发中容易忽视的一些小地方( 三)
    怎样才能充分利用SQL索引
  • 原文地址:https://www.cnblogs.com/tecdat/p/11454216.html
Copyright © 2020-2023  润新知