(优化)错误:(列表)对象不能被强制键入'double'

时间:2019-11-15 14:58:20

标签: r optimization input

在更大的优化任务中,我陷入了需要在optim中输入列表的问题。但是,当列表中有一个向量时,我得到了错误

(list)对象不能被强制键入“ double”

下面有一个可重复的示例,错误源在butter行中。将其分成标量可以使代码正常工作,但是我真正想要的是像init_param这样的列表(其中butter是向量)。

fun = function(param_list){

  x2 = param_list[["x2"]]
  bread = param_list[["bread"]]
  x3 = param_list[["x3"]]
  butter = param_list[["butter"]]

  sum(
    (bread - 3)^2, (x2-4)^2, (x3-125)^2, (butter[1])^2, (butter[2])^2
    )
}

init_param = list(x3 = -1, bread = 50, x2 = 120, butter = c(1,2))

optim(par = init_param, fn = fun)

2 个答案:

答案 0 :(得分:1)

par的参数必须是标量,因此您的butter会丢掉东西。

一种补救方法是将向量分解为标量。 (我会保留您最终的sum公式,尽管此方法可以轻松地以不同方式更改事物以获得相同的结果。)

fun = function(param_list){

  x2 = param_list[["x2"]]
  bread = param_list[["bread"]]
  x3 = param_list[["x3"]]
  butter = c(param_list[["butter1"]], param_list[["butter2"]])

  sum(
    (bread - 3)^2, (x2-4)^2, (x3-125)^2, (butter[1])^2, (butter[2])^2
    )
}
init_param = list(x3 = -1, bread = 50, x2 = 120, butter1 = 1, butter2 = 2)

optim(par = init_param, fn = fun)
# $par
#            x3         bread            x2       butter1       butter2 
# 124.995189738   2.998084514   3.997427390   0.004101379  -0.005390156 
# $value
# [1] 7.930112e-05
# $counts
# function gradient 
#      262       NA 
# $convergence
# [1] 0
# $message
# NULL

答案 1 :(得分:0)

optim函数要求输入必须是简单的向量。您可以使用unlist来重组代码,以根据所拥有的内容显式创建矢量,然后调整功能和周围的代码。

init_param = list(x3 = -1, bread = 50, x2 = 120, butter = c(1,2))
param_vector <- unlist(init_param)
param_vector
#>      x3   bread      x2 butter1 butter2 
#>      -1      50     120       1       2