Comment calculer un intervalle de confiance pour la moyenne d'un ensemble de données log-normal?


19

J'ai entendu / vu à plusieurs endroits que vous pouvez transformer l'ensemble de données en quelque chose qui est distribué normalement en prenant le logarithme de chaque échantillon, calculer l'intervalle de confiance pour les données transformées et retransformer l'intervalle de confiance en utilisant l'opération inverse (par exemple, augmenter 10 à la puissance des bornes inférieure et supérieure, respectivement, pour ).log10

Cependant, je me méfie un peu de cette méthode, simplement parce qu'elle ne fonctionne pas pour la moyenne elle-même:10mean(log10(X))mean(X)

Quelle est la bonne façon de procéder? Si cela ne fonctionne pas pour la moyenne elle-même, comment peut-il fonctionner pour l'intervalle de confiance de la moyenne?


3
Vous avez parfaitement raison. Cette approche ne fonctionne généralement pas et donne souvent des intervalles de confiance qui n'incluent pas la moyenne de la population ni même la moyenne de l'échantillon. Voici une discussion à ce sujet: amstat.org/publications/jse/v13n1/olsson.html Ce n'est pas une réponse, car je n'ai pas suffisamment étudié la question pour commenter le lien en détail.
Erik

3
Ce problème a une solution classique: projecteuclid.org/… . D'autres solutions, y compris du code, sont fournies sur epa.gov/oswer/riskassessment/pdf/ucl.pdf - mais lisez-les avec un gros grain de sel, car au moins une méthode y est décrite (la "méthode des inégalités de Chebyshev") est tout simplement faux.
whuber

Réponses:


11

Il existe plusieurs façons de calculer les intervalles de confiance pour la moyenne d'une distribution lognormale. Je vais présenter deux méthodes: Bootstrap et Profile lik vraisemblance. Je présenterai également une discussion sur le Jeffreys avant.

Amorcer

Pour le MLE

Dans ce cas, les MLE de pour un échantillon sont(μ,σ)(x1,...,xn)

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

Ensuite, le MLE de la moyenne est . En rééchantillonnant, nous pouvons obtenir un échantillon bootstrap de et, en utilisant cela, nous pouvons calculer plusieurs intervalles de confiance bootstrap . Les codes suivants montrent comment les obtenir.δ^=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")

Pour la moyenne de l'échantillon

Maintenant, considérant l'estimateur au lieu du MLE. D'autres types d'estimateurs pourraient également être envisagés.δ~=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")

Probabilité de profil

Pour la définition des fonctions de vraisemblance et de vraisemblance de profil, voir . En utilisant la propriété d'invariance de la probabilité, nous pouvons reparamétrer comme suit , où , puis calculer numériquement le probabilité de profil de .(μ,σ)(δ,σ)δ=exp(μ+σ2/2)δ

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

Cette fonction prend des valeurs dans ; un intervalle de niveau a une confiance approximative de . Nous allons utiliser cette propriété pour construire un intervalle de confiance pour . Les codes suivants montrent comment obtenir cet intervalle .(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)

bayésienne

Dans cette section, un algorithme alternatif, basé sur l'échantillonnage de Metropolis-Hastings et l'utilisation de l'a priori de Jeffreys, pour calculer un intervalle de crédibilité pour est présenté.δ

Rappelons que l'a priori de Jeffreys pour dans un modèle lognormal est(μ,σ)

π(μ,σ)σ2,

et que ce prieur est invariant dans les reparameterisations. Cet a priori est incorrect, mais la partie postérieure des paramètres est correcte si la taille de l'échantillon . Le code suivant montre comment obtenir un intervalle de crédibilité de 95% à l'aide de ce modèle bayésien.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))

Notez qu'ils sont très similaires.


1
(+1) Je pense que vous pouvez également obtenir des intervalles de confiance basés sur la théorie du maximum de vraisemblance avec le package distrMod R
Stéphane Laurent

