2017-02-09 1 views
0

Je fais une régression logistique ordinale, et en suivant le guide ici pour l'analyse: R Data Analysis Examples: Ordinal Logistic RegressionComment utiliser R « avec » opérateur rpy2

Mon dataframe (consulter) ressemble à:

  n raingarden es_score consult_case 
garden_id          
27436  7   0   3    0 
27437  1   0   0    1 
27439  1   1   1    1 
37253  1   0   3    0 
37256  3   0   0    0 

Je suis à l'endroit où je dois créer graphique pour tester l'hypothèse de cotes proportionnelle, avec la commande en R comme suit:

(s <- with(dat, summary(es_score ~ n + raingarden + consult_case, fun=sf))) 

(es_score est un ordinal classé score valeur s entre 0 et 4; n est un nombre entier; et consult_case jardin de pluie, les valeurs binaires de 0 ou 1)

J'ai la fonction sf:

sf <- function(y) { 
    c('Y>=1' = qlogis(mean(y >= 1)), 
     'Y>=2' = qlogis(mean(y >= 2)), 
     'Y>=3' = qlogis(mean(y >= 3))) 
} 

dans un fichier utils.r que j'accéder comme suit:

from rpy2.robjects.packages import STAP 
with open('/file_path/utils.r', 'r') as f: 
    string = f.read() 
sf = STAP(string, "sf") 

et que vous voulez faire quelque chose le long des lignes de:

R = ro.r 
R.with(work_case_control, R.summary(formula, fun=sf)) 

le problème majeur est que l'opérateur R with est vu comme un mot-clé python, de sorte que même si j'accède avec ro.r.with il est toujours reconnu comme un mot-clé python. (Comme une note de côté: j'ai essayé d'utiliser la méthode de R apply à la place, mais on m'a donné une erreur qui TypeError: 'SignatureTranslatedAnonymousPackage' object is not callable ... Je suppose que cela fait référence à ma fonction sf?)

J'ai essayé également d'utiliser les méthodes d'attribution de R dans rpy2 comme suit :

R('sf = function(y) { c(\'Y>=1\' = qlogis(mean(y >= 1)), \'Y>=2\' = qlogis(mean(y >= 2)), \'Y>=3\' = qlogis(mean(y >= 3)))}') 

R('s <- with({0}, summary(es_score~raingarden + consult_case, fun=sf)'.format(consult)) 

mais a couru sur les questions où les noms de colonnes de dataframe ont été à l'origine en quelque sorte l'erreur: RRuntimeError: Error in (function (file = "", n = NULL, text = NULL, prompt = "?", keep.source = getOption("keep.source"), : <text>:1:19: unexpected symbol 1: s <- with( n raingarden

je pouvais bien sûr faire tout cela en R, mais j'ai un script ETL très impliqué dans python, et préférerait donc tout garder en python en utilisant rpy2 (j'ai essayé s utilise mord pour scipy - apprends à gérer ma régression, mais c'est plutôt primitif).

Toutes les suggestions seraient les bienvenues en ce moment.

EDIT

J'ai essayé différentes combinaisons @ suggestions de passion, et de qualifier l'argument fun est syntaxiquement incorrect, comme par interprète PyCharm (voir l'image mise en surbrillance rouge à la fin): with qualified fun keyword ... il ne quel que soit le qualificatif est, que ce soit, je reçois toujours une erreur qui SyntaxError: keyword can't be an expression.

d'autre part, sans qualification, il n'y a pas d'erreur de syntaxe: unqualified fun keyword, mais je reçois l'erreur TypeError: 'SignatureTranslatedAnonymousPackage' object is not callable lorsque vous utilisez la fonction sf comme obtenu:

from rpy2.robjects.packages import STAP with open('/Users/gregsilverman/development/python/rest_api/rest_api/scripts/utils.r', 'r') as f: string = f.read() sf = STAP(string, "sf")

Dans cet esprit, je créé un paquet en R avec la fonction sf, importés, et essayé diverses combinaisons avec la seule production d'aucune erreur, à savoir: print(base._with(consult_case_control, R.summary(formula, fun=gms.sf))) (gms est une référence au paquet dans RI fait).

La sortie fait si aucun sens:

Length Class Mode 3 formula call

J'attends une table ala celui sur le site UCLA. Intéressant. Je vais essayer de recréer mon analyse en R, juste pour le plaisir. Je voudrais quand même le compléter en python.

Répondre

2

Tenir compte bracketing l'appel with et assurez-vous de qualifier tous les arguments, y compris plaisir:

ro.r['with'](work_case_control, ro.r.summary(formula, ro.r.summary.fun=sf)) 

Sinon, paquet de base de R d'importation. Et pour éviter tout conflit avec la méthode nommée Python with() traduire le nom de R:

from rpy2.robjects.packages import importr 

base = importr('base', robject_translations={'with': '_with'}) 

base._with(work_case_control, ro.r.summary(formula, ro.r.summary.fun=sf)) 

Et assurez-vous de créer correctement votre formule. Envisagez d'utiliser les packages de statistiques de R 'as.formula pour construire à partir d'une chaîne. Notez également qu'une autre traduction est effectuée en raison d'un conflit de nommage:

stats = importr('stats', robject_translations={'format_perc': '_format_perc'}) 

formula = stats.as_formula('es_score ~ n + raingarden + consult_case') 
+0

Merci pour ces conseils. Je pensais qu'il devait y avoir un moyen d'utiliser un mot-clé comme celui-ci, bien que j'aime mieux les autres solutions. J'ai essayé ceci, et j'obtiens une erreur sur l'argument 'fun' qualifié:' SyntaxError: le mot-clé ne peut pas être une expression. ' Cela peut prendre un peu d'expérimentation, donc je vais jouer avec ça. –

+0

Quel paquet est * summary *? Si base R, essayez la fonction qualificative et * fun * arg avec l'objet 'base' et non' ro.r'. – Parfait

+0

Je ne pense pas que 'fun' ait besoin d'un qualificatif. Dans PyCharm, un qualificateur ANY jette une erreur de syntaxe rouge en surbrillance, alors qu'aucun qualificateur ne colore la syntaxe 'fun' syntaxiquement correcte en violet (j'attacherais des images ici, mais je ne peux pas ajouter de commentaires). Donc, je crois que la déclaration devrait ressembler à: 'base._with (work_case_control, R.summary (formule, fun = sf))' ... et je crois que l'erreur que je reçois maintenant: 'NotImplementedError: Conversion ' py2ri 'n'est pas défini pour les objets de type' ''fait référence à mon implémentation de la fonction' sf' dans R. –