【问题标题】:Why does this code not optimize for all three points?为什么这段代码没有针对所有三点进行优化?
【发布时间】:2010-12-15 01:53:43
【问题描述】:

背景

我正在尝试将分布拟合到 95% CI 和模式。 我使用的成本函数解决了 0 的三个函数:P(X=2.5 | mu, sigma)=0.025, P(X=7.5|mu, sigma)=0.975,以及 log-N(mu, sigma) 的模式) = 3.3。注意:对数正态的模式是 = $e^{\mu-\sigma^2)}$:

接近

首先我写了一个代价函数,prior

prior <- function(parms) {
  a <- abs(plnorm(2.5, parms[1], parms[2]) - 0.025)
  b <- abs(plnorm(7.5, parms[1], parms[2]) - 0.975)
  mode <- exp(parms[1] - parms[2]^2)
  c <- abs(mode-3.3)
  return(a + b + c)
}

然后我寻找最小化成本函数的参数

v = nlm(prior,c(log(3.3),0.14))

很明显,对于 LCL 而不是 UCL 模式,函数已最大化。

abs(plnorm(7.5, parms[1], parms[2]) - 0.975)
> [1] 0.02499989

这是在所需 95%CI 处的虚线图:

x <- seq(0,10,0.1)
plot(x,dlnorm(x, v$estimate[1],v$estimate[2]),type='l')
abline(v=c(2.5,7.5), lty=2) #95%CI

问题

优化两点紧密,所有的错误都在第三点。但是,我希望它能够均匀地拟合这些点。

我怎样才能让函数对 abc 项的大小赋予同等权重?看来该函数只适合 ac

注意: 这个问题是基于 [crossvalidated][1] 提出的一个问题,除了这个版本专门关于 R 的 nlm() 优化算法的功能,而 CV 问题是关于寻找更合适的分布。

【问题讨论】:

  • 也许我遗漏了一些东西,但我没有看到参数 X 在名为 Prior 的成本函数中是如何使用的。
  • @Samsdram,你是对的,我已经修复了错误。在原始代码中,x 用于设置 CI,即 x = c(2.5, 7.5),但我决定修复帖子中的值以简化它。
  • 我怀疑你是否一直在正确解释你得到的东西。如果将mode从previous函数中去掉,结果差别很小。
  • @DWin 我看到了,但我不清楚为什么会发生这种情况。是给你的吗?
  • 尝试在感兴趣的范围内绘制你的函数:plot(seq(0,10,0.1), abs(plnorm(seq(0,10,0.1), 1.3197251, 0.3546866) - 0.025) + abs(plnorm(seq(0,10,0.1), 1.3197251, 0.3546866) - 0.975)+ exp(1.3197251 - 0.3546866^2))

标签: optimization r probability


【解决方案1】:

您的优化“不起作用”的原因是abc 这三个参数的比例不匹配。 ab 测量概率差异,并且始终可以通过选择一个非常小的标准差值 (parms[2]) 将其设置为不大于 0.025,因为那时 plnorm(2.5, parms[1], parms[2]) 将是 0(相同7.5)。对于 c,相同数量的错误 (0.025) 不会引起注意 - 这是缩放不匹配。

您可以重写您的优化函数,以便通过将分位数与 2.5 和 7.5 进行比较,在 x 尺度上测量所有三个标准的误差:

prior2 <- function(parms) { 
  a <- abs(qlnorm(0.025, parms[1], parms[2]) - 2.5) 
  b <- abs(qlnorm(0.975, parms[1], parms[2]) - 7.5) 
  mode <- exp(parms[1] - parms[2]^2) 
  c <- abs(mode-3.3) 
  return(a + b + c) 
} 

这类似于 Ramnath 的建议,除了不是在对数刻度上。这种方法在左尾的效果并​​不好,因为分布向右倾斜:较低 2.5 个百分位数位置的微小变化会导致 2.5 个百分位数的大变化,而 7.5 则并非如此。 Ramnath 在对数尺度上工作的建议解决了这个问题,因为对数正态分布在对数尺度上是对称的。

另一种提高适合度的方法是更改​​优化标准。现在你正在最小化平均绝对误差。这意味着只要其他两个错误项非常小,一个大错误就可以了。您可以通过最小化均方误差 (a^2+b^2_c^2) 来对大错误施加更大的惩罚。从我的角度来看,这个最新版本(在对数尺度上)产生了最好看的估计。

prior3 <- function(parms) { 
  a <- abs(parms[1] - 1.96*parms[2] - log(2.5))
  b <- abs(parms[1] + 1.96*parms[2] - log(7.5)) 
  c <- abs(parms[1] - parms[2]^2 - log(3.3)) 
  return(a^2 + b^2 + c^2) 
} 

【讨论】:

    【解决方案2】:

    尝试您的优化函数的替代公式。对数正态分布的 95% 置信区间的对数由 mu - 2*sigma 和 mu + 2*sigma 给出。所以你基本上可以尝试最小化 abs(mu - 2*sigma - log(2.5)) + abs(mu + 2*sigma - log(7.5)) + abs(mu - sigma^2 - log(3.3))。

    当我最小化这个时,我发现置信区间非常接近,而模式有点偏离。根据您的应用程序的性质,您可能希望对这三个术语进行不同的加权

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      相关资源
      最近更新 更多