【问题标题】:optim() when optimizing for one parameter in R优化 R 中的一个参数时的 optim()
【发布时间】:2021-10-25 22:09:18
【问题描述】:

我试图在函数bayesmeta::qhalfnormal 中找到scale 的单个值,这样向量low_high <- c(.1, 1) 的第一个和第二个元素分别具有.025.975 在其中发生的概率.

换句话说,对于scale 的值,.1 可以有.025 和1 可以有.975 概率。

所以,我有一个参数 (scale) 需要优化,并期望它有一个值。我在下面使用optim,但是这样,我得到scale 的两个值。

有没有更好的优化函数来给我一个scale 的值?

library(bayesmeta)


low_high <- c(.1, 1)  
alpha <- c(.025, .975)

f <- function(x) {   
 low_high - qhalfnormal(alpha, scale = x) }

optim(low_high, function(x)sum(f(x)^2))

# $par
> [1] 3.1939758 0.4461607 # I expect a single value for `scale` 
# But it seems `optim()` has acted like `Vectorize(optimize)` looping over 
# elements of `low_high` vector.

【问题讨论】:

  • 我认为没有单一的尺度可以使等式成立。当然你可以找到一个大概的比例。原因是给定特定比例的半法线分位数确实发生了变化。即规模越小,任何给定概率的分位数越大。在您的情况下,一旦比例升至 0.4461 以上,则分位数的概率均低于 0.975,因此无法求解。简而言之,您的问题没有解决方案。简单地说,想想两条平行线,它们在哪里相交?这就是您要解决的问题
  • @Onyambu,这很有帮助,谢谢!

标签: r function math optimization statistics


【解决方案1】:

您正在传递一个长度为 2 的向量作为初始估计值。如果你想为你的变量设置界限,那是在 optim 中的不同参数下。

【讨论】:

    【解决方案2】:

    @anonymous.asker 是正确的,传递长度为 2 的向量令人困惑optim()。正在发生的事情是qhalfnormal() 正在对分位数和你给它的比例值向量进行向量化:例如qhalfnormal(c(0.1, 1), c(0.025, 0.975)) 返回一个二元素向量,包括 (1) 比例参数为 0.1 的 0.025 分位数和 (2) 比例参数为 1 的 0.975 分位数。然后通过总和将它们折叠为单个输出值-squares 操作 ...(我认为您想要的是评估 qhalfnormal() 的两个分位数级别的 single 比例参数)。

    如果您指定一个与真实值足够接近的单个值,您会得到答案,并会发出警告,建议您不要使用 Nelder-Mead:

    optim(0.45, function(x)sum(f(x)^2))
    

    如果您的起始值与解决方案相距太远,您会收到警告并且只要算法尝试为参数设置负值(“scale > 0 is not TRUE”)就会出现错误。

    执行此操作的明智方法是指定method="Brent"(如警告所示,此时您还需要指定边界:

    optim(1, function(x)sum(f(x)^2), method="Brent", lower=0, upper=10)
    

    这将返回 0.4461;这确实是这个问题的 argmin(对应于最小值的参数)。正如@Onyambu 在 cmets 中指出的那样,它并没有真正解决更大的问题(即尝试将两个值都降低到 0);它解决了提出的问题,即最小化目标函数...

    【讨论】:

    • Ben,我猜@Onyambu 给出了正确答案(我帖子下方的评论)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多