管道'。'点在glm调用中引起麻烦

时间:2019-07-06 20:14:20

标签: r dplyr

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) 

1 个答案:

答案 0 :(得分:2)

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

select

2)另一种可能性是将其反转,而不是将library(dplyr) library(magrittr) library(pscl) library(ISLR) fitted <- Default %$% glm(default ~ income, family=binomial) fitted %>% pR2 放在管道内,而不是将管道放在glm内:

glm

3)第三种方法是生成fitted <- glm(default ~ ., data = Default %>% select(income, default), family = binomial) fitted %>% pR2 的{​​{1}}自变量,而不是formula自变量。

glm

如果重要的是输出中的data行看起来很重要,请用它替换fitted <- Default %>% select(starts_with("inc")) %>% names %>% reformulate("default") %>% glm(data = Default, family = binomial) fitted %>% pR2 行。

glm

或使用purrr:

Call: