对于简短的背景,我很想描述火灾大小的分布,这被认为是遵循对数正态分布(许多小火和少量大火)。对于我的具体应用,我只对一定范围内(> 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函数以便我可以使这个工作。谢谢!
答案 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