La seconda cosa sembra essere un'approssimazione del calcolo utilizzato per il x+y < 20
caso, ma basato sull'approssimazione Stirling .
Normalmente quando viene utilizzato per questo tipo di approssimazione, le persone usano almeno il termine aggiuntivo successivo (il fattore in approssimazione pern! ), che migliorerebbe sostanzialmente l'approssimazione relativa per i piccolin.2 πn---√n !n
Ad esempio, se ed y sono entrambi 10, il primo calcolo dà circa 0,088 mentre l'approssimazione quando il fattore di √Xy è incluso in tutti i termini è circa 0,089, abbastanza vicino per la maggior parte degli scopi ... ma omettendo quel termine nell'approssimazione si ottiene 0,5 - che in realtà non è abbastanza vicino! L'autore di quella funzione chiaramente non si è preoccupato di verificare l'accuratezza della sua approssimazione nel caso limite.2 πn---√
A tal fine, l'autore avrebbe probabilmente dovuto semplicemente chiamare la lgamma
funzione integrata, in particolare, usando questo invece di quello che ha per log_p1
:
log_p1 <- lgamma(x+y+1)-lgamma(x+1)-lgamma(y+1)-(x+y+1)*log(2)
che risulta nella risposta che sta cercando di approssimare (poiché in lgamma(x+1)
realtà restituisce il log( x ! ) , la stessa cosa che sta cercando di approssimare - scarsamente - tramite l'approssimazione Stirling).
Allo stesso modo, non sono sicuro del motivo per cui l'autore non utilizza la choose
funzione incorporata nella prima parte, una funzione che rientra nella distribuzione standard di R. In ogni caso, anche la relativa funzione di distribuzione è probabilmente incorporata.
lgamma
choose
choose(1000,500)
lgamma
Xy
Con ulteriori informazioni, dovrebbe essere possibile identificare l'origine del test. Suppongo che lo scrittore l'abbia preso da qualche parte, quindi dovrebbe essere possibile rintracciarlo. Hai qualche contesto per questo?
Quando dici "ottimizza" intendi renderlo più veloce, più breve, più gestibile o qualcos'altro?
Modifica dopo aver letto rapidamente sul foglio:
Gli autori sembrano sbagliati su diversi punti. L'esatto test di Fisher non presuppone che i margini siano fissi, ma semplicemente li condiziona , il che non è affatto la stessa cosa, come discusso, ad esempio, qui , con riferimenti. In effetti, sembrano praticamente del tutto ignari del dibattito sul condizionamento ai margini e sul perché venga fatto. Vale la pena leggere i collegamenti.
[Passano dal "test di Fisher è sempre più conservativo del nostro" all'affermazione che il test di Fisher è troppo conservativo ... il che non segue necessariamente a meno che non sia sbagliato condizionarlo . Dovrebbero affermarlo, ma dato che è qualcosa su cui gli statistici discutono da circa 80 anni, e questi autori sembrano inconsapevoli del perché il condizionamento è fatto, non penso che questi ragazzi siano arrivati al fondo di quel problema .]
Gli autori dell'articolo sembrano almeno capire che le probabilità che danno devono essere cumulate per fornire valori p; per esempio vicino al centro della prima colonna di pagina 5 (enfasi sulla mia):
La significatività statistica secondo l'esatto test di Fisher per tale risultato è del 4,6% (valore P a due code, cioè la probabilità che si verifichi una tabella di questo tipo nell'ipotesi che le frequenze EST dell'actina siano indipendenti dalle librerie di cDNA). In confronto, il valore P calcolato dalla forma cumulativa
(Equazione 9, vedi Metodi) dell'equazione 2 (ovvero, affinché la frequenza relativa degli EST attinici sia la stessa in entrambe le librerie, dato che almeno 11 EST cognati sono osservati in la biblioteca del fegato dopo che due sono state osservate nella biblioteca del cervello) è dell'1,6%.
(anche se non sono sicuro di essere d'accordo con il loro calcolo del valore lì; dovrei controllare attentamente per vedere cosa stanno effettivamente facendo con l'altra coda.)
Non penso che il programma lo faccia.
Xx + y
Non sono nemmeno convinto che la somma delle loro probabilità sia 1 a questo punto.
C'è molto altro da dire qui, ma la domanda non riguarda il documento, si tratta dell'implementazione nel programma.
-
Comunque, il risultato è che almeno il documento identifica correttamente che i valori p sono costituiti da una somma di probabilità come quelle dell'equazione 2, ma il programma no . (Vedi eqn 9a e 9b nella sezione Metodi del documento.)
Il codice è semplicemente sbagliato su questo.
[Potresti usare pbinom
, come implicherebbe il commento di @ whuber, per calcolare le probabilità individuali (ma non la coda, dal momento che non è un test binomiale mentre lo strutturano) ma poi c'è un fattore aggiuntivo di 1/2 nella loro equazione 2 quindi se si desidera replicare i risultati nel documento, è necessario modificarli.]
Puoi ottenerlo, con un po 'di armeggiamento, da pnbinom
-
Kt hKt h
( k+r-1K) ⋅(1-p)rpK,
p = N1/ ( N1+ N2)k = xr = y+ 1
y
Sarebbe male.
p2
affatto; il più piccolo dip1
ep2
corrisponde al più piccolo dix
ey
, rispettivamente - questa è un'inefficienza. Un possibile bug è che il secondo ramo del condizionale non riescep2
affatto a calcolare e usa solop1
. Ho anche il sospetto che il codice potrebbe essere del tutto errato, perché non sembra calcolare un valore p: è solo metà della probabilità binomiale e forse dovrebbe essere una probabilità di coda . Perché non usarepbinom
/dbinom
e finirlo?