R:优化错误:“列表”对象不能被强制输入“双”

Posted

技术标签:

【中文标题】R:优化错误:“列表”对象不能被强制输入“双”【英文标题】:R: Error in optim: 'list' object cannot be coerced to type 'double' 【发布时间】:2020-11-30 17:29:34 【问题描述】:

我正在尝试通过使用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)

为什么会这样?

谢谢!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

是的,你是对的。现在我遇到了另一个问题。它说“非常糟糕的整合行为”。现在,我想那是我的程序有问题。您是否知道其他可行的整合方法? @jealcalat 尝试在integrate 中大量增加subdivisions 的数量。

以上是关于R:优化错误:“列表”对象不能被强制输入“双”的主要内容,如果未能解决你的问题,请参考以下文章

java.util.ArrayList 不能强制转换为

不明白不能强制类型“关闭”错误

R语言 字符串

使用 KerasClassifier 随机搜索cv 进行超参数优化,TypeError: 'list' 对象不能被解释为整数

Bigrquery 不能强制整数

一日一技:在Python中双下划线私有方法不能被调用的原理