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
我试图通过使用 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