【发布时间】:2017-06-30 05:56:15
【问题描述】:
我使用R Data Analysis Examples: Ordinal Logistic Regression 作为指导进行序数逻辑回归(最终在 python 中使用 rpy2 接口)。
在他们测试比例赔率假设的步骤中,他们使用以下公式创建了一个预测估计值表:
(s <- with(dat, summary(as.numeric(apply) ~ pared + public + gpa, fun=sf)))
我注意到的一件事是,如果 fun 是大写的,fun = 参数的行为会有所不同。为了了解原因,我查看了这里的源代码:summary.R source,但只找到了FUN =。
根据 UCLA 网站(在上面的链接中):“当 R 看到使用公式参数调用摘要时,它将按公式右侧的组计算公式左侧的变量的描述性统计信息公式并将结果返回到一个漂亮的表格中。默认情况下,summary 将计算左侧变量的平均值......但是,我们可以通过提供我们自己的函数来覆盖平均值的计算,即 sf 到 fun= 参数. 最后的命令要求 R 将内容返回给对象 s,它是一个表。”
我明白这是在做什么,但我不确定参数fun = 在源代码中的位置(FUN 似乎是默认值,给出公式的左侧并忽略函数 sf )。此覆盖位于何处?这实际上记录在某个地方吗?如果是这样,在哪里,因为它显然不在帮助文档中。这是我第一次查看 R 源代码,所以我会坦率地承认我一无所知。
我之所以深入研究,是因为 rpy2 中的行为与 R 中的行为不一致。在 R 中,fun = 和 FUN = 都产生输出,但在 rpy2 中,只有 FUN = 产生输出; fun = 抛出 RRuntimeError: Error in as.character(substitute(fun)) :
cannot coerce type 'closure' to vector of type 'character' 的错误
因此,需要深入了解源代码以弄清楚为什么它没有按预期工作。
编辑
成功和失败的python行分别是(我在R中创建了一个名为gms.test的包,其中包含函数/闭包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))
请注意,调试此代码不是我在此问题中的意图。我只是想看看 R 中的 fun 覆盖在做什么。
【问题讨论】:
-
请同时发布成功和失败的 FUN 和 fun Python 行。
-
在上面的编辑中完成,尽管这不是这个问题的意图(这就是我没有包括它的原因)。我想深入研究
fun覆盖到summary方法的 R 代码。我了解正在发生的事情,因为 R 试图将闭包sf强制转换为字符串。为什么/在哪里尝试这样做是我想知道的。 -
嗯...因为我无权访问您的包裹。我将
'mean'用于FUN 和fun,使用ro.r.summary()和base.summary()没有错误。所以无法重现。一定是关于gm.sf的东西。可能它使用了 R 或 Python 命名冲突。 -
你在引号中使用了
mean,对吗?就像'mean?'一样,如果是这样,我认为这就是问题所在。函数sf与上面加州大学洛杉矶分校链接上给出的函数相同,并且由于我缺乏智力,我无法弄清楚如何将 R 闭包作为字符串传递(正如预期的那样,我明白了sf是 R 和 python 中的闭包)。无论我使用哪个版本的sf,无论是他们的还是我的,它都具有相同的行为。而且,我相信这是由于该函数不在引号中。如果我在 python 中执行print(gms.sf),它会返回正确的闭包。 -
我相信,在 R 中,
mean和'mean'是同一个,这当然会在尝试将代码移植到 python 时混淆一切。