计算给定平均值和百分比的标准偏差

机器算法验证 正态分布 标准差
2022-04-07 10:30:43

一些值具有均值为 0.0276 的正态分布。需要什么标准偏差才能使 98% 的值介于 0.0275 和 0.0278 之间?

我感到困惑的是当 Z 在两个区间之间时如何计算标准偏差。我知道 P(-.0001/σ < Z < .0002/σ) = .98,但我不知道从哪里开始。

4个回答

使用“68-95-99.7”规则,我们几乎可以立即在脑海中解决这个问题。 我将详细解释该过程,因为这很重要。 答案没有什么意义:这个问题的重点是帮助我们学会思考概率分布。

68-95-99.7 规则中的这些数字是(大约)正态变量位于其平均值的 1、2 和 3 个标准差内的概率百分比。通过从 100% 中减去这些数字,可以得出正态变量超出其平均值的 1、2 和 3 个 SD 的机会分别约为 32、5 和 0.3%。由于这种分布是对称的,我们可以将这些数字中的每一个分成两半,以找出在给定方向上超出平均值的 1、2 和 3 个 SD 的机会:这些值分别约为 16%、2.5% 和 0.15% . (图中显示了稍微更准确的值。)

图:标准法线密度

该图使用区域来表示机会。例如,最左边的值 16% 是曲线下位于 -1 左侧的所有面积的比例。与数字相关的“尾部区域”Z=3,2,1,1,2,3被标记。(这些区域重叠;例如,16% 的值包括 2.3% 和 0.13% 的值所占的区域。)

有效思考概率的人会使用这样的心理数字。

转向问题中的数据: 0.0275 是 0.0276 均值左侧的 0.0001,而 0.0278 是均值右侧的 0.0002:两倍。因此,我们需要将未知数量的标准差之间的概率的 98% 包围在均值的左侧——称之为倍数Z表示它在左侧 - 并且是平均值右侧标准差的两倍,因此是2Z.

等效地,100 - 98 = 2% 的概率必须超出此范围。该图显示 2.3% 的概率位于左侧Z=2基本上 0% 位于Z=2×2=4, 所以Z=2将是一个准确的猜测(尽管有点低)。

达到这一点所需的唯一算术包括减法、除法(0.0002 / 0.0001)和减半。

如果您想更接近“答案”,请查找(或计算)Z其中 2% 的概率在Z: 那是Z=2.054. 仍然是基本上 0% 在右边的情况2Z4.1. (因为实际上还有一点点概率超出4.1,的正确值Z必须比2.054.)

无论哪种方式,我们得出的结果是Z是在某个地方2或者2.054.

最后,回到问题中的数据:Z标准差等于0.0001(或者2Z标准差等于0.0002:这都一样)。 因此,我们的答案是

  • 快速而肮脏,基于 68-95-99.7 规则:0.0001/2=0.00005.

  • 更精致一点,基于表查找:0.0001/2.0540.000048691.

我们知道这两个答案都会有点过大,但第二个必须相当准确。


经过这个思考过程,我们可以R立即写下以下命令,因为它们直接执行计算(尽管更准确):

(Z <- uniroot(function(z) pnorm(2*z)-pnorm(-z) - 0.98, c(2,3))$root)

2.054 158

这与我以前得到的三位十进制数字表一致2.054.

(0.0276 - 0.0275) / Z

4.86 8176e-05

它与我们的第一个答案几乎一致,几乎是两个有效数字,第二个答案几乎是四个有效数字——比我们真正应得的要多。

所以你可以使用 R 来得到答案:

target=function (sd){
  b=pnorm(0.0278, mean = 0.0276, sd = sd)
  a=pnorm(0.0275, mean = 0.0276, sd = sd)
  return(abs(b-a-0.98))
}
sd=optim(1,target)
sd$par

这给出了:

> sd$par
[1] 4.868167e-05

我们正在做的是使用数值方法来计算σ这样

F(0.0278)F(0.0275)=0.98
在哪里F()是 cdf 为N(0.0276,σ)

必须用数值​​求解。这是R使用简单求根算法的解决方案。我们简单地解方程

Fμ,σ(b)Fμ,σ(a)p=0

在哪里Fμ,σ()表示正态分布的累积分布函数,均值μ和标准差σ.ba(和b>a) 分别是上限和下限,并且p(0<p<1) 是介于两者之间的值的比例ab.

该函数find_sigma非常通用:它接受固定参数a,b,μp.

find_sigma <- function(sigma, a, b, mu, prop) {
  (pnorm(b, mean = mu, sd = sigma) - pnorm(a, mean = mu, sd = sigma)) - prop
}

uniroot(
  find_sigma
  , lower = .Machine$double.xmin
  , upper = 1
  , a = 0.0275  # lower bound
  , b = 0.0278  # upper bound
  , mu = 0.0276 # mean
  , prop = 0.98 # proportion between a and b
  , maxiter = 10000
  , tol = 1e-20
  # , extendInt = "yes"
)

$root
[1] 4.868168e-05

标准差是0.000048682正如其他答案所发现的那样。

我相信没有简单的方法来计算这个。我建议研究它的数值解决方案。

稍微解释一下,这是正态分布:

f(x|σ,μ)=12πσe(xμ)22σ2

区间 [a, b] 中值的百分比由下式给出:

F(a,b)=abf(x|σ,μ)dx=bf(x|σ,μ)dxaf(x|σ,μ)dx

你知道 F(a,b),你知道 a 和 b,你知道平均值μ. 你需要做的是解决这个方程σ. 但是,积分是误差函数,无法解析求解,因此无法求解σ.

使用数值方法,它变得更容易 - 例如,您可以计算具有固定的正态分布σ对于 1000 x 值,计算 a 和 b 之间的面积,然后迭代更改σ直到找到最接近 0.98 的值。

大多数编程语言中也有计算给定参数的累积正态分布的函数,所以如果你想要更高的精度,你可以使用这些函数(再次迭代σ)。