【问题标题】:fun= argument of summary function in Rfun = R中汇总函数的参数
【发布时间】: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 时混淆一切。

标签: python r rpy2 summary


【解决方案1】:

获取源代码很容易。根据how to view R source,我刚刚跑了 getAnywhere(summary.formula) 并得到了相关的代码块:

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))
}

因此,如果不使用默认的fun,它会尝试转换为字符向量,这就是为什么我不断收到闭包强制错误的原因。在 R 中,我可以通过执行 as.character(sf) ... 重新创建错误(FUN,顺便说一句,这是一条红鲱鱼,因为我们不是 fun 的任何论点都具有相同的行为)。哎呀,这确实不好玩!

【讨论】:

  • 好吧,我有点让它工作,虽然它是一个半途而废的解决方案。我将 Pandas 数据框导入 iPython 中的 rmagic,然后能够使用 magic 命令获取汇总结果表。我想这确实有道理,因为它可以很好地转换为 R 中的字符。
  • 我将接受这个作为答案,因为即使我可以直接在 python 中使用它,我也会丢失通过魔法命令在 R 中获得的漂亮汇总表格式(我导出了表对象回到 python 和天哪,太丑了!)。是时候继续前进了……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 2013-08-15
  • 1970-01-01
  • 2021-01-25
  • 2016-11-30
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多