Normal-Distribution
需要算法來計算數據是來自正態分佈與對數正態分佈的樣本的相對可能性
假設您有一組值,並且您想知道它們更有可能是從高斯(正態)分佈中採樣還是從對數正態分佈中採樣的?
當然,理想情況下,您應該對總體或實驗誤差的來源有所了解,因此可以獲得對回答問題有用的其他信息。但是在這裡,假設我們只有一組數字而沒有其他信息。哪個更有可能:從高斯抽樣還是從對數正態分佈抽樣?有多少可能性?我希望的是一種在兩個模型之間進行選擇的算法,並希望量化每個模型的相對可能性。
您可以通過最大似然將每個分佈(正態或對數正態)擬合到數據中來對分佈類型進行最佳猜測,然後比較每個模型下的對數似然 - 具有最高對數似然的模型是最佳擬合。例如,在 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