将对数正态分布拟合为R中的截断数据

时间:2013-06-05 19:03:18

标签: r distribution

对于简短的背景,我很想描述火灾大小的分布,这被认为是遵循对数正态分布(许多小火和少量大火)。对于我的具体应用,我只对一定范围内(> min,< max)的火灾感兴趣。因此,我试图将对数正态分布拟合到已经在两端进行检查的数据集。本质上,我想在审查之前找到最适合完整分布的对数正态分布(μ和sigma)的参数。考虑到我知道我只是在查看分发的一部分,我可以适合分发吗?

我做了一些实验,但已经变得难过了。这是一个例子:

# Generate data #
D <- rlnorm(1000,meanlog = -0.75, sdlog = 1.5)
# Censor data #
min <- 0.10
max <- 20
Dt <- D[D > min]
Dt <- Dt[Dt <= max]

如果我使用fitdistr(MASS)或fitdist(fitdistrplus)拟合非删失数据(D),我显然得到与我输入的参数值大致相同的参数值。但是,如果我符合删失数据(Dt),则参数值不符合预期。问题是如何结合已知的审查。我在其他地方看到过在fitdistr中使用upper和lower的一些引用,但我遇到了一个我不确定如何解决的错误:

> fitt <- fitdist(Dt, "lognormal", lower = min, upper = max)
Error in fitdist(Dt, "lognormal", lower = min, upper = max) : 
The  dlognormal  function must be defined 

我将欣赏任何建议,首先是关于这是否适合审查分发,如果是这样,如何定义dlognormal函数以便我可以使这个工作。谢谢!

1 个答案:

答案 0 :(得分:14)

您的数据未经审查(这意味着在间隔之外进行观察 在那里,但你不知道他们的确切价值) 但被截断(这些观察结果已被丢弃)。

您只需要为fitdist提供密度和累积分布函数 截断的分布。

library(truncdist)
dtruncated_log_normal <- function(x, meanlog, sdlog) 
  dtrunc(x, "lnorm", a=.10, b=20, meanlog=meanlog, sdlog=sdlog)
ptruncated_log_normal <- function(x, meanlog, sdlog) 
  ptrunc(x, "lnorm", a=.10, b=20, meanlog=meanlog, sdlog=sdlog)

library(fitdistrplus)
fitdist(Dt, "truncated_log_normal", start = c(meanlog=0, sdlog=1))
# Fitting of the distribution ' truncated_log_normal ' by maximum likelihood 
# Parameters:
#           estimate Std. Error
# meanlog -0.7482085 0.08390333
# sdlog    1.4232373 0.0668787