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

6

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

我有两个向量,每个向量的长度为28,一个包含预测数据,另一个包含过去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)

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

1
这是单变量优化。为什么要给出2个参数值? - Onyambu
1个回答

3
问题在于你正在使用2个参数以及optim中的默认优化器来初始化par对象,因此它认为,出于某种奇怪的原因,必须解决2个参数(我也遇到过这种情况,但不知道原因)。只需在函数中使用1个值作为par入口,即可获得所需的结果。
xmin <- optim(par = 0.1, fn, fcst = fcst, act = act)

1
谢谢 - 我提供两个(有限的)值的原因是为了提供下限和上限 - 这显然是 Brent 方法所需的,但对于其他方法则不是。默认方法 - Nelder-Mead 并没有起作用,并建议使用 Brent - 我只使用了一个(1)值,它可以正常工作!对于 optimize() 函数,需要上下限,并且结果会受到初始值的影响 - 尽管我仍然不明白为什么! - Deepak Agarwal
所以你定义上下限有误,在 optim 中有变量 lowerupper 用于此目的,而 par 是你要解决的参数的初始值,对于默认方法 Nelder-Mead,它可以正常工作,只是会发出警告。如果你不喜欢警告,请使用不需要边界的 BFGS 方法。 - Alejandro Andrade
Alegandro - 使用optim(),带有par = 1,为什么默认的Nelder-Mead方法不提供值 - 它会提供一个“不可靠”的警告,并且无论是否为下限和上限提供了有限值,都不会生成输出?此外,对于其他方法,为什么只要为任何方法提供了参数的有限初始值,就需要这些边界的有限值,当然不包括Nelder-Mead? - Deepak Agarwal
关于 Nelder-mead,阅读维基百科得知它用于多维空间,所以我想这就是警告出现的原因。 关于边界的有限值,我认为 +/-Inf 不是一个边界,因此需要进行无约束优化,这就是在边界中需要有有限值的原因。请注意,这只是我从optim中理解的,我可能是错的。 - Alejandro Andrade
很棒的回答!如果您有时间,可以看一下这个问题吗?https://stackoverflow.com/questions/68280857/r-x-probs-outside-0-1 谢谢 - stats_noob
@stats555,已经有答案了,你希望我在那里做什么? - Alejandro Andrade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接