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): ... 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: , 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.
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. –
Quel paquet est * summary *? Si base R, essayez la fonction qualificative et * fun * arg avec l'objet 'base' et non' ro.r'. – Parfait
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. –