簡體   English   中英

在 r 中編碼似然和對數似然函數以執行優化

[英]Coding likelihood and log-likelihood function in r to perform optimization

我正在寫一篇論文,要求我找到 Gumbel 的 I 型二元指數分布的 MLE。 我已經證明了似然性和對數似然函數似然性和對數似然性,但我正在努力在 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 中實現我的似然性和對數似然函數。 謝謝你。

您的擔憂似乎與警告信息有關

在 log(A+B+C+D) 中:產生了 NaN

這樣的警告通常是無害的——它只是意味着優化算法在違反條件A+B+C+D ≥ 0的過程中嘗試了一組參數。 由於這些是相當復雜的表達式,因此需要花費一些精力來弄清楚如何約束參數(或重新參數化函數,例如在對數刻度上擬合一些參數)以避免警告,但猜測一下保持參數非負會有所幫助,我們可以嘗試使用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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM