Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 为什么这段代码没有针对所有三点进行优化?_Optimization_R_Probability - Fatal编程技术网

Optimization 为什么这段代码没有针对所有三点进行优化?

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

背景

我正在尝试将发行版与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 <- 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) 
}