【问题标题】:Pipe '.' dot causes trouble in glm call管道 '。'点导致 glm 调用出现问题
【发布时间】:2019-07-06 20:14:20
【问题描述】:

dplyr 的管道不传递沿链传递的对象名称。这是众所周知的。但是,在您拟合 glm 模型后,它会导致意想不到的复杂情况。使用 glm 对象的函数期望调用包含包含数据的对象的正确名称。

    #sample data
    p_load(ISLR)
    mydata = ISLR::Default

    #fit glm
    fitted=
    mydata %>% 
      select(default, income) %>%
      glm(default~.,data=.,family=binomial) 

    #dot in call
    fitted$call

    #pscl's pR2 pseudo r2 function does not work
    p_load(pscl)
    pR2(fitted)

如何解决此问题? 我想继续使用管道,包括select 函数。我还想获得一个在 fitted 中被反对的 glm,而不是可以与 pR2 或其他需要工作调用的函数一起使用。

可以将数据预处理重新安排到 glm 调用中,但它会带走代码的优雅。

fitted=
  glm(default~.,
      data=mydata %>%
        select(default, income),
      family=binomial) 

【问题讨论】:

  • 你有什么问题?
  • 这是因为.glm 公式中具有特殊含义,即将模型拟合到数据集data 中包含的所有变量,但依赖变量除外。
  • 是的,这是很常见的问题。您已经知道解决方案,不要输入glm。分配给中间对象。 mydata_glm <- mydata %>% ..... ; glm(...., data = mydata_glm)
  • @eastclintw00d,虽然这是真的,但我认为这不是问题所在(问题是数据的.,而不是公式中的.
  • 靠烟斗活着的人,死在烟斗里。

标签: r dplyr


【解决方案1】:

1) 由于您在 select 中明确写出所有变量,因此您可以轻松地将它们写在公式中并摆脱 select - 您如果您愿意,可以保留select,但如果变量已经在公式中明确给出,这似乎毫无意义。然后这个工作:

library(dplyr)
library(magrittr)
library(pscl)
library(ISLR)

fitted <- Default %$% glm(default ~ income, family=binomial)

fitted %>% pR2

2) 另一种可能性是将其倒置,而不是将glm 放入管道中,而是将管道放入glm

fitted <- 
  glm(default ~ ., data = Default %>% select(income, default), family = binomial)

fitted %>% pR2

3) 第三种方法是生成glmformula 参数,而不是data 参数。

fitted <- Default %>% 
  select(starts_with("inc")) %>% 
  names %>% 
  reformulate("default") %>%
  glm(data = Default, family = binomial)

fitted %>% pR2

如果输出中的Call: 行看起来不错很重要,请用此替换glm 行。

{ do.call("glm", list(., data = quote(Default), family = quote(binomial))) }

或使用咕噜声:

{ invoke("glm", list(., data = expr(Default), family = expr(binomial))) }

【讨论】:

  • (1) select 可以使用通配符(例如,starts_with()ends_with()contains()),或替换为select_if。在最小的示例中它可能看起来毫无意义,但总的来说并非如此。
  • 虽然有帮助的是指出两种方法:固定公式或数据都有效。
  • 已添加(3)。
  • 考虑到所有限制,这可能是最好的解决方案。我忘了reformulate——在这里真的很有用。干得好!
  • 相关问题,也许值得一个新问题:使用地图:Default %&gt;% group_by(student) %&gt;% nest %&gt;% mutate(model=map(data,glm,formula=formul,family='binomial')) %&gt;% mutate(pr2=map(model,pR2))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-25
  • 2014-02-04
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 2015-09-07
相关资源
最近更新 更多