在R中使用optim()或optimize()函数

时间:2018-02-21 00:01:02

标签: r

我一直在尝试使用optim()optimize()函数来最小化绝对预测错误的总和。

我有2个向量,每个长度为28,1,包含预测数据,另一个包含过去28天的实际数据。

fcstact向量位于: -

fcst <- c(3434.23, 3434.23, 3232.4, 1894.63, 1989.23, 3827.71, 3827.71, 3827.71, 3434.23, 1984.42, 1894.63, 1989.23, 3827.71, 3827.71, 3827.71, 3827.71, 3625.88, 2288.11, 1989.23, 3434.23, 3434.23, 3434.23, 3434.23, 3232.4, 2288.11, 2382.71, 3827.71, 3827.71)

act <- c(3194.62, 3109.93, 2991.44, 1741.49, 1935.07, 3100.84, 3169.39, 3170.24, 2613.81, 1947.35, 1820.63, 1765.62, 3397.48, 3501.14, 3444.14, 3589.24, 3263.55, 2153.49, 2159.85, 3237.94, 3345.7, 3246.66, 3195.58, 3001.53, 2073.76, 2419.29, 3530.62, 3455.71)

我创建了一个像这样的目标函数: -

fn <- function(fcst, act, par) {
sum(abs(act - (fcst * par)))}

使用optimize()函数如下: -

xmin1 <- optimize(fn, c(0.5, 1.5), fcst = fcst, act = act)

我得到'par'的正确值 - 没问题。

> xmin1
$minimum
[1] 0.92235

$objective
[1] 3630.399

然而,当我使用optim()函数时: -

xmin <- optim(par = c(0.1, 1.9), fn, fcst = fcst, act = act)

我得到2个像par这样的值: -

> xmin
$par
[1] 0.9223822 0.9191707

$value
[1] 3623.823

$counts
function gradient 
      95       NA 

$convergence
[1] 0

$message
NULL

问题是为什么我使用optim()函数获得单个参数'par'的2个值。我不应该像optimize()函数那样得到一(1)个值吗?

此外,在任何一种情况下,根据参数的初始值,我得到的参数值略有不同 - 当这个目标函数基本上是单峰时,这应该取决于初始值吗?

祝你好运

Deepak Agarwal

1 个答案:

答案 0 :(得分:1)

问题是你正在使用2个参数和LOG.debug(...)中的默认优化器初始化par对象,所以它认为,由于一些奇怪的原因,它必须解决2个参数(这有发生在我身上,但我不知道为什么)只需在函数中的optim条目中使用1值,您就可以获得所需的结果。

par