MLE/对数正态分布区间的似然

机器算法验证 r 最大似然 可能性 对数正态分布 间隔审查
2022-04-08 20:37:24

我有一组可变的响应,它们表示为一个区间,例如下面的示例。

> head(left)
[1]  860  516  430 1118  860  602
> head(right)
[1]  946  602  516 1204  946  688

其中left是响应的下限,right是响应的上限。我想根据对数正态分布估计参数。

有一段时间,当我试图直接计算可能性时,我一直在努力解决这样一个事实,即由于这两个界限是沿着不同的参数集分布的,所以我得到了一些负值,如下所示:

> Pr_high=plnorm(wta_high,meanlog_high,sdlog_high)
> Pr_low=plnorm(wta_low, meanlog_low,sdlog_low)
> Pr=Pr_high-Pr_low
> 
> head(Pr)
[1] -0.0079951419  0.0001207749  0.0008002343 -0.0009705125 -0.0079951419 -0.0022395514

我无法真正弄清楚如何解决它,并决定使用间隔的中点代替,这是一个很好的折衷方案,直到我找到了提取间隔响应的对数似然的 mledist 函数,这是我得到的摘要:

> mledist(int, distr="lnorm")
$estimate
meanlog     sdlog 
6.9092257 0.3120138 

$convergence
[1] 0

$loglik
[1] -152.1236

$hessian
         meanlog       sdlog
meanlog 570.760358    7.183723
sdlog     7.183723 1112.098031

$optim.function
[1] "optim"

$fix.arg
NULL

Warning messages:
1: In plnorm(q = c(946L, 602L, 516L, 1204L, 946L, 688L, 1376L, 1376L,  :
NaNs produced
2: In plnorm(q = c(860L, 516L, 430L, 1118L, 860L, 602L, 1290L, 1290L,  :
NaNs produced

参数值似乎有意义,并且对数似然比我使用过的任何其他方法(中点分布或任一边界的分布)都大。

有一条我不明白的警告消息,所以谁能告诉我我是否做对了,这条消息意味着什么?

感谢帮助!

1个回答

听起来您可能没有正确计算可能性。

只知道一个值x

  1. 它独立于分布Fθ

  2. 它位于之间(其中独立于),ab>abax

那么(根据定义)它的可能性是 因此,一组独立观察的可能性是这些表达式的乘积,每个观察一个。像往常一样,对数似然将是这些表达式的对数之和。

PrFθ(axb)=Fθ(b)Fθ(a).


例如,这是一个R实现,其中的值在 vector的值在 vector中,并且是对数正态。(这不是一个通用的解决方案;特别是,它假设用于所有数据。)aleftbrightFθb>aba

#
# Lognormal log-likelihood for interval data.
#
lambda <- function(mu, sigma, left, right) {
  sum(log(pnorm(log(right), mu, sigma) - pnorm(log(left), mu, sigma)))
}

和对数标准差的起始值此估计值用其端点的几何平均值替换每个区间:μσ

#
# Create an initial estimate of lognormal parameters for interval data.
#
lambda.init <- function(left, right) {
  mid <- log(left * right)/2
  c(mean(mid), sd(mid))
}

让我们生成一些随机对数正态分布的数据并将它们分成区间:

set.seed(17)
n <- 12                     # Number of data
z <- exp(rnorm(n, 6, .5))   # Mean = 6, SD = 0.5
left <- 100 * floor(z/100)  # Bin into multiples of 100
right <- left + 100

拟合可以由通用多变量优化器执行。(默认情况下这是一个最小化器,因此它必须应用于对数似然的负值。)

fit <- optim(lambda.init(left,right), 
             fn=function(theta) -lambda(theta[1], theta[2], left, right))
fit$par

6.1188785 0.3957045

的估计值为的预期值相差不远的估计值为的预期值相差不远来说还不错。为了看看拟合有多好,让我们绘制经验累积分布函数和拟合分布函数。为了构建 ECDF,我只是通过每个间隔线性插值:μ6.126σ0.400.512

#
# ECDF of the data.
#
F <- function(x) (1 + mean((abs(x - left) - abs(x - right)) / (right - left)))/2

y <- sapply(x <- seq(min(left) * 0.8, max(right) / 0.8, 1), F)
plot(x, y, type="l", lwd=2, lty=2, ylab="Cumulative probability")
curve(pnorm(log(x), fit$par[1], fit$par[2]), from=min(x), to=max(x), col="Red", lwd=2, 
  add=TRUE)

情节

因为垂直偏差一直很小并且上下变化,所以看起来很合适。