Package obitools :: Package statistics :: Module hypergeometric
[hide private]
[frames] | no frames]

Source Code for Module obitools.statistics.hypergeometric

  1  # -*- coding: utf-8 -*- 
  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   
17 -def _hyper0(N,n,r):
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 # au numerateur nous avons : 39 # [N -r + 1 -n;N - n + 1[ 40 # 41 # au denominateur : 42 # [N - r + 1; N + 1] 43 # 44 # avec X = N - r + 1 45 # et Y = N + 1 46 # 47 # Numerateur -> [ X - n; Y - n [ 48 # Denominateur -> [ X ; Y [ 49 # 50 # On peut donc siplifier 51 # 52 # Numerateur -> [X - n; X [ 53 # Denominateur -> [Y - n; Y [ 54 55 numerateur = xrange(N - r + 1 - n, N - r + 1) 56 denominateur= xrange(N + 1 - n, N + 1) 57 # 58 # version original 59 # 60 # m = N - n 61 # numerateur = set(range(m-r+1,m+1)) 62 # denominateur = set(range(N-r+1,N+1)) 63 # simplification = numerateur & denominateur 64 # numerateur -= simplification 65 # denominateur -= simplification 66 # numerateur = list(numerateur) 67 # denominateur=list(denominateur) 68 # numerateur.sort() 69 # denominateur.sort() 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
76 -def hypergeometric(x,N,n,r):
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
106 -def chypergeometric(xmin,xmax,N,n,r):
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
139 -def multipleTest(globalPvalue,testList):
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