各分布(正規分布または対数正規分布)を最尤法でデータに適合させ、各モデルの下で対数尤度を比較することにより、分布タイプを最適に推測できます(最高の対数尤度を持つモデルが最適です)。たとえば、Rの場合:
# log likelihood of the data given the parameters (par) for
# a normal or lognormal distribution
logl <- function(par, x, lognorm=F) {
if(par[2]<0) { return(-Inf) }
ifelse(lognorm,
sum(dlnorm(x,par[1],par[2],log=T)),
sum(dnorm(x,par[1],par[2],log=T))
)
}
# estimate parameters of distribution of x by ML
ml <- function(par, x, ...) {
optim(par, logl, control=list(fnscale=-1), x=x, ...)
}
# best guess for distribution-type
# use mean,sd of x for starting parameters in ML fit of normal
# use mean,sd of log(x) for starting parameters in ML fit of lognormal
# return name of distribution type with highest log ML
best <- function(x) {
logl_norm <- ml(c(mean(x), sd(x)), x)$value
logl_lognorm <- ml(c(mean(log(x)), sd(log(x))), x, lognorm=T)$value
c("Normal","Lognormal")[which.max(c(logl_norm, logl_lognorm))]
}
次に、正規分布から数値を生成し、MLによる正規分布に適合させます。
set.seed(1)
x = rnorm(100, 10, 2)
ml(c(10,2), x)
生産物:
$par
[1] 10.218083 1.787379
$value
[1] -199.9697
...
正規分布と対数正規分布のML適合の対数尤度を比較します。
ml(c(10,2), x)$value # -199.9697
ml(c(2,0.2), x, lognorm=T)$value # -203.1891
best(x) # Normal
対数正規分布で試してください:
best(rlnorm(100, 2.6, 0.2)) # lognormal
n、mean、およびsdに応じて、割り当ては完全ではありません。
> table(replicate(1000, best(rnorm(500, 10, 2))))
Lognormal Normal
6 994
> table(replicate(1000, best(rlnorm(500, 2.6, 0.2))))
Lognormal Normal
999 1