1
2 """
3 Module de calcules statistiques.
4
5 Le module `statistics` contient des fonctions permettant le calcule
6 des probabilités associées à la loi hypergéométrique et
7 hypergéométrique cumulée, ainsi d'une méthode de correction pour les
8 tests multiples.
9
10 """
11
12 from decimal import *
13
14 getcontext().prec = 28
15
16
18 """
19 Fonction interne permetant le calcule du terme 0 de la loi hypergéométrique.
20
21 Le calcule est réalisé selon la méthode décrite dans l'article
22
23 Trong Wu, An accurate computation of the hypergeometric distribution function,
24 ACM Trans. Math. Softw. 19 (1993), no. 1, 33–43.
25
26 Paramètres:
27
28 - `N` : La taille de la population
29 - `n` : Le nombre d'éléments marqués
30 - `r` : La taille de l'echantillon
31
32 Retourne un *float* indiquant la probabilité de récupérer 0 élément
33 marqué parmi *n* dans une population de taille *N* lors du tirage
34 d'un échantillon de taille *r*
35 """
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 numerateur = xrange(N - r + 1 - n, N - r + 1)
56 denominateur= xrange(N + 1 - n, N + 1)
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 p = reduce(lambda x,y:x*y,map(lambda i,j:Decimal(i)/Decimal(j),numerateur,denominateur))
73 return p
74
75
77 """
78 Calcule le terme *x* d'une loi hypergéométrique
79
80 Le calcule est réalisé selon la méthode décrite dans l'article
81
82 Trong Wu, An accurate computation of the hypergeometric distribution function,
83 ACM Trans. Math. Softw. 19 (1993), no. 1, 33–43.
84
85 Paramètres:
86
87 - `x` : Nombre d'éléments marqués attendu
88 - `N` : La taille de la population
89 - `n` : Le nombre d'éléments marqués
90 - `r` : La taille de l'echantillon
91
92 Retourne un *float* indiquant la probabilité de récupérer *x* éléments
93 marqués parmi *n* dans une population de taille *N* lors du tirage
94 d'un échantillon de taille *r*
95 """
96 if n < r:
97 s = n
98 n = r
99 r = s
100 assert x>=0 and x <= r,"x out of limits"
101 if x > 0 :
102 return hypergeometric(x-1,N,n,r) * (n - x + 1)/x * (r - x + 1)/(N-n-r+x)
103 else:
104 return _hyper0(N,n,r)
105
107 """
108 Calcule le terme *x* d'une loi hypergéométrique
109
110 Le calcule est réalisé selon la méthode décrite dans l'article
111
112 Trong Wu, An accurate computation of the hypergeometric distribution function,
113 ACM Trans. Math. Softw. 19 (1993), no. 1, 33–43.
114
115 Paramètres:
116
117 - `xmin` : Nombre d'éléments marqués minimum attendu
118 - `xmax` : Nombre d'éléments marqués maximum attendu
119 - `N` : La taille de la population
120 - `n` : Le nombre d'éléments marqués
121 - `r` : La taille de l'echantillon
122
123 Retourne un *float* indiquant la probabilité de récupérer entre
124 *xmin* et *xmax* éléments marqués parmi *n* dans une population
125 de taille *N* lors du tirage d'un échantillon de taille *r*
126 """
127 if n < r:
128 s = n
129 n = r
130 r = s
131 assert xmin>=0 and xmin <= r and xmax>=0 and xmax <= r and xmin <=xmax,"x out of limits"
132 hg = hypergeometric(xmin,N,n,r)
133 rep = hg
134 for x in xrange(xmin+1,xmax+1):
135 hg = hg * (n - x + 1)/x * (r - x + 1)/(N-n-r+x)
136 rep+=hg
137 return rep
138
140 """
141 Correction pour les tests multiples.
142
143 Séléctionne parmis un ensemble de test le plus grand sous ensemble
144 telque le risque global soit inférieur à une pvalue déterminée.
145
146 Paramètres:
147
148 - `globalPvalue` : Risque global à prendre pour l'ensemble des tests
149 - `testList` : un élément itérable sur un ensemble de tests.
150 Chaque test est une liste ou un tuple dont le dernier élément
151 est la pvalue associée au test
152
153 Retourne une liste contenant le sous ensemble des tests selectionnés dans
154 `testList`
155 """
156 testList=list(testList)
157 testList.sort(lambda x,y:cmp(x[-1],y[-1]))
158 h0=1.0-globalPvalue
159 p=1.0
160 rep = []
161 for t in testList:
162 p*=1.0-t[-1]
163 if p > h0:
164 rep.append(t)
165 return rep
166