R tidyverse工作流程中的逐步模型选择

时间:2019-07-29 07:08:15

标签: r tidyverse glm magrittr

我试图在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)

2 个答案:

答案 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"

因此x1x2的调用组件不同,并且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)