2017-02-12 5 views
1

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.

+0

Veuillez publier à la fois les lignes * FUN * et * fun * Python qui réussissent et échouent. – Parfait

+0

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. –

+0

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

Répondre

0

Il est facile d'obtenir la source. Comme par how to view R source, j'ai couru getAnywhere(summary.formula) et a obtenu le bloc correspondant de code:

if (length(fun)) { 
    if (length(de <- deparse(fun)) == 2) { 
     de <- as.list(fun) 
     de <- as.character(de[[length(de)]]) 
     funlab <- if (de[1] == "apply") 
      de[length(de)] 
     else de[1] 
    } 
    else funlab <- as.character(substitute(fun)) 
} 

Ainsi, si la valeur par défaut fun n'est pas utilisé il essaie convertir en un vecteur de caractère, ce qui est la raison pour laquelle je continue à obtenir l'erreur WRT coercition de fermeture. Dans R, je peux recréer l'erreur, en faisant juste as.character(sf) ... (FUN, btw était un hareng rouge, puisque tout argument que nous n'avons pas le même comportement). Oy, ce n'est en effet pas amusant!

+0

Eh bien, je l'ai en quelque sorte fonctionnant, bien que ce soit une solution à demi-arsed. J'importe le cadre de données Pandas dans rmagic dans iPython et puis je suis capable d'obtenir la table de résultats du résumé en utilisant la commande magic. Je suppose que cela a un sens, car il peut très bien faire la conversion en caractère dans R. –

+0

Je vais accepter ceci comme réponse, puisque, même si je pouvais obtenir ce travail directement en python, je perdais le bon formatage de la table récapitulative que je reçois en R via la commande magic (j'ai exporté l'objet table en python et seigneur, c'est UGLY!). Il est temps de passer à autre chose ... –