対数正規データセットの平均の信頼区間を計算するにはどうすればよいですか?


19

いくつかの場所で、各サンプルの対数を取り、変換されたデータの信頼区間を計算し、逆演算を使用して信頼区間を元に戻すことにより、データセットを正規分布のものに変換できることを聞きました(たとえば、場合は、それぞれ下限と上限の10の累乗になり)。ログ10

ただし、単に平均自体に対して機能しないという理由だけで、このメソッドには少し疑いがあります10平均ログ10バツ平均バツ

これを行う正しい方法は何ですか?平均自体で機能しない場合、平均の信頼区間でどのように機能しますか?


3
たしかにそれは正しいね。このアプローチは一般に機能せず、多くの場合、母平均やサンプル平均を含まない信頼区間が得られます。ここにいくつかの議論があります:amstat.org/publications/jse/v13n1/olsson.htmlこれは答えではありません。実際にリンクについて詳細にコメントするのに十分な問題を調査しなかったからです。
エリック

3
この問題は、古典的な解決策を持っている:projecteuclid.org/...を。コードを含む他のいくつかのソリューションは、epa.gov / oswer / riskassessment / pdf / ucl.pdfで提供されていますが、そこに記載されている少なくとも1つの方法(「チェビシェフ不等式法」)単に間違っています。
whuber

回答:


11

対数正規分布の平均の信頼区間を計算する方法はいくつかあります。ブートストラップとプロファイル尤度という2つの方法を紹介します。また、ジェフリーズに関する以前の議論も紹介します。

ブートストラップ

MLEの場合

この場合、サンプルののMLE (μ,σ)バツ1バツn

μ^=1nj=1nログバツj;σ^2=1nj=1nログバツjμ^2

そして、平均のMLEはです。リサンプリングすることにより、ブートストラップサンプルを取得でき、これを使用して、いくつかのブートストラップ信頼区間を計算できます。次のコードは、これらを取得する方法を示しています。δ^=expμ^+σ^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")

サンプル平均について

ここで、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")

プロファイル尤度

尤度およびプロファイル尤度関数の定義については、を参照してください。次のように私たちがreparameteriseできる可能性の不変プロパティを使用して、その後、および数値的に計算しますプロファイル尤度。μσδσδ=expμ+σ2/2δ

Rpδ=supσLδσsupδσLδσ

この関数は値を取ります;レベル区間は近似信頼度を持ちます。信頼区間を構築するためにこのプロパティを使用します。次のコードはこの区間を取得する方法を示します。01]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)

ベイジアン

このセクションでは、信頼区間を計算するためのMetropolis-HastingsサンプリングおよびJeffreys事前使用に基づく代替アルゴリズムを示します。δ

ことをリコール前にジェフリーズのために対数正規モデルではありますμσ

πμσσ2

そして、この事前分布は再パラメーター化の下で不変である。この事前分布は不適切ですが、サンプルサイズが場合、パラメーターの後方は適切です。次のコードは、このベイジアンモデルを使用して95%の信頼性間隔を取得する方法を示しています。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))

それらは非常に似ていることに注意してください。


1
(1)私は、あなたはまた、信頼区間がdistrMod Rパッケージと最尤理論に基づいて取得することができると思う
ステファン・ローランを

@StéphaneLaurent情報をありがとう。新しい事前分布を使用してコードの結果を確認したいと思います。私はあなたが使用しているコマンドとパッケージを知りませんでした。

4
美しい応答@Procrastinator。もう1つのアプローチは、対数スケールの平均から離れたすべての残差を使用して元のスケールの予測値を取得し、それらを単純に平均化するスミアリング推定器です。ただし、標準のブートストラップパーセンタイル方式を使用する場合を除き、このアプローチを使用する信頼区間については最新ではありません。n
フランクハレル

素晴らしい反応!ここで提案するアプローチは、ホモセダスティックモデルのエラーを想定しています。この想定が成り立たないプロジェクトに取り組んできました。また、代替としてガンマ回帰を使用することをお勧めします。これにより、バイアス補正の必要性が回避されます。
イザベラゲーメント

4

あなたはジェフリーズの事前のベイジアンアプローチを試すかもしれません。正しい頻度で一致するプロパティを持つ信頼区間を生成する必要があります。信頼区間の信頼レベルは、その信頼レベルに近いです。

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

これは非常に興味深く聞こえます。ベイジアン手法が好きになる傾向があるので、それを支持しました。いくつかの参照を追加するか、できればそれが機能する理由についてのわかりやすい説明を追加することで、さらに改善できます。
エリック

it とで "it"(頻繁に一致するプロパティ)が機能することが知られています。以下のために frequentist-整合性は完璧です:信頼性の間隔は通常の信頼区間と全く同じです。以下のために私はそれが正確であるかどうか知らないが、事後分布は逆ガンマあるので、チェックするのは簡単です。それがために働くという事実と必ずしもそれが機能するために働くことを意味しませんのと。いくつかの参照があるかどうかはわかりませんが、そうでなければシミュレーションで確認できます。μσ2μσ2μσ2fμσ2μσ2
ステファンローラン

議論に感謝します。わかりやすく、混乱を避けるために、コメントをすべて削除しました。(+1)

1
@Procrastinatorありがとうございます。また、コメントを削除し、コードの前にジェフリーズに関するポイントを追加しました。
ステファンローラン

誰かがboots.out = boot(data = data0、statistic = function(d、ind){mle(d [ind])}、R = 10000)の仕組みを教えてください。「ind」はインデックスですが、「ind」を見つける方法がわかりません。この2番目の引数はどこを参照していますか?私は代替機能を試してみましたが、うまくいきませんでした。実際の関数ブートを見ると、Indへの参照も表示されません。
アンドールkesselman

0

ただし、この方法には少し疑いがあります。単に平均自体では機能しないためです:10mean(log10(X))≠mean(X)

その通りです。それは算術平均ではなく、幾何平均の公式です。算術平均は正規分布からのパラメーターであり、対数正規データにとってはあまり意味がありません。幾何平均は、データの中心傾向についてより意味のある話をしたい場合の対数正規分布の対応するパラメーターです。

そして、データの対数を取り、通常どおり平均とCIを計算し、逆変換することにより、幾何平均に関するCIを実際に計算します。算術平均の周りに幾何平均のCIを配置することで、分布を混在させたくないのは確かです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.