Günlük normal veri kümesinin ortalaması için bir güven aralığını nasıl hesaplayabilirim?


19

Her bir örneğin logaritmasını alarak, dönüştürülen verilerin güven aralığını hesaplayarak ve ters işlemi kullanarak güven aralığını geri dönüştürebildiğiniz veri kümesini normal dağıtılmış bir şeye dönüştürebileceğinizi duydum / gördüm (örneğin, için sırasıyla alt ve üst sınırların gücüne 10 yükseltin ).log10

Ancak, bu yöntemden biraz şüpheliyim, çünkü bu sadece ortalama için çalışmaz:10mean(log10(X))mean(X)

Bunu yapmanın doğru yolu nedir? Ortalamanın kendisi için işe yaramazsa, ortalama için güven aralığı için nasıl çalışabilir?


3
Tamamen haklısın. Bu yaklaşım genellikle işe yaramaz ve genellikle popülasyon ortalamasını ve hatta örnek ortalamasını içermeyen güven aralıkları sağlar. Burada bazı tartışmalar var: amstat.org/publications/jse/v13n1/olsson.html Bu bir cevap değil, çünkü bağlantıya ayrıntılı olarak yorum yapacak kadar konuya bakmadım .
Erik

3
Bu sorunun klasik bir çözümü var: projecteuclid.org/… . Kod da dahil olmak üzere diğer bazı çözümler epa.gov/oswer/riskassessment/pdf/ucl.pdf-- adresinde sağlanmıştır, ancak bunu burada açıklanan en az bir yöntemle okuyun ("Chebyshev Eşitsizliği Yöntemi") sadece yanlıştır.
whuber

Yanıtlar:


11

Lognormal dağılımın ortalaması için güven aralıklarını hesaplamanın birkaç yolu vardır. İki yöntem sunacağım: Bootstrap ve Profile olasılığı. Ayrıca daha önce Jeffreys hakkında bir tartışma sunacağım.

çizme atkısı

MLE için

Bu durumda, bir örnek için MLE değeri(μ,σ)(x1,...,xn)

μ^=1nΣj=1ngünlük(xj);σ^2=1nΣj=1n(günlük(xj)-μ^)2.

Ardından, ortalamanın MLE değeri . Biz edinebilirsiniz yeniden örnekleyerek önyükleme örneği arasında ve bu kullanarak, biz hesaplayabilirsiniz birkaç önyükleme güven aralıkları. Aşağıdaki kodlar bunların nasıl elde edileceğini gösterir.δ^=tecrübe(μ^+σ^2/2) δδ^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")

Numune ortalaması için

Şimdi, MLE yerine tahmincisi göz önüne alındığında . Diğer tahmin ediciler de dikkate alınabilir.δ~=x¯

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")

Profil olasılığı

Olabilirlik ve profil olabilirlik fonksiyonlarının tanımı için bakınız . Olasılıkın değişmezlik özelliğini kullanarak aşağıdaki şekilde yeniden hesaplayabiliriz , burada ve sonra sayısal olarak hesaplayabiliriz. profil olasılığı .(μ,σ)(δ,σ)δ=tecrübe(μ+σ2/2)δ

R,p(δ)=yudumσL(δ,σ)yudumδ,σL(δ,σ).

Bu fonksiyon değerleri alır ; seviyesinin bir aralık yaklaşık sahiptir güvenini Biz bir güven aralığı oluşturmak için bu özelliği kullanmak için gidiyoruz. şu. Kodları gösterileri nasıl bu aralığını elde etmek .(0,1]0.147 95%δ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)

Bayes

Bu bölümde, için bir güvenilirlik aralığı hesaplamak için Metropolis-Hastings örneklemesi ve daha önce Jeffreys kullanımına dayanan alternatif bir algoritma sunulmuştur.δ

Bu geri çağırma önce Jeffreys için bir Lognormal modelinde olduğu(μ,σ)

π(μ,σ)ασ-2,

ve bu öncekinin yeniden parametrelendirme altında değişmez olduğu. Bu önceki , ancak örnek boyutu ise parametrelerin posterioru . Aşağıdaki kod, bu Bayesian modelini kullanarak% 95 güvenilirlik aralığının nasıl elde edileceğini gösterir.n2R

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))

Çok benzer olduklarını unutmayın.


1
(+1) Ayrıca, distrMod R paketi ile maksimum olabilirlik teorisine dayalı güven aralıkları da alabileceğinizi düşünüyorum
Stéphane Laurent

