[PYTHON] Test der Differenz zwischen den Durchschnittswerten der Zähldaten gemäß der Poisson-Verteilung

Einführung

In meiner Arbeit musste ich die Differenz zwischen den Durchschnittswerten der Zähldaten gemäß der Poisson-Verteilung testen, aber ich hatte die Informationen nicht auf Japanisch und implementierte sie unter Bezugnahme auf das folgende Papier, so dass ich sie als Memorandum belassen werde.

[A more powerful test for comparing two Poisson means] (http://www.sciencedirect.com/science/article/pii/S0378375802004081)

Es wurde gesagt, dass es zwei Testmethoden gibt, den bedingten Test (C-Test) und den Test unter Verwendung des in diesem Artikel vorgeschlagenen P-Werts (E-Test), diesmal jedoch die Erkennungsleistung Implementierte den höheren E-Test.

einfache Erklärung

$ n1, n2 $: Anzahl der verstrichenen Einheitszeiten $ k1, k2 $: Gesamtzahl der Ereignisse während des gesamten Zeitraums $ d $: Unterschied zwischen den Durchschnittswerten, die Sie testen möchten

Wann

Nullhypothese $ H_0: \ lambda_1 = \ lambda_2 + d $ Oppositionshypothese $ H_1: \ lambda_1 \ neq \ lambda_2 + d $

Der P-Wert bei der Durchführung des Hypothesentests von wird nach der folgenden Formel berechnet.


\begin{align}
& \hat{\lambda}_{2k} = \frac{k_1 + k_2}{n_1 + n_2} - \frac{d n_1}{n_1 + n_2}\\[2mm]

& p = \sum_{x_1=0}^{k_1} \sum_{x_2=0}^{k_2}
\frac{e^{-n_1(\hat{\lambda}_{2k}+d)}(n_1(\hat{\lambda}_{2k} + d))^{x_1}}{x_1!}
\frac{e^{-n_2\hat{\lambda}_{2k}}(n_2(\hat{\lambda}_{2k}))^{x_2}}{x_2!}
\end{align}

Implementierung

Wie benutzt man

Unten finden Sie eine Implementierung des obigen Ausdrucks in Python und Ruby. Wenn die Anzahl der zu vergleichenden Zählungen beispielsweise 40 bzw. 65 beträgt und Sie wissen möchten, ob zwischen den beiden Durchschnittswerten ein signifikanter Unterschied besteht,

pois_mean_diff_test(40, 65)
=> 0.04921332025427114

Dann können Sie den P-Wert berechnen. Dieses Mal können wir sehen, dass der P-Wert unter 0,05 liegt, so dass wir sehen können, dass es einen signifikanten Unterschied bei 5% gibt.

wichtiger Punkt

Wenn die Formel so implementiert wird, wie sie ist, läuft sie in der Gleitkommaberechnung über, sodass die Multiplikationsberechnung wie folgt zerlegt und implementiert wurde.

\frac{e^{-n_1(\hat{\lambda}_{2k}+d)}(n_1(\hat{\lambda}_{2k} + d))^{x_1}}{x_1!}
= e^{-n_1(\hat{\lambda}_{2k}+d)} \times
\frac{n_1(\hat{\lambda}_{2k} + d)}{x_1} \times \frac{n_1(\hat{\lambda}_{2k} + d)}{x_1 -1} \times \dots \times \frac{n_1(\hat{\lambda}_{2k} + d)}{1}

Implementierung in Python

Python


import math
import numpy as np

def pois_mean_diff_test(k1, k2, n1=1, n2=1, d=0.0):

    x1_seq = range(0, k1 + 1)
    x2_seq = range(0, k2 + 1)
    l2k = (k1+k2)/(n1+n2) - d*n1/(n1+n2)

    p_value = sum([math.exp(-n1*(l2k+d)) * np.prod([n1*(l2k+d)/i for i in range(1, x1+1)]) * \
                   math.exp(-n2*l2k) * np.prod([n2*l2k/j for j in range(1, x2+1)]) \
                   for x2 in x2_seq for x1 in x1_seq])

    return p_value

if __name__ == '__main__':
    print "P-value is " + str(pois_mean_diff_test(40, 65))

Implementierung in Ruby

Ruby


def pois_mean_diff_test(k1, k2, n1=1, n2=1, d=0.0, alpha=0.05)

  x1_seq = Array(0..k1)
  x2_seq = Array(0..k2)

  l2k = (k1+k2)/(n1+n2) - d*n1/(n1+n2)

  p_value = x1_seq.product(x2_seq).map{|x| x1=x[0]; x2=x[1];
    Math.exp(-n1*(l2k+d)) * Array(1..x1).map{|i| n1*(l2k+d)/i }.inject(:*).to_f *
    Math.exp(-n1*l2k) * Array(1..x2).map{|j| n2*l2k/j }.inject(:*).to_f
  }.inject(:+)

  return p_value
end

out = "P-value is " + pois_mean_diff_test(20,10).to_s
puts out

Verweise

[K. Krishnamoorthy, Jessica Thomson, A more powerful test for comparing two Poisson means, Journal of Statistical Planning and Inference, Volume 119, Issue 1, 15 January 2004, Pages 23-35] (http://www.sciencedirect.com/science/article/pii/S0378375802004081)

Recommended Posts

Test der Differenz zwischen den Durchschnittswerten der Zähldaten gemäß der Poisson-Verteilung
Testen Sie, ob die beobachteten Daten der Poisson-Verteilung folgen (Test der Eignung der Poisson-Verteilung durch Python)
Testen Sie die Eignung der Verteilung
Bayes Modellierung-Schätzung des Unterschieds zwischen den beiden Gruppen-
Berücksichtigung des Unterschieds zwischen ROC-Kurve und PR-Kurve
Schritte zur Berechnung der Wahrscheinlichkeit einer Normalverteilung
Wie man Argparse benutzt und den Unterschied zwischen Optparse
BGM wird automatisch entsprechend dem Inhalt der Konversation ausgewählt
Darstellung der Verteilung der Bakterienzusammensetzung aus Qiime2-Analysedaten in einem Box-Whisker-Diagramm
Ändern Sie den Einstellungswert von settings.py entsprechend der Entwicklungsumgebung
So testen Sie die Attribute, die durch add_request_method of pyramid hinzugefügt wurden
Verstehen Sie den Unterschied zwischen der kumulativen Zuordnung zu Variablen und der kumulativen Zuordnung zu Objekten
Verschiedene Methoden zur Berechnung der Ähnlichkeit zwischen Daten mit Python
[Homologie] Zählen Sie mit Python die Anzahl der Löcher in den Daten
Die Geschichte des Kopierens von Daten von S3 auf Googles TeamDrive
Ändern Sie die Lautstärke von Pepper entsprechend der Umgebung (Ton).
Ich habe die Daten von Raspberry Pi an GCP gesendet (kostenlos)
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren