¿Cómo calculo un intervalo de confianza para la media de un conjunto de datos log-normal?

19

He escuchado / visto en varios lugares que puede transformar el conjunto de datos en algo que se distribuye normalmente tomando el logaritmo de cada muestra, calcular el intervalo de confianza para los datos transformados y transformar el intervalo de confianza utilizando la operación inversa (por ejemplo, elevar 10 a la potencia de los límites inferior y superior, respectivamente, para ).log10

Sin embargo, sospecho un poco de este método, simplemente porque no funciona para la media en sí:10mean(log10(X))mean(X)

¿Cuál es la forma correcta de hacer esto? Si no funciona para la media en sí, ¿cómo puede funcionar para el intervalo de confianza para la media?

Vegard
fuente
3
Estás en lo cierto. Este enfoque generalmente no funciona y a menudo produce intervalos de confianza que no incluyen la media de la población o incluso la media de la muestra. Aquí hay una discusión al respecto: amstat.org/publications/jse/v13n1/olsson.html Esto no es una respuesta, ya que no examiné el asunto lo suficiente como para comentar realmente el enlace en detalle.
Erik
3
Este problema tiene una solución clásica: projecteuclid.org/… . Algunas otras soluciones, incluido el código, se proporcionan en epa.gov/oswer/riskassessment/pdf/ucl.pdf, pero lea esto con un gran contenido de sal, porque al menos un método descrito allí (el "Método de desigualdad de Chebyshev") es simplemente incorrecto
whuber

Respuestas:

11

Hay varias formas de calcular los intervalos de confianza para la media de una distribución lognormal. Voy a presentar dos métodos: Bootstrap y perfil de probabilidad. También presentaré una discusión sobre los Jeffreys antes.

Oreja

Para el MLE

En este caso, el MLE de para una muestra son(μ,σ)(x1,...,xn)

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

Entonces, el MLE de la media es . Al volver a muestrear podemos obtener una muestra de bootstrap de y, utilizando esto, podemos calcular varios intervalos de confianza de bootstrap . Los siguientes códigos muestran cómo obtenerlos.δ^=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")

Para la media de la muestra

Ahora, considerando el estimador lugar del MLE. También podría considerarse otro tipo de estimadores.δ~=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")

Probabilidad de perfil

Para la definición de funciones de probabilidad y perfil de probabilidad, ver . Usando la propiedad de invariancia de la probabilidad, podemos reparameterise de la siguiente manera , donde y luego calcular numéricamente el probabilidad de perfil de .(μ,σ)(δ,σ)δ=exp(μ+σ2/2)δ

Rp(δ)=supσL(δ,σ)supδ,σL(δ,σ).

Esta función toma valores en ; un intervalo de nivel tiene una confianza aproximada de . Vamos a utilizar esta propiedad para construir un intervalo de confianza para . Los siguientes códigos muestran cómo obtener este intervalo .(0,1]0.147 95 % δ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)

Bayesian

En esta sección, se presenta un algoritmo alternativo, basado en el muestreo de Metropolis-Hastings y el uso de Jeffreys antes, para calcular un intervalo de credibilidad para .δ

Recuerde que el Jeffreys anterior para en un modelo lognormal es(μ,σ)

π(μ,σ)σ2,

y que este prior es invariable bajo reparameterisations. Este previo es incorrecto, pero el posterior de los parámetros es apropiado si el tamaño de la muestra . El siguiente código muestra cómo obtener un intervalo de credibilidad del 95% utilizando este modelo bayesiano.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))

Tenga en cuenta que son muy similares.

kjetil b halvorsen
fuente
1
(+1) Creo que también puede obtener intervalos de confianza basados ​​en la teoría de máxima verosimilitud con el paquete distrMod R
Stéphane Laurent el
@ StéphaneLaurent Gracias por la información. Me gustaría ver el resultado de su código con el nuevo previo. No estaba al tanto de los comandos y el paquete que está utilizando.
44
Hermosa respuesta @Procrastinator. Otro enfoque es el estimador de dispersión, que utiliza todos los residuos fuera de la media en la escala logarítmica para obtener valores pronosticados en la escala original y simplemente promediarlos. Sin embargo, estoy menos actualizado en los intervalos de confianza con este enfoque, excepto por el método de percentil de arranque estándar. n
Frank Harrell
Excelente respuesta! Los enfoques sugeridos aquí suponen errores del modelo homoscedastic: he trabajado en proyectos en los que este supuesto no era sostenible. También sugeriría el uso de la regresión gamma como alternativa, lo que evitaría la necesidad de una corrección de sesgo.
Isabella Ghement
4

Puede probar el enfoque bayesiano con el previo de Jeffreys. Debería producir intervalos de credibilidad con una propiedad correcta de coincidencia frecuente: el nivel de confianza del intervalo de credibilidad está cerca de su nivel de credibilidad.

 # 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))
Stéphane Laurent
fuente
Esto suena muy interesante y como me gustan los métodos bayesianos, lo voté. Todavía podría mejorarse agregando algunas referencias o preferiblemente incluso una explicación comprensible de por qué funciona.
Erik
Se sabe que "it" (la propiedad de correspondencia frecuente) funciona para y . Para la propiedad de coincidencia frecuenta es perfecta: el intervalo de credibilidad es exactamente el mismo que el intervalo de confianza habitual. Para No sé si es exacto, pero es fácil de verificar porque la distribución posterior es un gamma inverso. El hecho de que funcione para y no implica necesariamente que funcione para una función de y . No sé si hay algunas referencias, pero de lo contrario puede verificar con simulaciones. σ 2 μ σ 2 μ σ 2 f ( μ , σ 2 ) μ σ 2μσ2μσ2μσ2f(μ,σ2)μσ2
Stéphane Laurent
Muchas gracias por la discusión. Eliminé todos mis comentarios para mayor claridad y para evitar confusiones. (+1)
1
@Procrastinator Gracias también. También eliminé mis comentarios y agregué el punto sobre Jeffreys antes en mi código.
Stéphane Laurent
¿Podría alguien explicarme cómo boots.out = boot (data = data0, statistic = function (d, ind) {mle (d [ind])}, R = 10000) funciona. Veo que "ind" es un índice, pero no entiendo cómo encontrar "ind". ¿Dónde está haciendo referencia este segundo argumento? Lo probé con funciones alternativas y no funcionó. Mirando el arranque de la función real, tampoco veo una referencia a Ind.
andor kesselman
0

Sin embargo, sospecho un poco de este método, simplemente porque no funciona para la media en sí: 10mean (log10 (X)) ≠ mean (X)

Tienes razón: esa es la fórmula para la media geométrica, no la media aritmética. La media aritmética es un parámetro de la distribución normal y, a menudo, no es muy significativa para los datos lognormales. La media geométrica es el parámetro correspondiente de la distribución lognormal si desea hablar más significativamente sobre una tendencia central para sus datos.

Y de hecho, calcularía los IC sobre la media geométrica tomando los logaritmos de los datos, calculando la media y los IC como de costumbre, y transformando de regreso. Tienes razón en que realmente no quieres mezclar tus distribuciones colocando los CI para la media geométrica alrededor de la media aritmética ... ¡yeowch!

dnidz
fuente