Wie berechne ich ein Konfidenzintervall für den Mittelwert eines Protokollnormaldatensatzes?


19

Ich habe an mehreren Stellen gehört / gesehen, dass Sie den Datensatz in etwas normalverteiltes transformieren können, indem Sie den Logarithmus jeder Stichprobe nehmen, das Konfidenzintervall für die transformierten Daten berechnen und das Konfidenzintervall mit der inversen Operation zurücktransformieren (Erhöhen Sie z. B. 10 um die Potenz der unteren bzw. oberen Schranke für Log10 ).

Ich bin jedoch ein bisschen misstrauisch gegenüber dieser Methode, einfach weil sie für den Mittelwert selbst nicht funktioniert: 10bedeuten(Log10(X))bedeuten(X)

Was ist der richtige Weg, um dies zu tun? Wenn es für den Mittelwert selbst nicht funktioniert, wie kann es möglicherweise für das Konfidenzintervall für den Mittelwert funktionieren?


3
Du liegst ziemlich richtig. Dieser Ansatz funktioniert im Allgemeinen nicht und liefert häufig Konfidenzintervalle, die weder den Populationsmittelwert noch den Stichprobenmittelwert enthalten. Hier ist eine Diskussion darüber: amstat.org/publications/jse/v13n1/olsson.html Dies ist keine Antwort, da ich mich nicht genug mit der Angelegenheit befasst habe, um den Link tatsächlich im Detail zu kommentieren.
Erik

3
Dieses Problem hat eine klassische Lösung: projecteuclid.org/… . Einige andere Lösungen, einschließlich Code, werden unter epa.gov/oswer/riskassessment/pdf/ucl.pdf bereitgestellt. Lesen Sie dies jedoch mit einem schweren Salzkorn, da mindestens eine der dort beschriebenen Methoden (die "Chebyshev Inequality Method"). ist einfach falsch.
Whuber

Antworten:


11

Es gibt verschiedene Möglichkeiten, Konfidenzintervalle für den Mittelwert einer logarithmischen Normalverteilung zu berechnen. Ich werde zwei Methoden vorstellen: Bootstrap und Profile Likelihood. Ich werde auch eine Diskussion über Jeffreys vorlegen.

Bootstrap

Für die MLE

In diesem Fall wird der MLE von (μ,σ) für eine Probe (x1,...,xn) ist ,

μ^=1nj=1nLog(xj);σ^2=1nj=1n(Log(xj)-μ^)2.

Dann wird der MLE des Mittelwert δ = exp ( μ + σ 2 / 2 ) . Durch Resampling wir erhalten können Bootstrap - Probe von δ und diese verwenden, können wir berechnen mehr Bootstrap - Konfidenzintervall. Die folgenden Codes zeigen, wie Sie diese erhalten.δ^=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")

Für den Stichprobenmittelwert

Betrachtet man nun den Schätzer δ~=x¯ anstelle des MLE. Andere Arten von Schätzern könnten ebenfalls in Betracht gezogen werden.

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

Profil Wahrscheinlichkeit

Zur Definition von Wahrscheinlichkeits- und Profilwahrscheinlichkeitsfunktionen siehe . Unter Verwendung der Invarianz - Eigenschaft der Wahrscheinlichkeit , können wir wie folgt reparameterise (μ,σ)(δ,σ) , wobei δ=exp(μ+σ2/2) , und dann berechnen numerisch das Profil Wahrscheinlichkeit von δ .

Rp(δ)=supσL(δ,σ)supδ,σ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)

In diesem Abschnitt wird ein alternativer Algorithmus zur Berechnung eines Glaubwürdigkeitsintervalls für , der auf Metropolis-Hastings-Stichproben und der Verwendung des Jeffreys-Prior basiertδ vorgestellt basiert.

(μ,σ)

π(μ,σ)σ-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))

Beachten Sie, dass sie sehr ähnlich sind.


1
(+1) Ich denke, Sie können auch Konfidenzintervalle basierend auf der Maximum-Likelihood-Theorie mit dem distrMod R-Paket erhalten
Stéphane Laurent

@ StéphaneLaurent Danke für die Info. Ich würde gerne das Ergebnis Ihres Codes mit dem neuen Prior sehen. Die Befehle und das von Ihnen verwendete Paket waren mir nicht bekannt.

4
n

Hervorragende Resonanz! Die hier vorgeschlagenen Ansätze gehen von homoskedastischen Modellfehlern aus - ich habe an Projekten gearbeitet, in denen diese Annahme nicht haltbar war. Ich würde auch die Verwendung von Gamma-Regression als Alternative vorschlagen, wodurch die Notwendigkeit einer Bias-Korrektur umgangen würde.
Isabella Ghement

4

Sie könnten den Bayes'schen Ansatz mit Jeffreys 'Vorgänger versuchen. Es sollte Glaubwürdigkeitsintervalle mit einer korrekten Eigenschaft zur Häufigkeitsanpassung liefern: Das Konfidenzniveau des Glaubwürdigkeitsintervalls liegt nahe an seinem Glaubwürdigkeitsniveau.

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

Das hört sich sehr interessant an und da ich Bayesianische Methoden mag, habe ich sie hochgestuft. Es könnte noch verbessert werden, indem einige Verweise oder vorzugsweise sogar eine verständliche Erklärung hinzugefügt werden, warum es funktioniert.
Erik

μσ2μσ2μσ2f(μ,σ2)μσ2. Ich weiß nicht, ob es Referenzen gibt, aber sonst können Sie mit Simulationen überprüfen.
Stéphane Laurent

Vielen Dank für das Gespräch. Ich habe alle meine Kommentare gelöscht, um Klarheit und Verwirrung zu vermeiden. (+1)

1
@Procrastinator Danke auch. Ich habe auch meine Kommentare gelöscht und den Punkt über die Jeffreys vor meinem Code hinzugefügt.
Stéphane Laurent

Könnte mir bitte jemand erklären, wie boots.out = boot (data = data0, statistic = function (d, ind) {mle (d [ind])}, R = 10000) funktioniert. Ich sehe, dass "ind" ein Index ist, aber ich verstehe nicht, wie man "ind" findet. Wo verweist dieses zweite Argument? Ich habe es mit alternativen Funktionen versucht und es hat nicht funktioniert. Wenn ich mir die eigentliche Funktion boot anschaue, sehe ich auch keinen Hinweis auf Ind.
Andor Kesselman

0

Ich bin jedoch ein bisschen misstrauisch gegenüber dieser Methode, einfach weil sie für den Mittelwert selbst nicht funktioniert: 10mean (log10 (X)) ≠ mean (X)

Sie haben recht - das ist die Formel für den geometrischen Mittelwert, nicht für den arithmetischen Mittelwert. Das arithmetische Mittel ist ein Parameter aus der Normalverteilung und für logarithmische Normaldaten oft wenig aussagekräftig. Der geometrische Mittelwert ist der entsprechende Parameter aus der Lognormalverteilung, wenn Sie eine zentrale Tendenz für Ihre Daten deutlicher ausdrücken möchten.

Und Sie würden in der Tat die CIs über den geometrischen Mittelwert berechnen, indem Sie die Logarithmen der Daten nehmen, den Mittelwert und die CIs wie gewohnt berechnen und rücktransformieren. Sie haben Recht, dass Sie Ihre Verteilungen nicht wirklich mischen möchten, indem Sie die CIs für den geometrischen Mittelwert um den arithmetischen Mittelwert legen ... ja!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.