2013-03-03 2 views
5

Y a-t-il une bibliothèque de bootstrap statistique dans Python?bibliothèque de bootstrap de statistiques en Python?

Je voudrais avoir une fonctionnalité similaire à ce qui est offert dans R bootstrap:

http://statistics.ats.ucla.edu/stat/r/library/bootstrap.htm

Recherche J'ai trouvé:

http://mjtokelly.blogspot.com/2006/04/bootstrap-statistics-in-python.html (le lien vers le code est cassé)

http://adorio-research.org/wordpress/?p=9048

https://github.com/cgevans/scikits-bootstrap

mais ceux-ci ne semblent pas offrir toutes les fonctionnalités (en particulier les poids de probabilité).

Des pointeurs?

cela a récemment ajouté à numpy.random

Merci

Répondre

4

Si vous êtes à la recherche d'une version python de la fonction d'échantillonnage de R, essayez ceci:

import collections 
import random 
import bisect 

def sample(xs, sample_size = None, replace=False, sample_probabilities = None): 
    """Mimics the functionality of http://statistics.ats.ucla.edu/stat/r/library/bootstrap.htm sample()""" 

    if not isinstance(xs, collections.Iterable): 
     xs = range(xs) 
    if not sample_size: 
     sample_size = len(xs)    

    if not sample_probabilities: 
     if replace: 
      return [random.choice(xs) for _ in range(sample_size)] 
     else: 
      return random.sample(xs, sample_size) 
    else: 
     if replace: 
      total, cdf = 0, [] 
      for x, p in zip(xs, sample_probabilities): 
       total += p 
       cdf.append(total) 

      return [ xs[ bisect.bisect(cdf, random.uniform(0, total)) ] 
        for _ in range(sample_size) ] 
     else:    
      assert len(sample_probabilities) == len(xs) 
      xps = list(zip(xs, sample_probabilities))   
      total = sum(sample_probabilities) 
      result = [] 
      for _ in range(sample_size): 
       # choose an item based on weights, and remove it from future iterations. 
       # this is slow (N^2), a tree structure for xps would be better (NlogN) 
       target = random.uniform(0, total) 
       current_total = 0     
       for index, (x,p) in enumerate(xps): 
        current_total += p 
        if current_total > target: 
         xps.pop(index) 
         result.append(x) 
         total -= p 
         break 
      return result 
+0

Merci jnnnnn J'ouvrais un problème avec les pandas pour voir s'ils seraient intéressés à ajouter cette fonction. https://github.com/pydata/pandas/issues/2963 – gliptak

Questions connexes