前言:大概理解了vine-copula的抽样过程(详见上一篇分享),但是文中直接假定了pair copula的参数进行了抽样,但是现实情况中,我们往往需要用已有数据进行参数的估计,进而再进行抽样的,抽样的这个过程可以用R实现。因此,今天首先对几种 估计方法进行阐述,再用R实现不同方法下的参数估计。今天的和Vine copula没什么关系。
学习用书:copula method in finance& copula method and its application
一、首先介绍一下几种copula的参数估计方法
1、极大似然估计(ML)
我们知道边际分布为F1...Fn的分布函数F的密度函数可以表示成如下形式:
其中上式的c为copula函数对其中的每个变量求导后的结果
上式的似然估计中可以分解成两部分:
其中:
假设每一个边际分布的参数为αi
2、分段估计法(IFM)
随着维数p的增大,参数的数量也随之增加,优化问题也变得更加困难。作为极大似然估计的一种有效替代方法IFM,在第一阶段,各个边缘分布的参数被估计出来,是通过最大化上面的Li函数得到的,定义为在独立情况下的MLE;第二阶段,带入第一阶段的估计参数,得到copula参数的最大似然估计。
在这种情况下,每个最大化任务的参数数量非常少,大大降低了计算难度。这种方法被Shih和Louis(1995)在删失数据设置中称为两阶段参数ML方法。在我们的例子中,这种方法可以用函数fitCopula来实现。
一般来说,IFM方法和ML方法得到的似然估计值是不一样的,然而在特殊情况下,即边缘分布均为正态分布,且连接函数也为高斯copula的情况下,两种估计的结果是一样的。
基于对不同依赖模型的渐近协方差矩阵估计和蒙特卡罗模拟的效率比较表明,IFM推理方法为多元模型参数的MLE估计提供了一种高效的替代方案。
3、半参数估计法(semi-estimation)
当依赖参数α的一致估计是重要的,它可以用典型ML ,(CML)方法估计,而不指定边缘分布。
半参数估计法的思路也是来源于似然函数的分解。第一阶段,用非参数的方法(经验分布)得到Fi,第二阶段,用描述依赖结构的LC来估计copula的参数。
在一定的正则条件下,上面所得到的参数是一致的和渐进正态的。还有学者证明,在一定的附加假设下,copula参数的估计值在独立时是完全有效的。
4、非参数推断和经验cooula过程
经验copula一般写成如下的形式:
其中,F^i为各边缘分布的经验分布,最外部的F^为联合分布函数的经验分布函数。其中联合函数使用非参数的核估计量构建的。
二、介绍如何在R中实现
查到的资料可能已经比较老了,也可能R中已经出现了更好用的函数来实现参数的估计过程,本文做一个简单梳理,如果读者知道了更有效的方法,欢迎私信本咩。
1、ML估计方法在R中的实现
下面代码都是基于R完成的:
#ML方法
#给定参数然后抽样200,参数分别为2,1,3,2,copula参数为0.5
set.seed(1234)
myMvd <- mvdc(copula = ellipCopula(family = "normal", param = 0.5),
margins = c("gamma", "gamma"),
paramMargins = list(list(shape = 2, scale = 1),
list(shape = 3, scale = 2)))
dat <- rMvdc(200,myMvd)
#得到对数似然估计值
loglikMvdc(c(2, 1, 3, 2, 0.5), dat, myMvd)
#给一个初始搜索点,然后自己寻找最优估计,start可任意设定,最后一个参数要满足其范围
fit <- fitMvdc(dat, myMvd, start = c(1,1,1,1,0.5),
optim.control = list(trace = TRUE, maxit = 2000))
#查看估计结果,结果与刚开始设定的参数差异较小
fit
##IFM估计
#第一阶段估计,先定义独立情况下边缘分布的最大似然估计函数loglik.marg
loglik.marg <- function(b, x){
sum(dgamma(x, shape = b[1], scale = b[2],log = TRUE))
}
#再求出边缘分布的参数估计,独立
ctrl <- list(fnscale = -1)
b1hat <- optim(c(1,1), fn = loglik.marg, x = dat[, 1], control = ctrl)$par
b2hat <- optim(c(1,1), fn = loglik.marg, x = dat[, 2], control = ctrl)$par
#第二阶段估计,得出copula的参数,IFM和ML的估计结果很近似
udat <- cbind(pgamma(dat[, 1], shape = b1hat[1], scale = b1hat[2]),
pgamma(dat[, 2], shape = b2hat[1], scale = b2hat[2]))
fit.ifl <- fitCopula(normalCopula(dim = 2),udat, start = 0.4)
##半参数估计法(CML)[不太懂为什么这样处理经验分布的数据,还以为要抽样]
eu <- cbind((rank(dat[, 1]) - 0.5)/200, (rank(dat[, 2]) - 0.5)/200)
fit.cml <- fitCopula(normalCopula(dim = 2),eu, start = 0.4)
fit.cml
最后一个数据处理方法不太懂,不过anyway就先这样啦88