问题描述
这是我在这里的第一个问题,所以我会尽量把它写得尽可能好。如果我犯了一个愚蠢的错误,请霸道。
简而言之,我正在尝试进行最大似然估计,我需要估计 5 个参数。我想解决的问题的一般形式如下:三个copula的加权平均,每个copula都有一个待估计的参数,其中权重为非负且总和为1,也需要估计。
R 中有一些包用于对单个 copula 或具有固定权重的 copula 的加权平均值进行 MLE。但是,据我所知,不存在直接解决我上面概述的问题的软件包。因此,我正在尝试自己对问题进行编码。有一种特定类型的错误,我无法追踪其来源。下面我尝试给出一个最小的可重复示例,其中只需要估计一个参数。
library(copula)
set.seed(150)
x <- rcopula(100,claytoncopula(250))
# copula density
clayton_density <- function(x,theta){
dcopula(x,claytoncopula(theta))
}
# Negative log-likelihood function
nll.clayton <- function(theta){
theta_trans <- -1 + exp(theta) # admissible theta values for Clayton copula
nll <- -sum(log(clayton_density(x,theta_trans)))
return(nll)
}
# Initial guess for optimization
guess <- function(x){
init <- rep(NA,1)
tau.n <- cor(x[,1],x[,2],method = "kendall")
# Guess using method of moments
itau <- iTau(claytoncopula(),tau = tau.n)
# In case itau is negative,we need a conditional statement
# Use log because it is (almost) inverse of theta transformation above
if (itau <= 0) {
init[1] <- log(0.1) # Ensures positive initial guess
}
else {
init[1] <- log(itau)
}
}
estimate <- nlminb(guess(x),nll.clayton)
(parameter <- -1 + exp(estimate$par)) # Retrieve estimated parameter
fitcopula(claytoncopula(),x) # Compare with fitcopula function
这在模拟具有较小 copula 参数值的数据时非常有效,并且每次都给出与 fitcopula() 几乎完全相同的答案。
对于较大的 copula 参数值,例如 250,当我使用 nlminb() 运行该行时会出现以下错误:"Error in .local(u,copula,log,...) : parameter is NA 调用自: .local(u,...) 结束时出错:'eval' 中未实现的类型 (29)"
当我运行 fitcopula() 时,优化已完成,但弹出此消息:“警告消息: 在 dlogcdtheta(copula,u) 中: dlogcdtheta() 在第 1 列中为这个显式 copula 返回 NaN;回退到这些列的数字导数"
我已经能够使用 debug() 发现在 nlminb 的优化过程中的某个地方,感兴趣的参数被分配了值 NaN,然后在调用 dcopula() 时会产生此错误。但是,我不知道它发生在哪个迭代,以及它发生时 nlminb() 正在做什么。我怀疑可能在某些迭代中,目标函数在 Inf/-Inf 处评估,但我不知道 nlminb() 下一步做什么。此外,fitcopula() 似乎也发生了类似的事情,但优化仍然进行到最后,只有上述警告。
如果您能帮助我了解正在发生的事情、如何自行调试和/或如何处理问题,我将不胜感激。从问题中可以明显看出,我在编码方面没有很强的背景。非常感谢所有花时间考虑这个问题的人。
更新:
当我运行 dcopula(x,claytoncopula(-1+exp(guess(x))))
或等效的 clayton_density(x,-1+exp(guess(x)))
时,很明显密度在几个数据点评估为 0。不幸的是,使用 x <- pobs(x)
创建伪观察并不能解决问题,可以通过重复 dcopula(x,claytoncopula(-1+exp(guess(x))))
看到。结果是,当应用对数函数时,我们得到了几个 -Inf 评估,这当然意味着整个负对数似然函数评估为 Inf,如运行 nll.clayton(guess(x))
所见。因此,除了上述查询之外,欢迎并感谢任何有关在以数字方式执行 MLE 时处理 log(0) 的提示。
第二次更新 如下编辑 nll.clayton 中的第二行似乎工作正常:
nll <- -sum(log(clayton_density(x,theta_trans) + 1e-8))
但是,我不知道这是否是规避问题的“好”方法,因为它不会引入潜在的大错误(尽管如果这样做会让我感到惊讶)。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)