我一直在尝试使用optim()
或optimize()
函数来最小化绝对预测误差的总和。
我有两个向量,每个向量的长度为28,一个包含预测数据,另一个包含过去28天的实际数据。
fcst
和act
向量如下:
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)
I get 2 values for par like this :-
> xmin
$par
[1] 0.9223822 0.9191707
$value
[1] 3623.823
$counts
function gradient
95 NA
$convergence
[1] 0
$message
NULL
问题是,为什么使用
optim()
函数时,单个参数'par'会得到2个值。我不应该只得到一个(1)值,就像使用optimize()
函数一样,对吗?此外,在任何情况下,参数值的微小差异取决于参数的初始值——当这个目标函数本质上是单峰的时候,这是否应该依赖于初始值?
最好的问候,
Deepak Agarwal