J'ai dû tester la différence entre les valeurs moyennes des données de comptage en fonction de la distribution de Poisson dans mon travail, mais je n'avais pas les informations en japonais et je les ai implémentées en référence à l'article suivant, je vais donc le laisser en mémoire.
[A more powerful test for comparing two Poisson means] (http://www.sciencedirect.com/science/article/pii/S0378375802004081)
Il a été dit qu'il existe deux méthodes de test, le test conditionnel (test C) et le test utilisant la valeur P proposée dans cet article (test E), mais cette fois la puissance de détection Implémentation du test E supérieur.
$ n1, n2 $: Nombre de temps unitaires écoulés $ k1, k2 $: nombre total d'occurrences d'événements pour toute la période $ d $: Différence entre les moyennes que vous souhaitez tester
Quand
Hypothèse nulle $ H_0: \ lambda_1 = \ lambda_2 + d $ Hypothèse d'opposition $ H_1: \ lambda_1 \ neq \ lambda_2 + d $
La valeur P lors de l'exécution du test d'hypothèse de est calculée par la formule suivante.
\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}
Vous trouverez ci-dessous une implémentation de l'expression ci-dessus en Python et Ruby. Par exemple, si les nombres que vous souhaitez comparer sont respectivement de 40 et 65 et que vous voulez savoir s'il existe une différence significative entre les deux moyennes,
pois_mean_diff_test(40, 65)
=> 0.04921332025427114
Ensuite, vous pouvez calculer la valeur P. Cette fois, nous pouvons voir que la valeur P est inférieure à 0,05, donc nous pouvons voir qu'il y a une différence significative au niveau de 5%.
Si la formule est implémentée telle quelle, elle débordera dans le calcul en virgule flottante, donc le calcul de multiplication a été décomposé et implémenté comme suit.
\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