在 r 中编码似然和对数似然函数以执行优化

Coding likelihood and log-likelihood function in r to perform optimization

我正在写一篇论文,要求我找到 Gumbel 类型 I 的 MLE 双变量指数分布。我已经证明了似然函数和对数似然函数 likelihood and log-likelihood 但我正在努力在 r 中实现它以使用 Optim 函数执行优化。我的代码生成 NA 值。 以下是我的代码。

# likelihood function of x
likelihood.x = function(params, data) {
  lambda1 = params[1]
  lambda2 = params[2]
  theta = params[3]
  A = (1 - theta) * (lambda1 * lambda2)
  B = theta * (lambda1 ^ 2) * lambda2 * data$X1
  C = theta * lambda1 * (lambda2 ^ 2) * data$X2
  D = (theta ^ 2) * (lambda1 ^ 2) * (lambda2 ^ 2) * data$X1 * data$X2
  E = (lambda1 * data$X1) + (lambda2 * data$X2) + (theta * lambda1 * lambda2 * data$X1 * data$X2)
  f = sum(log(A + B + C + D)) - sum(E)
  return(exp(f))
}
# Log-likelihood function of x
log.likelihood.x = function(params, data){
  lambda1 = params[1]
  lambda2 = params[2]
  theta = params[3]
  A = (1 - theta) * (lambda1 * lambda2)
  B = theta * (lambda1 ^ 2) * lambda2 * data$X1
  C = theta * lambda1 * (lambda2 ^ 2) * data$X2
  D = (theta ^ 2) * (lambda1 ^ 2) * (lambda2 ^ 2) * data$X1 * data$X2
  E = (lambda1 * data$X1) + (lambda2 * data$X2) + (theta * lambda1 * lambda2 * data$X1 * data$X2)
  f = sum(log(A + B + C + D)) - sum(E)
  return(-f)
}

这是生成数据的函数

# Simulating data
rGBVE = function(n, lambda1, lambda2, theta) {
  x1 = rexp(n, lambda1)
  lambda12 = lambda1 * lambda2
  pprod = lambda12 * theta
  C = exp(lambda1 * x1)
  A = (lambda12 - pprod + pprod * lambda1 * x1) / C
  B = (pprod * lambda2 + pprod ^ 2 * x1) / C
  D = lambda2 + pprod * x1
  wExp = A / D
  wGamma = B / D ^ 2
  data.frame(x1, x2 = rgamma(n, (runif(n) > wExp / (wExp + wGamma)) + 1, D))
}

data = rGBVE(n=100, lambda1 = 1.2, lambda2 = 1.4, theta = 0.5)
colnames(data) = c("X1", "X2") 

我的目标是使用 r 中的 Optim() 找到 lambda1、lambda2 和 theta 的 MLE。

请帮助我在 r 中实现似然函数和对数似然函数。 谢谢。

您的问题似乎与警告消息有关

In log(A+B+C+D): NaNs produced

此类警告通常 无害 — 它只是意味着优化算法在某个地方尝试了一组参数,但违反了条件 A+B+C+D ≥ 0。由于这些是相当复杂的表达式,因此需要花费一些精力来弄清楚如何约束参数(或重新参数化函数,例如在对数刻度上拟合某些参数)以避免警告,但猜测保留参数 non-negative 会有所帮助,我们可以尝试使用 L-BFGS-B 算法(这是 optim() 中唯一可用的允许多维有界优化的算法)。

r1 <- optim(par = c(1,2,1),
      fn = log.likelihood.x,
      dat  = data)

r2 <- optim(par = c(1,2,1),
      fn = log.likelihood.x,
      lower = rep(0,3),
      method = "L-BFGS-B",
      dat  = data)

第二个不生成警告,结果接近(如果不相同):

all.equal(r1$par, r2$par)
## "Mean relative difference: 0.0001451953"      

您可能想要使用 bbmle,它具有一些用于可能性建模的附加功能:

library(bbmle)
fwrap <- function(x) log.likelihood.x(x, dat = data)
parnames(fwrap) <- c("lambda1", "lambda2", "theta")
m1 <- mle2(fwrap, start = c(lambda1 = 1, lambda2 = 2, theta = 1), vecpar = TRUE,
           method = "L-BFGS-B", lower = c(0, 0, -0.5))
pp <- profile(m1)
plot(pp)
confint(pp)
confint(m1, method = "quad")