首页 > 解决方案 > 管道 '。' 点导致 glm 调用出现问题

问题描述

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函数。我还想获得一个反对的 glm ,fitted而不是可以与pR2其他需要工作调用的函数一起使用。

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

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

标签: rdplyr

解决方案


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)第三种方法是生成formula论点glm而不是data论点。

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

fitted %>% pR2

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

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

或使用 purrr:

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

推荐阅读