Unbekannte p-Wert-Berechnung

9

Ich habe kürzlich ein R-Skript debuggt und fand etwas sehr Seltsames. Der Autor hat seine eigene p-Wert-Funktion definiert

pval <- function(x, y){
    if (x+y<20) { # x + y is small, requires R.basic
        p1<- nChooseK(x+y,x) * 2^-(x+y+1);
        p2<- nChooseK(x+y,y) * 2^-(x+y+1);
        pvalue = max(p1, p2)
    }
    else { # if x+y is large, use approximation
        log_p1 <- (x+y)*log(x+y) - x*log(x) - y*log(y) - (x+y+1)*log(2);
        pvalue<-exp(log_p1);
    }
    return(pvalue)
}

Wobei X und Y positive Werte größer als 0 sind. Der Fall <20 scheint eine Berechnung für eine Art hypergeometrische Verteilung zu sein (ähnlich dem Fisher-Test?) Und weiß jemand, was die andere Berechnung ist? Als Nebenbemerkung versuche ich, diesen Code zu optimieren, um die richtige R-Funktion zu finden, mit der dieser aufgerufen und ersetzt werden kann.

Bearbeiten: Die Papierdetailformel für die p-Wert-Berechnung finden Sie hier (klicken Sie auf pdf, um die Formeln anzuzeigen). Die Methoden beginnen auf Seite 8 des PDF, und die betreffende Formel finden Sie auf Seite 9 unter (1). Die Verteilung, die sie annehmen, ist ein Poisson.

yingw
quelle

Antworten:

15

Das zweite sieht so aus, als wäre es eine Annäherung an die Berechnung, die für den x+y < 20Fall verwendet wird, aber basierend auf der Stirling-Näherung .

Normalerweise würden Menschen, wenn es für diese Art der Approximation verwendet wird, mindestens den nächsten zusätzlichen Term verwenden (den Faktor in der Approximation für ), Was die relative Approximation für kleines erheblich verbessern würde . n!2πnn!n

Wenn zum Beispiel und beide 10 sind, ergibt die erste Berechnung ungefähr 0,088, während die Annäherung, wenn der Faktor in allen Begriffen enthalten ist, ungefähr 0,089 ist, was für die meisten Zwecke nahe genug ist ... aber wenn man diesen Term in der Näherung weglässt, ergibt sich 0,5 - was wirklich nicht nah genug ist! Der Autor dieser Funktion hat sich offensichtlich nicht die Mühe gemacht, die Genauigkeit seiner Annäherung im Grenzfall zu überprüfen.xy2πn

Zu diesem Zweck hätte der Autor wahrscheinlich einfach die eingebaute lgammaFunktion aufrufen sollen - insbesondere, indem er diese anstelle dessen verwendet, wofür er hat log_p1:

log_p1 <- lgamma(x+y+1)-lgamma(x+1)-lgamma(y+1)-(x+y+1)*log(2)

was zu der Antwort führt, die er zu approximieren versucht (da lgamma(x+1)tatsächlich , genau das, was er versucht - schlecht - über die Stirling-Approximation zu approximieren).Log(x!)

Ebenso bin ich mir nicht sicher, warum der Autor die eingebaute chooseFunktion im ersten Teil nicht verwendet, eine Funktion, die in der Standardverteilung von R enthalten ist. In diesem Fall ist wahrscheinlich auch die relevante Verteilungsfunktion eingebaut.

Sie brauchen nicht wirklich zwei getrennte Fälle; Der lgammaeine funktioniert einwandfrei bis auf die kleinsten Werte. Auf der anderen Seite choosefunktioniert die Funktion für ziemlich große Werte (z. B. choose(1000,500)funktioniert sie einwandfrei). Die sicherere Option ist wahrscheinlich lgamma, obwohl Sie ziemlich große und haben müssten, bevor es ein Problem war.xy

Mit mehr Informationen sollte es möglich sein, die Quelle des Tests zu identifizieren. Ich vermute, der Autor hat es von irgendwoher genommen, also sollte es möglich sein, es aufzuspüren. Haben Sie einen Kontext dafür?

Wenn Sie "Optimieren" sagen, meinen Sie damit, es schneller, kürzer, wartbarer oder etwas anderes zu machen?


Bearbeiten Sie nach schnellem Lesen des Papiers:

Die Autoren scheinen in einigen Punkten falsch zu liegen. Der genaue Test von Fisher geht nicht davon aus, dass die Ränder fest sind, sondern stellt lediglich Bedingungen an sie, was überhaupt nicht dasselbe ist, wie zum Beispiel hier mit Referenzen besprochen . In der Tat scheinen sie die Debatte über die Konditionierung von Margen und warum dies getan wird, so gut wie nicht zu kennen. Die Links dort sind lesenswert.

[Sie gehen von "Fischers Test ist immer konservativer als unser" zu der Behauptung über, dass Fischers Test zu konservativ ist ... was nicht unbedingt folgt, es sei denn, es ist falsch zu konditionieren . Sie müssten das feststellen, aber angesichts der Tatsache, dass Statistiker seit etwa 80 Jahren darüber streiten und diese Autoren nicht zu wissen scheinen, warum Konditionierung durchgeführt wird, glaube ich nicht, dass diese Leute diesem Problem auf den Grund gegangen sind .]

Die Autoren des Papiers scheinen zumindest zu verstehen, dass die von ihnen angegebenen Wahrscheinlichkeiten kumuliert werden müssen, um p-Werte zu erhalten. Zum Beispiel in der Mitte der ersten Spalte von Seite 5 (Hervorhebung von mir):

