2013-02-11 4 views
2

Je veux calculer le spearman rank correlation en utilisant python et l'implémentation de scipys la plus probable (scipy.stats.spearmanr).Corrélation de rang de Spearman en Python avec des liens

Les données à la main ressemble par exemple, de la manière suivante (dictionnaires):

{a:0.3, b:0.2, c:0.2} and {a:0.5, b:0.6, c:0.4} 

Pour maintenant passer sur le module de Spearman, je leur assigne les rangs, si je ne me trompe pas (décroissant):

[1,2,3] and [2,3,1] 

alors maintenant, je veux examiner les liens, donc je l'utiliser maintenant pour le premier vecteur:

[1,2,2] or [1,2.5,2.5] 

B Asiquement, tout ce concept est-il correct et comment gérer les liens pour de telles données basées sur un dictionnaire.

Comme le suggère @Jaime la fonction spearmanr fonctionne avec des valeurs, mais pourquoi est-ce comportement possible:

In [5]: spearmanr([0,1,2,3],[1,3,2,0]) 
Out[5]: (-0.39999999999999997, 0.59999999999999998) 

In [6]: spearmanr([10,7,6,5],[0.9,0.5,0.6,1.0]) 
Out[6]: (-0.39999999999999997, 0.59999999999999998) 

Merci!

+0

Vous devez inclure une brève explication et un lien vers ce que la « corrélation de Spearman » est. aussi, [qu'avez-vous essayé?] (http://www.whathaveyoutried.com) –

Répondre

6

scipy.stats.spearmanr se chargera de calculer les rangs pour vous, il vous suffit de donner les données dans l'ordre correct:

>>> scipy.stats.spearmanr([0.3, 0.2, 0.2], [0.5, 0.6, 0.4]) 
(0.0, 1.0) 

Si vous avez les données classées, vous pouvez appeler scipy.stats.pearsonr sur elle pour obtenir le même résultat. Et comme le montrent les exemples ci-dessous, l'une ou l'autre des façons que vous avez essayé fonctionnera, bien que je pense que [1, 2.5, 2.5] est plus commun. En outre, scipy utilise l'indexation de base zéro, de sorte que les rangs utilisés en interne sera plus comme [0, 1.5, 1.5]:

>>> scipy.stats.pearsonr([1, 2, 2], [2, 1, 3]) 
(0.0, 1.0) 
>>> scipy.stats.pearsonr([1, 2.5, 2.5], [2, 1, 3]) 
(0.0, 1.0) 
+0

Merci, je ne savais pas que cela fonctionne aussi avec les valeurs simples. Néanmoins, je suis curieux de savoir comment cela fonctionne en interne. Comment la méthode sait-elle que si je passe les rangs, ce ne sont pas des valeurs? Parce que, si je ne suis pas complètement confus pour le moment, les classements seraient différents. – fsociety

+0

@ph_singer Ce sont des fonctions différentes. 'spearmanr' va transformer tout ce que vous lui donnez en rangs, puis calculer un coefficient de corrélation de Pearson sur cela. 'pearsonr' d'autre part calcule le coefficient de corrélation de Pearson directement. – Jaime

+0

J'ai ajouté un exemple à ma question initiale, car je ne peux pas la poster ici dans ce commentaire. S'il vous plaît jeter un coup d'oeil. Merci! – fsociety

Questions connexes