R: optim 错误: 'list' 对象不能被强制键入 'double'

R: Error in optim: 'list' object cannot be coerced to type 'double'

我试图通过使用 optim 最小化 Kullback-Leibler 散度来获取双指数模型的参数。我正在使用的函数有 3 个参数,但是当我使用 par = par 将它们传递给 optim 时,它会抛出错误“无法强制列表对象键入 'double'”,但我甚至不使用列表。

这是我使用的代码:

library(logKDE) # for kernel density of positive distributions
# Simulate rv of the bi-exponential
p <- 0.7
n <- 50
w <- 2
b <- 0.2
delt <- 0.01

biexp_data <- (p * rexp(n, 1/w) + (1 - p) * rexp(n, 1/b)) -  delt

# define kld to optimize
kld_optim <- function(x, par, from_a, to_b) {
  par <- unlist(par)
  w <- par[1]
  b <- par[2]
  p <- par[3]
  d <- 0.002
  
  integrand <- function(x, w, b, p, d, t) {
    
    denx <- logdensity(x, bw = 'logG', from = from_a, to = to_b)
    f.y <- approx(unlist(denx$x), unlist(denx$y), t)$y
    f.x <- p * dexp(t - d, rate = 1/w) + (1 - p) * dexp(t - d, rate = 1/b)
    tmpRatio <- f.x * (log2(f.x) - log2(f.y))
    # Return
    ifelse(is.infinite(tmpRatio), 0, ifelse(is.na(tmpRatio), 0, tmpRatio))

  }
  
  integrate(integrand, 
            from_a, to_b, 
            x = x,
            w = w, b = b, p = p, d = d)
  
}

optim(par = c(2, 0.1, 0.6),
      fn = kld_optim, 
      from_a = 0.01, 
      to_b = 20,
      x = biexp_data)

为什么会这样?

谢谢!

您传递给 optim 的函数需要 return 一个标量值,而您的 kld_optim 函数 return 是对 [=13= 的调用的结果] 根据 ?integrate 帮助页面,return 是一个列表,而不是数值。 “值”包含在该列表中,名称为“值”。因此,将您的 integrate() 调用更改为

  integrate(integrand, 
            from_a, to_b, 
            x = x,
            w = w, b = b, p = p, d = d)$value