Normal-Distribution

需要算法來計算數據是來自正態分佈與對數正態分佈的樣本的相對可能性

  • July 21, 2013

假設您有一組值,並且您想知道它們更有可能是從高斯(正態)分佈中採樣還是從對數正態分佈中採樣的?

當然,理想情況下,您應該對總體或實驗誤差的來源有所了解,因此可以獲得對回答問題有用的其他信息。但是在這裡,假設我們只有一組數字而沒有其他信息。哪個更有可能:從高斯抽樣還是從對數正態分佈抽樣?有多少可能性?我希望的是一種在兩個模型之間進行選擇的算法,並希望量化每個模型的相對可能性。

您可以通過最大似然將每個分佈(正態或對數正態)擬合到數據中來對分佈類型進行最佳猜測,然後比較每個模型下的對數似然 - 具有最高對數似然的模型是最佳擬合。例如,在 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 

引用自:https://stats.stackexchange.com/questions/65044

comments powered by Disqus