在R中将对数正态分布拟合到截断数据

4

简要介绍一下,我想描述一种火灾规模的分布情况,这种规模被认为服从对数正态分布(很多小火灾和少数大火灾)。对于我的具体应用,我只关心那些在某个大小范围内的火灾(>最小值,<最大值)。因此,我尝试将对数正态分布拟合到一个数据集上,该数据集已被两端截断。实质上,我想找到最适合未被截断的完整分布的对数正态分布参数(mu和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中使用上限和下限的参考资料,但我遇到了一个错误,不确定如何解决:

> 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个回答

16

您的数据没有被审查(这意味着区间之外的观测值存在,但您不知道它们的确切值), 而是被截断了(这些观测值已被丢弃)。

您只需要向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(q, meanlog, sdlog) 
  ptrunc(q, "lnorm", a=.10, b=20, meanlog=meanlog, sdlog=sdlog)

library(fitdistrplus)
fitdist(Dt, "truncated_log_normal", start = list(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

在编程中,“censored”(审查)和“truncated”(截断)之间有微妙的区别,有这个例子很好。 - IRTFM
这正是我一直在寻找的。谢谢!我之前在“截断”和“审查”之间遇到了一些困惑,以为已经理解了,但显然不是这样。你的解释很有帮助,现在(再次)我认为我明白了区别。 - B Miranda
很高兴在这里见到你,Brian! :) 我想这是从 Cumming(2001)中得出的结论。 - Adam Erickson
2
2019年更新fitdist(Dt, "truncated_log_normal", start = c(meanlog=0, sdlog=1))应替换为fitdist(Dt, "truncated_log_normal", start = list(meanlog=0, sdlog=1))以避免出现错误Wrong type of argument for start。注意:我没有足够的声望添加评论。 - SamGG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接