INTRODUCTION : J'ai une liste de plus de 30 000 valeurs entières allant de 0 à 47, inclusivement, par exemple [0,0,0,0,..,1,1,1,1,...,2,2,2,2,...,47,47,47,...]
échantillonnées à partir d'une distribution continue. Les valeurs de la liste ne sont pas nécessairement dans l'ordre, mais l'ordre n'a pas d'importance pour ce problème.
PROBLÈME : Sur la base de ma distribution, je voudrais calculer la valeur p (la probabilité de voir des valeurs plus élevées) pour une valeur donnée. Par exemple, comme vous pouvez le voir, la valeur p pour 0 approcherait 1 et la valeur p pour les nombres plus élevés tendrait vers 0.
Je ne sais pas si j'ai raison, mais pour déterminer les probabilités, je pense que j'ai besoin d'adapter mes données à une distribution théorique qui est la plus appropriée pour décrire mes données. Je suppose qu'une sorte de test d'ajustement est nécessaire pour déterminer le meilleur modèle.
Existe-t-il un moyen d'implémenter une telle analyse en Python ( Scipy
ouNumpy
)? Pouvez-vous présenter des exemples?
Je vous remercie!
la source
Réponses:
Ajustement de distribution avec somme des erreurs carrées (SSE)
Il s'agit d'une mise à jour et d'une modification de la réponse de Saullo , qui utilise la liste complète des
scipy.stats
distributions actuelles et renvoie la distribution avec le moins SSE entre l'histogramme de la distribution et l'histogramme des données.Exemple de montage
En utilisant l' ensemble de données El Niño de
statsmodels
, les distributions sont ajustées et l'erreur est déterminée. La distribution avec le moins d'erreur est renvoyée.Toutes les distributions
Meilleure distribution d'ajustement
Exemple de code
la source
density=True
au lieu denormed=True
innp.histogram()
. ^^.plot()
méthodes pour éviter toute confusion future. ^^from scipy.stats._continuous_distns import _distn_names
. Vous pouvez ensuite utiliser quelque chose commegetattr(scipy.stats, distname)
pour chacundistname
dans _distn_names`. Utile car les distributions sont mises à jour avec différentes versions de SciPy.ax = data.plot(kind='hist', bins=50, normed=True, alpha=0.5, color=list(matplotlib.rcParams['axes.prop_cycle'])[1]['color'])
Il y a 82 fonctions de distribution implémentées dans SciPy 0.12.0 . Vous pouvez tester l'adaptation de certains d'entre eux à vos données à l'aide de leur
fit()
méthode . Consultez le code ci-dessous pour plus de détails:Références:
- Distributions d'ajustement, qualité d'ajustement, valeur p. Est-il possible de faire cela avec Scipy (Python)?
- Raccord de distribution avec Scipy
Et voici une liste avec les noms de toutes les fonctions de distribution disponibles dans Scipy 0.12.0 (VI):
la source
normed = True
en traçant l'histogramme? Vous ne multiplieriez paspdf_fitted
par lesize
, non?from scipy.stats._continuous_distns import _distn_names
. Vous pouvez ensuite utiliser quelque chose commegetattr(scipy.stats, distname)
pour chacundistname
dans _distn_names`. Utile car les distributions sont mises à jour avec différentes versions de SciPy.fit()
La méthode mentionnée par @Saullo Castro fournit des estimations du maximum de vraisemblance (MLE). La meilleure distribution pour vos données est celle qui vous donne la plus élevée peut être déterminée de plusieurs manières différentes: comme1, celui qui vous donne la probabilité log la plus élevée.
2, celui qui vous donne les plus petites valeurs AIC, BIC ou BICc (voir wiki: http://en.wikipedia.org/wiki/Akaike_information_criterion , peut essentiellement être considéré comme une vraisemblance logarithmique ajustée pour le nombre de paramètres, comme une distribution avec plus les paramètres devraient mieux s'adapter)
3, celui qui maximise la probabilité bayésienne postérieure. (voir wiki: http://en.wikipedia.org/wiki/Posterior_probability )
Bien sûr, si vous avez déjà une distribution qui devrait décrire vos données (sur la base des théories de votre domaine particulier) et que vous souhaitez vous en tenir à cela, vous sauterez l'étape d'identification de la distribution la mieux adaptée.
scipy
ne vient pas avec une fonction pour calculer la vraisemblance logarithmique (bien que la méthode MLE soit fournie), mais le code en dur est facile: voir Les fonctions de densité de probabilité intégrées de `scipy.stat.distributions` sont-elles plus lentes que celles fournies par l'utilisateur?la source
scipy
AFAICU, votre distribution est discrète (et rien que discrète). Par conséquent, le simple fait de compter les fréquences de différentes valeurs et de les normaliser devrait suffire à vos fins. Donc, un exemple pour démontrer ceci:
Ainsi, probabilité de voir des valeurs plus élevées que
1
simplement (selon la fonction de distribution cumulative complémentaire (ccdf) :Veuillez noter que ccdf est étroitement lié à la fonction de survie (sf) , mais il est également défini avec des distributions discrètes, alors que sf n'est défini que pour les distributions contiguës.
la source
Cela me semble être un problème d'estimation de densité de probabilité.
Regarde aussi http://jpktd.blogspot.com/2009/03/using-gaussian-kernel-density.html .
la source
Essayez la
distfit
bibliothèque.pip installer distfit
Notez que dans ce cas, tous les points seront significatifs en raison de la distribution uniforme. Vous pouvez filtrer avec dist.y_pred si nécessaire.
la source
Avec OpenTURNS , j'utiliserais les critères BIC pour sélectionner la meilleure distribution qui correspond à ces données. En effet, ce critère ne donne pas trop d'avantages aux distributions qui ont plus de paramètres. En effet, si une distribution a plus de paramètres, il est plus facile pour la distribution ajustée d'être plus proche des données. De plus, le Kolmogorov-Smirnov peut ne pas avoir de sens dans ce cas, car une petite erreur dans les valeurs mesurées aura un impact énorme sur la valeur p.
Pour illustrer le processus, je charge les données El-Nino, qui contiennent 732 mesures de température mensuelles de 1950 à 2010:
Il est facile d'obtenir les 30 usines de distribution univariées intégrées avec la
GetContinuousUniVariateFactories
méthode statique. Une fois cela fait, laBestModelBIC
méthode statique renvoie le meilleur modèle et le score BIC correspondant.qui imprime:
Afin de comparer graphiquement l'ajustement à l'histogramme, j'utilise les
drawPDF
méthodes de la meilleure distribution.Cela produit:
Plus de détails sur ce sujet sont présentés dans le document BestModelBIC . Il serait possible d'inclure la distribution Scipy dans SciPyDistribution ou même avec les distributions ChaosPy avec ChaosPyDistribution , mais je suppose que le script actuel remplit les objectifs les plus pratiques.
la source
Pardonnez-moi si je ne comprends pas votre besoin, mais qu'en est-il de stocker vos données dans un dictionnaire où les clés seraient les nombres entre 0 et 47 et valoriseraient le nombre d'occurrences de leurs clés associées dans votre liste d'origine?
Ainsi, votre probabilité p (x) sera la somme de toutes les valeurs des clés supérieures à x divisée par 30000.
la source