我试图在tidyverse工作流程中使用步进功能进行基于AIC的模型选择。但是,我收到一个错误:
is.data.frame(data)中的错误:对象'。'找不到。
我需要tidyverse工作流程来偶尔过滤数据。我该怎么办?
mean_mpg <- mean(mtcars$mpg)
# creating a new variable that shows that Miles/(US) gallon is greater than the mean or not
mtcars <-
mtcars %>%
mutate(mpg_cat = ifelse(mpg > mean_mpg, 1,0))
mtcars$cyl <- as.factor(mtcars$cyl)
mtcars_lr <-
mtcars %>%
select (cyl,vs, am, mpg_cat) %>%
glm(formula = mpg_cat ~ cyl+vs+ am,
data =., family = "binomial")
step(mtcars_lr)
答案 0 :(得分:1)
这与magrittr
管道%>%
有关。在此technical note中,您可以找到以下段落:
magrittr管道操作员使用非标准评估。他们捕获 他们的输入,并检查他们以找出如何进行。第一个 功能是从各个右侧产生的 表达式,然后通过应用此函数获得结果 到左侧在大多数情况下,您可以忽略细微之处 评估的某些方面,但某些功能可能会捕获其 调用环境,因此使用运算符将不完全 等同于没有管道操作员的“标准呼叫”。
这意味着x %>% f
通常等于f(x)
。在您的情况下不是。
您将必须执行以下操作:
mtcars2 <- mtcars %>%
mutate(mpg_cat = if_else(mpg > mean_mpg, 1,0),
cyl = as.factor(cyl)) %>%
select (cyl, vs, am, mpg_cat)
glm(formula = mpg_cat ~ cyl + vs + am,
data = mtcars2, family = "binomial") %>%
step(mtcars_lr)
要了解区别,可以尝试以下操作:
x1 <- glm(formula = mpg_cat ~ cyl + vs + am,
data = mtcars2, family = "binomial")
x2 <- mtcars2 %>% glm(formula = mpg_cat ~ cyl + vs + am,
data = ., family = "binomial")
all.equal(x1, x2)
[1] "Component “call”: target, current do not match when deparsed"
因此x1
和x2
的调用组件不同,并且step
函数使用此参数。
答案 1 :(得分:0)
这与magrittr
管道%>%
有关。在此technical note中,您可以找到以下段落:
magrittr管道操作员使用非标准评估。他们捕获 他们的输入,并检查他们以找出如何进行。第一个 功能是从各个右侧产生的 表达式,然后通过应用此函数获得结果 到左侧在大多数情况下,您可以忽略细微之处 评估的某些方面,但某些功能可能会捕获其 调用环境,因此使用运算符将不完全 等同于没有管道操作员的“标准呼叫”。
这意味着x %>% f
通常等于f(x)
。在您的情况下不是。
您将必须执行以下操作:
mtcars2 <- mtcars %>%
mutate(mpg_cat = ifelse(mpg > mean_mpg, 1,0),
cyl = as.factor(cyl)) %>%
select (cyl,vs, am, mpg_cat)
glm(formula = mpg_cat ~ cyl+vs+ am,
data = mtcars2, family = "binomial") %>%
step(mtcars_lr)