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)
答案 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: