2016-04-27 2 views
0

Je souhaite utiliser la fonctionnalité Fisher's exact test functionality (spécifiquement, la fonctionnalité de simulation MC) de R avec une interface vers Python. J'essaie de le faire en utilisant rpy2, mais c'est plus difficile que je ne le pensais.Envoi de données de Python à R pour effectuer un test statistique en utilisant rpy2

je peux obtenir une interface à la méthode de test de Fisher en utilisant le code suivant:

import rpy2.robjects as robjects 
fisher = robjects.r['fisher.test'] 

Cependant, comment puis-je passer une matrice 2xN à la fonction et de récupérer la valeur de p?

Répondre

0

Voici une façon de le faire:

paquet
import rpy2.robjects as robjects 
from rpy2.robjects import r 
from rpy2.robjects.numpy2ri import numpy2ri 
from rpy2.robjects.packages import importr 
import numpy as np 

cont = np.reshape(np.arange(0,4), (2,2)) 
print cont 

r_cont = numpy2ri(cont) 
r.assign("cont", r_cont) 
r("res <- fisher.test(cont, simulate.p.value = TRUE, B = 100)") 
r_result = r("res") 
p_value = r_result[0][0] 
print r_result 
print p_value 
1

Tenir compte des statistiques de l'importation R et exécutez le test de Fisher en fonction Python. Notez que l'objet result est <class 'rpy2.robjects.vectors.ListVector'> et doit donc être converti en un dictionnaire Python comme indiqué ci-dessous.

import rpy2 
from rpy2.robjects.numpy2ri import numpy2ri 
from rpy2.robjects.packages import importr 
import numpy as np 

cont = np.reshape(np.arange(0,4), (2,2)) 

statspackage = importr('stats', robject_translations={'format_perc': '_format_perc'})  
result = statspackage.fisher_test(numpy2ri(cont), simulate_p_value = True, B = 100) 

# DEPRECATED CONVERSION 
import pandas.rpy.common as com 
pyresultdict = com.convert_robj(result) 

for k, v in pyresultdict.items(): 
    print(k, v) 

# data.name ['structure(c(0L, 2L, 1L, 3L), .Dim = c(2L, 2L))'] 
# p.value [1.0] 
# estimate odds ratio 0.0 
# dtype: float64 
# null.value odds ratio 1.0 
# dtype: float64 
# conf.int [0.0, 77.90626902008512] 
# alternative ['two.sided'] 
# method ["Fisher's Exact Test for Count Data"] 

Une autre note, vous pouvez recevoir un avertissement au sujet de la dévalorisation de com.convert_to_r_dataframe et com.convert_robj(rdf) qui devrait être remplacé par pandas2ri.pandas2ri() et pandas2ri comme suggéré here. Toutefois, la conversion de mon côté ne fonctionne pas pour l'objet ListVector. Idéalement, la conversion ci-dessus serait remplacée par ci-dessous:

# CURRENT CONVERSION 
from rpy2.robjects import pandas2ri 
pandas2ri.activate() 
pyresultdict = pandas2ri.ri2py(result) 

for k, v in pyresultdict.items(): 
    print(k, v) 
+0

Merci, ressemble à une approche moins hacky. Y a-t-il un avantage direct de cette approche? – pir

+0

Vous travaillez dans le modèle objet Python et évitez de transmettre des lignes de script R pour chaque tâche. – Parfait

+0

@Parfait J'ai l'importation du paquet R fonctionnant avec simplement 'statspackage = importr ('stats')' (en utilisant R-3.3.0-beta) – lgautier