Wie berechnet man die inverse kumulative Beta-Verteilungsfunktion in Java?

Ich suche eine Java-Bibliothek / -Implementierung, die die Berechnung der inversen kumulativen Verteilungsfunktion für die Beta-Verteilung (auch als Schätzung von Quantilen bezeichnet) unterstützt.mit angemessener Präzision.

Natürlich habe ich es versuchtapache commons math, aber in Version 3 scheint es noch welche zu gebenProbleme mit der Präzision. Nachfolgend wird das Problem, das zu dieser Frage führt, ausführlich beschrieben.

Angenommen, ich möchte das glaubwürdige Intervall einer Betaverteilung mit vielen Versuchen berechnen. Imapache commons math ...

final int trials = 161750;
final int successes = 10007;
final double alpha = 0.05d;

// the supplied precision is the default precision according to the source code
BetaDistribution betaDist = new BetaDistribution(successes + 1, trials - successes + 1, 1e-9);

System.out.println("2.5 percentile :" + betaDist.inverseCumulativeProbability(alpha / 2d));
System.out.println("mean: " + betaDist.getNumericalMean());
System.out.println("median: " + betaDist.inverseCumulativeProbability(0.5));
System.out.println("97.5 percentile :" + betaDist.inverseCumulativeProbability(1 - alpha / 2d));

was liefert

2.5 percentile :0.062030402074808505
mean: 0.06187249616697166
median: 0.062030258659508855
97.5 percentile :0.06305170793994147

Das Problem ist, dass das 2,5-Perzentil und der Median gleich sind und beide größer als der Mittelwert sind.

Im Vergleich dazu ist dieR-Paketbinom liefert

binom.confint(10007+1,161750+2,methods=c("agresti-coull","exact","wilson"))
         method     x      n      mean      lower      upper
1 agresti-coull 10008 161752 0.0618725 0.06070873 0.06305707
2         exact 10008 161752 0.0618725 0.06070317 0.06305756
3        wilson 10008 161752 0.0618725 0.06070877 0.06305703

und dasR-PaketStatistiken

qbeta(c(0.025,0.975),10007+1,161750-10007+1)
[1] 0.06070355 0.06305171

Um die Ergebnisse von R abzusondern, hier ist wasWolfram Alpha erzählte mir

InverseBetaRegularized [0.025.10007 + 1.161750-10007 + 1] => 0.06070354631 ...InverseBetaRegularized [0.975,10007 + 1,161750-10007 + 1] => 0.06305170794 ...

Abschließende Anmerkung zu den Anforderungen:

Ich muss viele dieser Berechnungen durchführen. Daher sollte jede Lösung nicht länger als 1s dauern (was immer noch viel ist im Vergleich zu den 41ms von (wenn auch falschen) Apache Commons Math).Mir ist bewusst, dass man R in Java verwenden kann. Aus Gründen, auf die ich hier nicht näher eingehen möchte, ist dies die letzte Option, wenn etwas anderes (reines Java) fehlschlägt.

Update 21.08.12

Es scheint dass das Problem in 3.1-SNAPSHOT von Apache-Commons-Math behoben oder zumindest verbessert wurde. Für den oben genannten Verwendungszweck

2.5 percentile :0.06070354581340706
mean: 0.06187249616697166
median: 0.06187069085946604
97.5 percentile :0.06305170793994147

Update 23.02.13

Obwohl diese Frage und ihre Antworten auf den ersten Blick zu lokal sind, zeigt sie meiner Meinung nach sehr gut, dass einige numerische Probleme nicht (effizient) mit einem What-first-come-to-mind-Hacker-Ansatz gelöst werden können. Also ich hoffe es bleibt offen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage