确定 beta 分布参数αα和ββ从两个任意点(分位数)

机器算法验证 可能性 分布 贝塔分布
2022-03-30 21:54:53

假设我有两点(p1,x1)(p2,x2)在哪里pi是 beta CDF 上的概率,并且xi是同一个 CDF 上的值。我将如何确定 beta 分布形状参数αβ只有这两点?

为了澄清,我假设我已经知道分布 L 和 U 的下限和上限。

1个回答

解决方案

转型

(p,x)(p,(xL)/(UL))

将这些点转换为 CDF 上的点以进行 Beta(α,β)分配。假设这已经完成(所以我们不需要更改符号),问题是找到αβ为此

F(α,β;xi)=pi,i=1,2

其中 Beta CDF 等于

F(α,β;x)=Γ(α+β)Γ(α)Γ(β)0xtα1(1t)β1dt.

这是一个很好的功能α>0β>0:在这些论点中是可区分的,并且评估成本不会太高。但是,不存在封闭形式的通解,因此必须使用数值方法。


实施技巧

当心:当两者xi处于分布的同一尾部,或者当两者接近时0或者1,找到一个可靠的解决方案可能会有问题。在这种情况下有用的技术是

  1. 重新参数化分布以避免强制执行“硬”约束α0,β0. 一种可行的方法是使用这些参数的对数。

  2. 优化相对误差的度量。对 CDF 执行此操作的一个好方法是使用值的logits的平方差:也就是说,替换pi经过logit(pi)=log(pi/(1pi))并且适合logit(F(α,β;xi))通过最小化平方差的和来得到这些值。

  3. 要么从对参数的非常好的估计开始,要么——如实验所示——高估它们。(在遵循准则 #2 时,这可能不太必要。)

例子

以下示例代码说明了这些方法,其中使用nlmR. 即使在第一种情况下,它也能产生完美的拟合,这在数值上具有挑战性,因为xi小而远进入同一条尾巴。输出包括覆盖拟合(红色)的真实 CDF(黑色)图。图上的点显示了两者(xi,pi)对。

这种解决方案在更极端的情况下可能会失败:获得正确参数的近似估计有助于确保成功。

数字

#
# Logistic transformation of the Beta CDF.
#
f.beta <- function(alpha, beta, x, lower=0, upper=1) {
  p <- pbeta((x-lower)/(upper-lower), alpha, beta)
  log(p/(1-p))
}
#
# Sums of squares.
#
delta <- function(fit, actual) sum((fit-actual)^2)
#
# The objective function handles the transformed parameters `theta` and
# uses `f.beta` and `delta` to fit the values and measure their discrepancies.
#
objective <- function(theta, x, prob, ...) {
  ab <- exp(theta) # Parameters are the *logs* of alpha and beta
  fit <- f.beta(ab[1], ab[2], x, ...)
  return (delta(fit, prob))
}
#
# Solve two problems.
#
par(mfrow=c(1,2))
alpha <- 15; beta <- 22 # The true parameters
for (x in list(c(1e-3, 2e-3), c(1/3, 2/3))) {
  x.p <- f.beta(alpha, beta, x)        # The correct values of the p_i
  start <- log(c(1e1, 1e1))            # A good guess is useful here
  sol <- nlm(objective, start, x=x, prob=x.p, lower=0, upper=1,
             typsize=c(1,1), fscale=1e-12, gradtol=1e-12)
  parms <- exp(sol$estimate)           # Estimates of alpha and beta
  #
  # Display the actual and estimated values.
  #
  print(rbind(Actual=c(alpha=alpha, beta=beta), Fit=parms))
  #
  # Plot the true and estimated CDFs.
  #      
  curve(pbeta(x, alpha, beta), 0, 1, n=1001, lwd=2)
  curve(pbeta(x, parms[1], parms[2]), n=1001, add=TRUE, col="Red")
  points(x, pbeta(x, alpha, beta))
}