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:优化错误:“列表”对象不能被强制输入“双”的主要内容,如果未能解决你的问题,请参考以下文章
使用 KerasClassifier 随机搜索cv 进行超参数优化,TypeError: 'list' 对象不能被解释为整数