【发布时间】: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,虽然这是真的,但我认为这不是问题所在(问题是数据的
.,而不是公式中的.。 -
靠烟斗活着的人,死在烟斗里。