@ StéphaneLaurent Bilgi için teşekkürler. Kodunuzun sonucunu yeni öncekiyle görmek istiyorum. Kullandığınız komutların ve paketin farkında değildim.

4
n

Mükemmel yanıt! Burada önerilen yaklaşımlar homoscedastik model hatalarını varsayar - bu varsayımın makul olmadığı projeler üzerinde çalıştım. Ayrıca, bir önyargı düzeltmesi ihtiyacını atlayacak bir alternatif olarak gama regresyonunun kullanılmasını öneririm.
Isabella Ghement

4

Bayes yaklaşımını Jeffreys ile önceden deneyebilirsiniz. Doğru sıklık eşleme özelliğine sahip güvenilirlik aralıkları sağlamalıdır: güvenilirlik aralığının güven düzeyi, güvenilirlik düzeyine yakındır.

 # required package
 library(bayesm)

 # simulated data
 mu <- 0
 sdv <- 1
 y <- exp(rnorm(1000, mean=mu, sd=sdv))

 # model matrix
 X <- model.matrix(log(y)~1)
 # prior parameters
 Theta0 <- c(0)
 A0 <- 0.0001*diag(1)
 nu0 <- 0 # Jeffreys prior for the normal model; set nu0 to 1 for the lognormal model
 sigam0sq <- 0
 # number of simulations
 n.sims <- 5000

 # run posterior simulations
 Data <- list(y=log(y),X=X)
 Prior <- list(betabar=Theta0, A=A0, nu=nu0, ssq=sigam0sq)
 Mcmc <- list(R=n.sims)
 bayesian.reg <- runireg(Data, Prior, Mcmc)
 mu.sims <- t(bayesian.reg$betadraw) # transpose of bayesian.reg$betadraw
 sigmasq.sims <- bayesian.reg$sigmasqdraw

 # posterior simulations of the mean of y: exp(mu+sigma²/2)
 lmean.sims <- exp(mu.sims+sigmasq.sims/2)

 # credibility interval about lmean:
 quantile(lmean.sims, probs = c(0.025, 0.975))

Bu kulağa çok ilginç geliyor ve Bayes yöntemlerini sevme eğilimim olduğu için bunu iptal ettim. Yine de neden çalıştığına dair bazı referanslar veya tercihen anlaşılabilir bir açıklama ekleyerek geliştirilebilir.
Erik

μσ2μσ2μσ2f(μ,σ2)μσ2. Bazı referanslar olup olmadığını bilmiyorum ama aksi takdirde simülasyonlarla kontrol edebilirsiniz.
Stéphane Laurent

Tartışma için çok teşekkürler. Açıklık ve karışıklığı önlemek için tüm yorumlarımı sildim. (+1)

1
@Procrastinator Çok teşekkürler. Ayrıca yorumlarımı sildim ve kodumdan önce Jeffreys hakkındaki noktayı ekledim.
Stéphane Laurent

Birisi bana boots.out = boot (data = data0, statistic = function (d, ind) {mle (d [ind])}, R = 10000) 'in nasıl çalıştığını açıklayabilir mi? Ben "ind" bir dizin olduğunu görüyorum, ama "ind" bulmak nasıl anlamıyorum. Bu ikinci argüman nerededir? Alternatif işlevlerle denedim ve işe yaramadı. Gerçek işlev önyüklemesine baktığımda, Ind için de bir referans görmüyorum.
andor kesselman

0

Ancak, bu yöntemden biraz şüpheliyim, çünkü bu sadece ortalama için çalışmaz: 10mean (log10 (X)) ≠ ortalama (X)

Haklısın - bu geometrik ortalamanın formülü, aritmetik ortalama değil. Aritmetik ortalama normal dağılımdan bir parametredir ve genellikle lognormal veriler için çok anlamlı değildir. Verileriniz için merkezi bir eğilim hakkında daha anlamlı konuşmak istiyorsanız, geometrik ortalama lognormal dağılımın karşılık gelen parametresidir.

Ve gerçekten, verilerin logaritmalarını alarak, ortalama ve CI'leri her zamanki gibi hesaplayarak ve geri dönüşümü yaparak geometrik ortalama hakkındaki CI'ları hesaplarsınız. CI'leri aritmetik ortalama etrafında geometrik ortalamaya koyarak dağıtımlarınızı karıştırmak istemediğiniz konusunda haklısınız .... yeowch!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.