@ StéphaneLaurent Merci pour l'info. Je voudrais voir le résultat de votre code avec le nouveau prieur. Je n'étais pas au courant des commandes et du package que vous utilisez.

4
Belle réponse @Procrastinator. Une autre approche est l'estimateur à barbotage, qui utilise tous les résidus hors de la moyenne sur l'échelle logarithmique pour obtenir valeurs prédites sur l'échelle d'origine et les moyenne simplement. Cependant, je suis moins à jour sur les intervalles de confiance en utilisant cette approche, sauf pour l'utilisation de la méthode de centile de bootstrap standard. n
Frank Harrell

Superbe réponse! Les approches suggérées ici supposent des erreurs de modèle homoscédastique - j'ai travaillé sur des projets où cette hypothèse n'était pas tenable. Je suggérerais également l'utilisation de la régression gamma comme alternative, qui contournerait le besoin d'une correction de biais.
Isabella Ghement

4

Vous pourriez essayer l'approche bayésienne avec le prieur de Jeffreys. Il devrait donner des intervalles de crédibilité avec une propriété d'appariement fréquentiste correcte: le niveau de confiance de l'intervalle de crédibilité est proche de son niveau de crédibilité.

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

Cela semble très intéressant et comme j'ai tendance à aimer les méthodes bayésiennes, j'ai voté pour. Il pourrait encore être amélioré en ajoutant quelques références ou de préférence même une explication compréhensible sur pourquoi cela fonctionne.
Erik

On sait que "it" (la propriété de correspondance fréquentielle) fonctionne pour et . Pour la propriété d'appariement fréquentiste est parfaite: l'intervalle de crédibilité est exactement le même que l'intervalle de confiance habituel. Pour je ne sais pas si c'est exact mais c'est facile à vérifier car la distribution postérieure est un Gamma inverse. Le fait qu'il fonctionne pour et n'implique pas nécessairement qu'il fonctionne pour une fonction de et . Je ne sais pas s'il y a des références mais sinon vous pouvez vérifier avec des simulations. σ 2 μ σ 2 μ σ 2 f ( μ , σ 2 ) μ σ 2μσ2μσ2μσ2f(μ,σ2)μσ2
Stéphane Laurent

Merci beaucoup pour la discussion. J'ai supprimé tous mes commentaires pour plus de clarté et pour éviter toute confusion. (+1)

1
@Procrastinator Merci aussi. J'ai également supprimé mes commentaires et ajouté le point sur le Jeffreys avant dans mon code.
Stéphane Laurent

Quelqu'un pourrait-il m'expliquer comment fonctionne boots.out = boot (data = data0, statistic = function (d, ind) {mle (d [ind])}, R = 10000). Je vois que "ind" est un index, mais je ne comprends pas comment trouver "ind". Où ce deuxième argument fait-il référence? Je l'ai essayé avec des fonctions alternatives et cela n'a pas fonctionné. En regardant le démarrage de la fonction réelle, je ne vois pas non plus de référence à Ind.
Andor Kesselman

0

Cependant, je suis un peu méfiant de cette méthode, simplement parce qu'elle ne fonctionne pas pour la moyenne elle-même: 10mean (log10 (X)) ≠ mean (X)

Vous avez raison - c'est la formule de la moyenne géométrique, pas la moyenne arithmétique. La moyenne arithmétique est un paramètre de la distribution normale et n'est souvent pas très significative pour les données lognormales. La moyenne géométrique est le paramètre correspondant de la distribution log-normale si vous voulez parler de manière plus significative d'une tendance centrale pour vos données.

Et vous calculeriez en effet les IC sur la moyenne géométrique en prenant les logarithmes des données, en calculant la moyenne et les IC comme d'habitude, et en retransformant. Vous avez raison de ne pas vraiment vouloir mélanger vos distributions en plaçant les IC de la moyenne géométrique autour de la moyenne arithmétique .... yeowch!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.