Betrachten Sie eine Betaverteilung für eine bestimmte Gruppe von Ratings in [0,1]. Nachdem Sie den Mittelwert berechnet haben:
Gibt es eine Möglichkeit, ein Konfidenzintervall um diesen Mittelwert herum bereitzustellen?
Betrachten Sie eine Betaverteilung für eine bestimmte Gruppe von Ratings in [0,1]. Nachdem Sie den Mittelwert berechnet haben:
Gibt es eine Möglichkeit, ein Konfidenzintervall um diesen Mittelwert herum bereitzustellen?
Antworten:
Während es spezielle Methoden zur Berechnung von Konfidenzintervallen für die Parameter in einer Beta-Verteilung gibt, beschreibe ich einige allgemeine Methoden, die für (fast) alle Arten von Verteilungen verwendet werden können , einschließlich der Betaverteilung, verwendet werden können und in R leicht implementiert werden können .
Beginnen wir mit der Maximum-Likelihood-Schätzung mit entsprechenden Profil-Likelihood-Konfidenzintervallen. Zunächst benötigen wir einige Beispieldaten:
# Sample size
n = 10
# Parameters of the beta distribution
alpha = 10
beta = 1.4
# Simulate some data
set.seed(1)
x = rbeta(n, alpha, beta)
# Note that the distribution is not symmetrical
curve(dbeta(x,alpha,beta))
Das reale / theoretische Mittel ist
> alpha/(alpha+beta)
0.877193
Nun müssen wir eine Funktion zur Berechnung der negativen Log-Likelihood-Funktion für eine Stichprobe aus der Beta-Verteilung erstellen, wobei der Mittelwert einer der Parameter ist. Wir können die dbeta()
Funktion verwenden, aber da dies keine Parametrisierung mit dem Mittelwert verwendet, müssen wir seine Parameter ( α und β ) als Funktion des Mittelwerts und einiger anderer Parameter (wie der Standardabweichung) ausdrücken :
# Negative log likelihood for the beta distribution
nloglikbeta = function(mu, sig) {
alpha = mu^2*(1-mu)/sig^2-mu
beta = alpha*(1/mu-1)
-sum(dbeta(x, alpha, beta, log=TRUE))
}
Um die maximale Wahrscheinlichkeitsschätzung zu finden, können wir die mle()
Funktion in der stats4
Bibliothek verwenden:
library(stats4)
est = mle(nloglikbeta, start=list(mu=mean(x), sig=sd(x)))
Ignorieren Sie einfach die Warnungen. Sie werden durch die Optimierungsalgorithmen verursacht, die ungültige Werte für die Parameter versuchen und negative Werte für α liefern und / oder β . (Um die Warnung zu vermeiden, können Sie ein lower
Argument hinzufügen und die verwendete Optimierung ändern method
.)
Jetzt haben wir sowohl Schätzungen als auch Konfidenzintervalle für unsere beiden Parameter:
> est
Call:
mle(minuslogl = nloglikbeta, start = list(mu = mean(x), sig = sd(x)))
Coefficients:
mu sig
0.87304148 0.07129112
> confint(est)
Profiling...
2.5 % 97.5 %
mu 0.81336555 0.9120350
sig 0.04679421 0.1276783
Beachten Sie, dass die Konfidenzintervalle erwartungsgemäß nicht symmetrisch sind:
par(mfrow=c(1,2))
plot(profile(est)) # Profile likelihood plot
(Die zweiten äußeren magentafarbenen Linien zeigen das 95% -Konfidenzintervall.)
Beachten Sie auch, dass wir bereits mit 10 Beobachtungen sehr gute Schätzungen erhalten (ein enges Konfidenzintervall).
Alternativ dazu mle()
können Sie die fitdistr()
Funktion aus derMASS
Paket verwenden. Auch dies berechnet den Maximum Likelihood Estimator und hat den Vorteil, dass Sie nur die Dichte und nicht die negative Log Likelihood angeben müssen, aber keine Profil-Likelihood-Konfidenzintervalle, sondern nur asymptotische (symmetrische) Konfidenzintervalle.
Eine bessere Option ist mle2()
(und verwandte Funktionen) aus dem bbmle
Paket, das etwas flexibler und leistungsfähiger ist als mle()
und etwas schönere Plots liefert.
Eine andere Möglichkeit ist die Verwendung des Bootstraps. Es ist extrem einfach in R zu verwenden und Sie müssen nicht einmal eine Dichtefunktion bereitstellen:
> library(simpleboot)
> x.boot = one.boot(x, mean, R=10^4)
> hist(x.boot) # Looks good
> boot.ci(x.boot, type="bca") # Confidence interval
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 10000 bootstrap replicates
CALL :
boot.ci(boot.out = x.boot, type = "bca")
Intervals :
Level BCa
95% ( 0.8246, 0.9132 )
Calculations and Intervals on Original Scale
Der Bootstrap hat den zusätzlichen Vorteil, dass er auch dann funktioniert, wenn Ihre Daten nicht aus einer Beta-Distribution stammen.
Vergessen wir für Konfidenzintervalle im Mittel nicht die guten alten asymptotischen Konfidenzintervalle, die auf dem zentralen Grenzwertsatz (und der t- Verteilung) basieren . Solange wir entweder eine große Stichprobengröße haben (so gilt die CLT und die Verteilung des Stichprobenmittelwerts ist ungefähr normal) oder große Werte von α und β (so dass die Beta-Verteilung selbst ungefähr normal ist), funktioniert es gut. Hier haben wir keine, aber das Konfidenzintervall ist immer noch nicht so schlecht:
> t.test(x)$conf.int
[1] 0.8190565 0.9268349
Für nur geringfügig größere Werte von n (und nicht zu extreme Werte der beiden Parameter) funktioniert das asymptotische Konfidenzintervall außerordentlich gut.
Testen Sie die Beta-Regression. Eine gute Einführung in die Vorgehensweise mit R finden Sie hier:
http://cran.r-project.org/web/packages/betareg/vignettes/betareg.pdf
Eine andere (sehr einfache) Möglichkeit, ein Konfidenzintervall zu erstellen, wäre die Verwendung eines nicht parametrischen Boostrap-Ansatzes. Wikipedia hat gute Infos:
http://en.wikipedia.org/wiki/Bootstrapping_%28statistics%29
Auch schönes Video hier: