Confidence-Interval

如何計算對數正態數據集均值的置信區間?

  • July 31, 2012

我在幾個地方聽說/看到您可以通過取每個樣本的對數將數據集轉換為正態分佈的數據,計算轉換數據的置信區間,然後使用逆運算將置信區間轉換回來(例如,分別提高 10 的下限和上限的冪,對於)。

但是,我對這種方法有點懷疑,僅僅是因為它不適用於均值本身:

這樣做的正確方法是什麼?如果它不適用於平均值本身,它怎麼可能適用於平均值的置信區間?

有幾種方法可以計算對數正態分佈均值的置信區間。我將介紹兩種方法:Bootstrap 和 Profile 可能性。我還將介紹關於 Jeffreys 之前的討論。

引導程序

對於 MLE

在這種情況下,MLE $ (\mu,\sigma) $ 樣品 $ (x_1,…,x_n) $

$$ \hat\mu= \dfrac{1}{n}\sum_{j=1}^n\log(x_j);,,,\hat\sigma^2=\dfrac{1}{n}\sum_{j=1}^n(\log(x_j)-\hat\mu)^2. $$

那麼,均值的 MLE 為 $ \hat\delta=\exp(\hat\mu+\hat\sigma^2/2) $ . 通過重採樣,我們可以獲得一個自舉樣本 $ \hat\delta $ 並且,使用它,我們可以計算幾個引導置信區間。以下R代碼顯示瞭如何獲取這些。

rm(list=ls())
library(boot)

set.seed(1)

# Simulated data
data0 = exp(rnorm(100))

# Statistic (MLE)

mle = function(dat){
m = mean(log(dat))
s = mean((log(dat)-m)^2)
return(exp(m+s/2))
}

# Bootstrap
boots.out = boot(data=data0, statistic=function(d, ind){mle(d[ind])}, R = 10000)
plot(density(boots.out$t))

# 4 types of Bootstrap confidence intervals
boot.ci(boots.out, conf = 0.95, type = "all")

對於樣本均值

現在,考慮估計器 $ \tilde{\delta}=\bar{x} $ 而不是 MLE。也可以考慮其他類型的估計器。

rm(list=ls())
library(boot)

set.seed(1)

# Simulated data
data0 = exp(rnorm(100))

# Statistic (MLE)

samp.mean = function(dat) return(mean(dat))

# Bootstrap
boots.out = boot(data=data0, statistic=function(d, ind){samp.mean(d[ind])}, R = 10000)
plot(density(boots.out$t))

# 4 types of Bootstrap confidence intervals
boot.ci(boots.out, conf = 0.95, type = "all")

輪廓可能性

有關似然函數和輪廓似然函數的定義,請參閱。使用似然性的不變性,我們可以重新參數化如下 $ (\mu,\sigma)\rightarrow(\delta,\sigma) $ , 在哪裡 $ \delta=\exp(\mu+\sigma^2/2) $ 然後數值計算輪廓似然 $ \delta $ .

$$ R_p(\delta)=\dfrac{\sup_{\sigma}{\mathcal L}(\delta,\sigma)}{\sup_{\delta,\sigma}{\mathcal L}(\delta,\sigma)}. $$

這個函數取值 $ (0,1] $ ; 水平區間 $ 0.147 $ 有一個近似的置信度 $ 95% $ . 我們將使用這個屬性來構建一個置信區間 $ \delta $ . 以下R代碼顯示瞭如何獲取此間隔。

set.seed(1)

# Simulated data
data0 = exp(rnorm(100))

# Log likelihood
ll = function(mu,sigma) return( sum(log(dlnorm(data0,mu,sigma))))

# Profile likelihood
Rp = function(delta){
temp = function(sigma) return( sum(log(dlnorm(data0,log(delta)-0.5*sigma^2,sigma)) ))
max=exp(optimize(temp,c(0.25,1.5),maximum=TRUE)$objective     -ll(mean(log(data0)),sqrt(mean((log(data0)-mean(log(data0)))^2))))
return(max)
}

vec = seq(1.2,2.5,0.001)
rvec = lapply(vec,Rp)
plot(vec,rvec,type="l")

# Profile confidence intervals
tr = function(delta) return(Rp(delta)-0.147)
c(uniroot(tr,c(1.2,1.6))$root,uniroot(tr,c(2,2.3))$root)

$ \star $ 貝葉斯

在本節中,一種基於 Metropolis-Hastings 抽樣和使用 Jeffreys 先驗的替代算法,用於計算可信區間 $ \delta $ 被呈現。

回想一下Jeffreys 之前的 $ (\mu,\sigma) $ 在對數正態模型中是

$$ \pi(\mu,\sigma)\propto \sigma^{-2}, $$

並且這個先驗在重新參數化下是不變的。這個先驗是不合適的,但是如果樣本量大,參數的後驗是合適的 $ n\geq 2 $ . 以下R代碼顯示瞭如何使用此貝葉斯模型獲得 95% 的可信區間。

library(mcmc)

set.seed(1)

# Simulated data
data0 = exp(rnorm(100))

# Log posterior
lp = function(par){
if(par[2]>0) return( sum(log(dlnorm(data0,par[1],par[2]))) - 2*log(par[2]))
else return(-Inf)
}

# Metropolis-Hastings
NMH = 260000
out = metrop(lp, scale = 0.175, initial = c(0.1,0.8), nbatch = NMH)

#Acceptance rate
out$acc

deltap = exp(  out$batch[,1][seq(10000,NMH,25)] + 0.5*(out$batch[,2][seq(10000,NMH,25)])^2  )

plot(density(deltap))

# 95% credibility interval
c(quantile(deltap,0.025),quantile(deltap,0.975))

請注意,它們非常相似。

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

comments powered by Disqus