J'utilise R Data Analysis Examples: Ordinal Logistic Regression comme guide pour faire une régression logistique ordinale (finalement en python en utilisant l'interface rpy2).fun = argument de la fonction de résumé dans R
Dans les étapes où ils testent l'hypothèse de cotes proportionnelles, ils créent un tableau des estimations prévues par la formule:
(s <- with(dat, summary(as.numeric(apply) ~ pared + public + gpa, fun=sf)))
Une chose que je remarque est que le comportement de l'argument fun =
était différent si fun
était casé supérieur. Pour voir pourquoi, j'ai regardé la source ici: summary.R source, mais seulement FUN =
a été trouvé. Selon le site UCLA (en lien ci-dessus): "Lorsque R voit un appel à résumé avec un argument de formule, il va calculer des statistiques descriptives pour la variable sur le côté gauche de la formule par des groupes sur le côté droit de la formule et retournera les résultats dans une belle table Par défaut, résumé calculera la moyenne de la variable de gauche ... Cependant, nous pouvons substituer le calcul de la moyenne en fournissant notre propre fonction, à savoir sf à l'argument fun=
. La dernière commande demande à R de retourner le contenu à l'objet s, qui est une table. " Je comprends ce que cela fait, mais je ne sais pas où l'argument fun =
est en termes de code source (FUN
semble être la valeur par défaut, donnant le côté gauche de la formule et ne tenant pas compte de la fonction sf). Où se trouve cette dérogation? Et est-ce réellement documenté quelque part? Si oui, où, puisque ce n'est pas évidemment dans la documentation d'aide. C'est la première fois que je regarde la source R, alors j'admets volontiers que je suis complètement désemparé.
La raison pour laquelle je suis en train de creuser dans ce que le comportement dans rpy2 ne correspond pas à ce que dans l'affaire R. En R, à la fois la production de produits fun =
et FUN =
, mais rpy2, ne FUN =
produit une sortie; fun =
émet une erreur que RRuntimeError: Error in as.character(substitute(fun)) : cannot coerce type 'closure' to vector of type 'character'
Ainsi, la nécessité de creuser dans la source pour comprendre pourquoi cela ne fonctionne pas comme prévu.
EDIT
Les lignes de python qui réussissent et échouent, sont respectivement (I créé un paquet dans R appelé gms.test, qui contient la fonction/fermeture sf):
from rpy2.robjects import pandas2ri
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
pandas2ri.activate()
gms = importr("gms.test")
hmisc = importr('Hmisc')
base = importr('base', robject_translations={'with': '_with'})
stats = importr('stats', robject_translations={'format_perc': '_format_perc'})
r_consult_case_control = pandas2ri.py2ri(consult_case_control)
formula = stats.as_formula('es_score ~ n + raingarden + consult_case')
formula.getenvironment()['es_score'] = r_consult_case_control.rx2('es_score')
formula.getenvironment()['n'] = r_consult_case_control.rx2('n')
formula.getenvironment()['raingarden'] = r_consult_case_control.rx2('raingarden')
formula.getenvironment()['consult_case'] = r_consult_case_control.rx2('consult_case')
# succeeds:
base._with(r_consult_case_control, ro.r.summary(formula, FUN=gms.sf))
# fails with given error:
base._with(consult_case_control, ro.r.summary(formula, fun=gms.sf))
S'il vous plaît Notez que le débogage de ce code n'est pas ce que j'avais l'intention de faire dans cette question. Je voulais juste voir ce que faisait l'override fun
dans R.
Veuillez publier à la fois les lignes * FUN * et * fun * Python qui réussissent et échouent. – Parfait
Fait en édition ci-dessus, bien que ce n'était pas l'intention de cette question (c'est pourquoi je ne l'ai pas inclus). Je voulais plonger dans le code R pour le "fun" override à la méthode 'summary'. Je comprends ce qui se passe, en ce que R essaie de forcer la fermeture de 'sf' dans une chaîne de caractères. Pourquoi/où il essaie de le faire est ce que je voudrais savoir. –
Hmmmm ... puisque je n'ai pas accès à votre colis. J'ai utilisé ''mean'' pour * FUN * et * fun * sans erreur en utilisant' ro.r.summary() 'et' base.summary() '. Donc, ne peut pas reproduire. Ca doit être quelque chose à propos de 'gm.sf'. Peut-être utilise-t-il un conflit de noms R ou Python. – Parfait