Die statistische Signifikanz gemäß dem exakten Fisher-Test für ein solches Ergebnis beträgt 4,6% (zweiseitiger P-Wert, dh die Wahrscheinlichkeit, dass eine solche Tabelle in der Hypothese auftritt, dass die Aktin-EST-Frequenzen unabhängig von den cDNA-Bibliotheken sind). Im Vergleich dazu ist der aus der kumulativen Form (Gleichung 9, siehe Methoden) von Gleichung 2 berechnete P-Wert (dh, dass die relative Häufigkeit von Aktin-ESTs in beiden Bibliotheken gleich ist, vorausgesetzt, dass in mindestens 11 verwandte ESTs beobachtet werden Die Leberbibliothek, nachdem zwei in der Gehirnbibliothek beobachtet wurden, beträgt 1,6%.

(obwohl ich nicht sicher bin, ob ich mit der Berechnung des Werts dort einverstanden bin; ich müsste sorgfältig prüfen, was sie tatsächlich mit dem anderen Schwanz machen.)

Ich glaube nicht, dass das Programm das tut.

Beachten Sie jedoch, dass ihre Analyse kein Standard-Binomialtest ist. Sie verwenden ein Bayes'sches Argument, um einen p-Wert in einem ansonsten häufig auftretenden Test abzuleiten. Sie scheinen auch - meiner Meinung nach etwas seltsam - eher auf als auf . Das bedeutet, dass sie eher ein negatives Binom als ein Binom haben müssen, aber ich finde das Papier wirklich schlecht organisiert und schrecklich schlecht erklärt (und ich bin es gewohnt, herauszufinden, was in Statistikpapieren vor sich geht), also bin ich es Ich werde nicht sicher sein, wenn ich nicht sorgfältig durchgehe.xx+y

Ich bin nicht einmal davon überzeugt, dass die Summe ihrer Wahrscheinlichkeiten zu diesem Zeitpunkt 1 ist.

Hier gibt es noch viel mehr zu sagen, aber die Frage bezieht sich nicht auf das Papier, sondern auf die Implementierung im Programm.

- -

Das Ergebnis ist jedenfalls, dass zumindest das Papier korrekt identifiziert, dass p-Werte aus einer Summe von Wahrscheinlichkeiten wie denen in Gleichung 2 bestehen, das Programm jedoch nicht . (Siehe Gleichung 9a und 9b im Abschnitt Methoden des Papiers.)

Der Code ist einfach falsch.

[Sie könnten verwenden pbinom, wie @ whubers Kommentar implizieren würde, um die einzelnen Wahrscheinlichkeiten zu berechnen (aber nicht den Schwanz, da es sich nicht um einen Binomialtest handelt, da sie ihn strukturieren), aber dann gibt es in ihrer Gleichung 2 einen zusätzlichen Faktor von 1/2 Wenn Sie die Ergebnisse im Papier replizieren möchten, müssen Sie sie ändern.]

Sie können es mit einigem Fummeln erhalten von pnbinom-

Die üblichen Formen des negativen Binomials sind entweder die Anzahl der Versuche zum Erfolg von oder die Anzahl der Fehler zum Erfolg von . Die beiden sind gleichwertig; Wikipedia gibt das zweite Formular hier . Die Wahrscheinlichkeitsfunktion ist: k t hkthkth

(k+r- -1k)(1- -p)rpk,

Die Gleichung 2 auf p4 (und damit auch Gleichung 1 auf p3) ist ein negatives Binom, aber um 1 verschoben . Sei , und .p=N.1/.(N.1+N.2)k=xr=y+1

Dies macht mir Sorgen, dass, da die Grenzen für nicht ähnlich verschoben wurden, ihre Wahrscheinlichkeiten möglicherweise nicht einmal zu 1 addieren.y

Das wäre schlecht

Glen_b - Monica neu starten
quelle
1
+1 Schöne Erklärung. Es gibt einige zusätzliche Probleme mit diesem Code. Es ist überhaupt nicht erforderlich zu berechnen p2; die kleinere p1und p2entspricht die kleineren xund yjeweils - das eine Ineffizienz ist. Ein möglicher Fehler besteht darin, dass der zweite Zweig der Bedingung überhaupt nicht berechnet werden kann p2und nur verwendet wird p1. Ich bin auch verdächtig , dass der Code könnte völlig falsch sein, weil es nicht einen p-Wert zu berechnen , scheint: es ist nur eine Hälfte eine binomische Wahrscheinlichkeit und vielleicht sollte eine seinen Schwanz Wahrscheinlichkeit. Warum nicht einfach pbinom/ verwenden dbinomund damit fertig sein?
whuber
Vielen Dank für die großartige Antwort. Ich konnte die Quelle der Formel ausfindig machen : Genom.cshlp.org/content/7/10/986.short Ich wollte sie so ändern, dass sie schneller und einfacher zu warten / zu lesen ist.
Yingw
Danke für das Papier; Es war hilfreich, um herauszufinden, was im Code vor sich ging. Was für ein Shemozzle.
Glen_b -State Monica
1
+1. Dies ist ein Beitrag, der kein Community-Wiki sein sollte! Ich denke, es liegt an den 14 Umdrehungen, aber in diesem Fall sind sie alle von Ihnen. Ihr Fleiß wurde bestraft!
Darren Cook
Vielen Dank für das Vertrauensvotum. Ja, ich bin immer wieder zurückgekommen und habe Verbesserungen vorgenommen, als ich das Papier gelesen habe, aber ich denke, es ist teilweise meine eigene Schuld, dass ich das Endergebnis nicht effizienter erzielt habe.
Glen_b -State Monica