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.
$ 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}
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.
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}
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))
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
[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