로그 정규 데이터 세트의 평균에 대한 신뢰 구간을 어떻게 계산합니까?


19

여러 곳에서 각 샘플의 로그를 취하여 데이터 세트를 정규 분포의 것으로 변환하고 변환 된 데이터의 신뢰 구간을 계산하고 역 연산을 사용하여 신뢰 구간을 다시 변환 할 수 있다고 들었습니다. (예 : 에 대해 하한과 상한의 거듭 제곱으로 10을 올립니다 .)로그10

그러나이 방법은 그 자체로는 의미가 없습니다.10평균(로그10(엑스))평균(엑스)

이를 수행하는 올바른 방법은 무엇입니까? 평균 자체에 대해 효과가 없다면 평균에 대한 신뢰 구간에 어떻게 작용할 수 있습니까?


3
당신 말이 맞아요 이 방법은 일반적으로 작동하지 않으며 종종 모집단 평균 또는 표본 평균을 포함하지 않는 신뢰 구간을 생성합니다. 여기 amstat.org/publications/jse/v13n1/olsson.html 에 대한 토론이 있습니다. 실제로 링크에 대해 구체적으로 언급 할만큼 충분히 문제를 조사하지 않았기 때문에 이것은 답이 아닙니다.
Erik

3
이 문제는 고전적인 솔루션을 제공 : projecteuclid.org/...를 . 코드를 포함한 일부 다른 솔루션은 epa.gov/oswer/riskassessment/pdf/ucl.pdf 에서 제공되지만 적어도 하나의 방법 ( "Chebyshev 불평등 방법")에 기술되어 있기 때문에 무거운 소금 알갱이로 이것을 읽으십시오. 그냥 잘못되었습니다.
whuber

답변:


11

로그 정규 분포의 평균에 대한 신뢰 구간을 계산하는 방법에는 여러 가지가 있습니다. 부트 스트랩과 프로파일 가능성이라는 두 가지 방법을 제시하겠습니다. 또한 Jeffreys에 대한 논의를 발표 할 것입니다.

부트 스트랩

MLE를 위해

이 경우 샘플 대한 의 MLE (μ,σ)(엑스1,...,엑스)

μ^=1제이=1로그(엑스제이);σ^2=1제이=1(로그(엑스제이)μ^)2.

그런 다음 평균의 MLE는 입니다. 리샘플링을 통해 의 부트 스트랩 샘플 을 얻을 수 있으며 이를 사용하여 여러 부트 스트랩 신뢰 구간을 계산할 수 있습니다 . 다음 코드는이를 얻는 방법을 보여줍니다.δ^=특급(μ^+σ^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 할 가능성의 불변 특성을 사용하여 다음 여기서 다음 수치를 계산 의 프로필 가능성 .(μ,σ)(δ,σ)δ=특급(μ+σ2/2)δ

아르 자형(δ)=저녁을 먹다σ(δ,σ)저녁을 먹다δ,σ(δ,σ).

이 함수의 값을 얻어 레벨 간격 대략 갖는다 자신감 우리가 신뢰 구간을 구성하는 이러한 속성을 사용할 것이다. 다음. 코드 프로그램을 어떻게 간격을 구하는 .(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)

베이지안

이 섹션에서는 대한 신뢰 구간을 계산하기위한 Metropolis-Hastings 샘플링 및 이전의 Jeffreys 사용을 기반으로하는 대체 알고리즘 이 제시됩니다.δ

리콜 종래 제프리스 대 로그 정규 모델 인(μ,σ)

π(μ,σ)σ2,

그리고이 사전은 매개 변수화에서 변하지 않는다. 이 사전은 부적절하지만 표본 크기 경우 매개 변수의 후방이 적합합니다 . 다음 코드는이 베이지안 모델을 사용하여 95 %의 신뢰 구간을 얻는 방법을 보여줍니다.2R

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éphane Laurent

@ StéphaneLaurent 정보 주셔서 감사합니다. 새로운 이전 코드로 코드의 결과를보고 싶습니다. 사용중인 명령과 패키지를 알지 못했습니다.

4
아름다운 응답 @ Procrastinator. 다른 접근법 중 하나는 스미어 링 추정기 (smearing Estimator)로, 로그 스케일의 평균에서 모든 잔차를 사용 하여 원래 스케일에서 예측 된 값 을 얻고 평균을 구합니다 . 표준 부트 스트랩 백분위 수 방법을 제외 하고는이 방법을 사용하는 신뢰 구간에 대해서는 최신 정보가 아닙니다.
Frank Harrell

탁월한 반응! 여기서 제안 된 접근 방식은 동형 일치 모델 오류를 가정합니다. 저는이 가정이 불가능한 프로젝트를 수행했습니다. 또한 대안으로 감마 회귀를 사용하는 것이 좋습니다. 편향 보정이 필요하지 않습니다.
Isabella Ghement

4

Jeffreys의 사전으로 베이지안 접근을 시도 할 수 있습니다. 올바른 잦은 일치 특성을 갖는 신뢰성 구간을 생성해야합니다. 신뢰성 구간의 신뢰 수준은 신뢰성 수준에 가깝습니다.

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

이것은 매우 흥미롭게 들리며 Bayesian 방법을 좋아하는 경향이 있으므로 그것을 찬성했습니다. 왜 작동하는지에 대한 몇 가지 참조 또는 바람직하게 이해할 수있는 설명을 추가하여 여전히 개선 될 수 있습니다.
Erik

μσ2μσ2μσ2에프(μ,σ2)μσ2. 참조가 있는지 모르지만 시뮬레이션을 통해 확인할 수 있습니다.
Stéphane Laurent

토론 해 주셔서 감사합니다. 나는 명확성을 위해 혼란을 피하기 위해 모든 의견을 삭제했습니다. (+1)

1
@ Procrastinator 감사합니다. 또한 내 의견을 삭제하고 코드에서 앞서 Jeffreys에 대한 요점을 추가했습니다.
Stéphane Laurent

누군가 boots.out = boot (data = data0, statistic = function (d, ind) {mle (d [ind])}, R = 10000) 작동 방식을 설명해 주시겠습니까? "ind"가 색인이지만 "ind"를 찾는 방법을 이해하지 못합니다. 이 두 번째 논쟁은 어디에 있는가? 대체 기능으로 시도했지만 작동하지 않았습니다. 실제 기능 부팅을 살펴보면 Ind에 대한 참조도 보이지 않습니다.
andor kesselman

0

그러나 나는이 방법이 약간 의심 스럽습니다. 단순히 자체 자체로는 작동하지 않기 때문입니다. 10mean (log10 (X)) ≠ mean (X)

당신이 맞습니다. 그것은 산술 평균이 아닌 기하 평균의 공식입니다. 산술 평균은 정규 분포의 모수이며 대수 정규 데이터에는 그다지 의미가 없습니다. 데이터의 중심 경향에 대해보다 의미있게 이야기하려는 경우 기하 평균은 로그 정규 분포의 해당 모수입니다.

그리고 실제로 데이터의 로그를 취하고 평소와 같이 평균과 CI를 계산하고 역변환하여 기하 평균에 대한 CI를 계산합니다. 산술 평균 주위에 기하 평균에 대한 CI를 배치하여 분포를 혼합하고 싶지 않다는 것이 옳습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.