Как рассчитать доверительный интервал для среднего значения логарифмически нормального набора данных?


19

Я слышал / видел в нескольких местах, что вы можете преобразовать набор данных в нечто, что нормально распределено, взяв логарифм каждой выборки, вычислить доверительный интервал для преобразованных данных и преобразовать доверительный интервал обратно, используя обратную операцию (например, поднимите 10 до степени нижней и верхней границ соответственно для ).журнал10

Однако я немного подозрительно отношусь к этому методу просто потому, что он не работает для самого среднего значения:10жадный(журнал10(Икс))жадный(Икс)

Как правильно это сделать? Если это не работает для самого среднего, как это может работать для доверительного интервала для среднего?


3
Ты совершенно прав. Этот подход обычно не работает и часто дает доверительные интервалы, которые не включают среднее значение по совокупности или даже среднее значение по выборке. Вот некоторые обсуждения этого вопроса: amstat.org/publications/jse/v13n1/olsson.html Это не ответ, так как я не изучил этот вопрос настолько, чтобы прокомментировать ссылку подробно.
Эрик

3
Эта проблема имеет классическое решение: projecteuclid.org/… . Некоторые другие решения, включая код, представлены по адресу epa.gov/oswer/riskassessment/pdf/ucl.pdf--, но читайте это с большой долей соли, потому что там описан хотя бы один метод («метод неравенства Чебышева») это просто неправильно.
whuber

Ответы:


11

Существует несколько способов вычисления доверительных интервалов для среднего логнормального распределения. Я собираюсь представить два метода: Bootstrap и вероятность профиля. Я также представлю обсуждение Джеффриса до.

начальная загрузка

Для MLE

В данном случае ОМП (μ,σ) для образца (x1,...,xn) являются

μ^=1nj=1nlog(xj);σ^2=1nj=1n(log(xj)μ^)2.

Затем ОМП среднее равно δ = ехр ( μ + σ 2 / 2 ) . По передискретизации можно получить образец самозагрузки из б и, используя это, мы можем вычислить несколько самозагрузки доверительных интервалов. Следующие коды показывают, как их получить.δ^=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 следующим образом (μ,σ)(δ,σ) , где δзнак равноехр(μ+σ2/2) , а затем рассчитать численно профиль вероятности δ .

рп(δ)знак равновирσL(δ,σ)вирδ,σL(δ,σ),

Эта функция принимает значения в (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)

байесовский

δ

(μ,σ)

π(μ,σ)ασ-2,

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

Это звучит очень интересно, и, поскольку мне нравятся байесовские методы, я проголосовал за это. Это все еще можно улучшить, добавив некоторые ссылки или, желательно, даже понятное объяснение того, почему это работает.
Эрик

Известно, что «оно» (свойство соответствия частоте) работает для и σ 2 . Для μμσ2μσ2μσ2е(μ,σ2)μσ2, Я не знаю, есть ли какие-либо ссылки, но в противном случае вы можете проверить с помощью моделирования.
Стефан Лоран

Большое спасибо за обсуждение. Я удалил все свои комментарии для ясности и чтобы избежать путаницы. (+1)

1
@Procrastinator Спасибо тоже. Я также удалил свои комментарии и добавил пункт о Джеффрисе ранее в моем коде.
Стефан Лоран

Может кто-нибудь объяснить мне, как работает boots.out = boot (data = data0, statistics = function (d, ind) {mle (d [ind])}, R = 10000). Я вижу, что «ind» является индексом, но я не понимаю, как найти «ind». Где этот второй аргумент ссылается? Я пробовал это с альтернативными функциями, и это не сработало. Глядя на фактическую загрузку функции, я также не вижу ссылки на Ind.
Андор Кессельман

0

Однако я немного подозрительно отношусь к этому методу просто потому, что он не работает для самого среднего значения: 10mean (log10 (X)) ≠ mean (X)

Вы правы - это формула для среднего геометрического, а не среднего арифметического. Среднее арифметическое является параметром нормального распределения и часто не очень значимо для логнормальных данных. Среднее геометрическое является соответствующим параметром из логнормального распределения, если вы хотите более осмысленно говорить о центральной тенденции для ваших данных.

И вы действительно рассчитали бы CI относительно среднего геометрического, взяв логарифмы данных, вычислив среднее значение и CI как обычно, и выполнив обратное преобразование. Вы правы в том, что вы действительно не хотите смешивать свои распределения, помещая CI для среднего геометрического значения вокруг среднего арифметического .... да!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.