Optimization 为什么这段代码没有针对所有三点进行优化?
背景 我正在尝试将发行版与95%的CI和模式相匹配。 我使用的成本函数解出了0的三个函数:P(X=2.5μ,sigma)=0.025,P(X=7.5μ,sigma)=0.975,log-N(μ,sigma)=3.3。注:对数正态分布的模式为=$e^{\mu-\sigma^2)}$: 方法 首先我写一个成本函数,Optimization 为什么这段代码没有针对所有三点进行优化?,optimization,r,probability,Optimization,R,Probability,背景 我正在尝试将发行版与95%的CI和模式相匹配。 我使用的成本函数解出了0的三个函数:P(X=2.5μ,sigma)=0.025,P(X=7.5μ,sigma)=0.975,log-N(μ,sigma)=3.3。注:对数正态分布的模式为=$e^{\mu-\sigma^2)}$: 方法 首先我写一个成本函数,prior prior <- function(parms) { a <- abs(plnorm(2.5, parms[1], parms[2]) - 0.025) b
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)
}
显然,对于LCL模式,功能最大化,而不是UCL模式
abs(plnorm(7.5, parms[1], parms[2]) - 0.975)
> [1] 0.02499989
以下是在所需95%置信区间处用虚线绘制的曲线图:
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
x尝试优化函数的替代公式。对数正态分布95%置信区间的对数由mu-2*σ和mu+2*σ给出。所以你基本上可以试着最小化abs(mu-2*sigma-log(2.5))+abs(mu+2*sigma-log(7.5))+abs(mu-sigma^2-log(3.3))
当我最小化这一点时,我发现置信区间拟合得非常紧密,而模式有点偏离。根据应用程序的性质,您可能希望对这三个术语进行不同的加权。您的优化“不起作用”的原因是三个参数的比例,a
、b
和c
不匹配a
和b
测量概率差异,通过选择一个非常小的标准偏差值(parms[2]
),始终可以将其设置为不大于0.025,因为此后plnorm(2.5,parms[1],parms[2])
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)
}
也许我遗漏了什么,但我不知道参数X在名为Previor的代价函数中是如何使用的。@Samsdram,你是对的,我已经纠正了错误。在最初的代码中,x用于设置CI,即x=c(2.5,7.5),但我决定在帖子中修正值以简化它。我怀疑您是否正确解释了返回的内容。如果将模式从先前的函数中去掉,结果几乎没有什么不同。@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))
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)
}
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)
}