[RUBY] Test de la différence entre les valeurs moyennes des données de comptage selon la distribution de Poisson

introduction

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.

explication facile

$ 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}

la mise en oeuvre

Comment utiliser

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%.

point important

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}

Implémentation en 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))

Implémentation dans 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

Les références

[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 de la différence entre les valeurs moyennes des données de comptage selon la distribution de Poisson
Tester si les données observées suivent la distribution de Poisson (Test de l'adéquation de la distribution de Poisson par Python)
Tester l'adéquation de la distribution
Modélisation-estimation de Bayes de la différence entre les deux groupes-
Prise en compte de la différence entre la courbe ROC et la courbe PR
Étapes pour calculer la probabilité d'une distribution normale
Comment utiliser argparse et la différence entre optparse
La musique de fond est automatiquement sélectionnée en fonction du contenu de la conversation
Comment représenter la distribution de la composition bactérienne à partir des données d'analyse Qiime2 dans un diagramme de moustaches
Changer la valeur de paramètre de setting.py en fonction de l'environnement de développement
Comment tester les attributs ajoutés par add_request_method de pyramid
Comprendre la différence entre l'affectation cumulative aux variables et l'affectation cumulative aux objets
Différentes façons de calculer la similitude entre les données avec python
[Homologie] Comptez le nombre de trous dans les données avec Python
L'histoire de la copie de données de S3 vers TeamDrive de Google
Changer le volume de Pepper en fonction de l'environnement environnant (son)
J'ai envoyé les données de Raspberry Pi à GCP (gratuit)
Essayez d'extraire les caractéristiques des données de capteur avec CNN