【问题标题】:In `tidymodels` how do I do an F test to compare two models?在 `tidymodels` 中,如何进行 F 检验来比较两个模型?
【发布时间】:2021-10-24 12:24:49
【问题描述】:

在基础 R 中,很容易使用 anova() 函数比较两个模型并获得 F 检验。

library(MASS)
lm.fit1 <- lm(medv ~ . , data = Boston)
lm.fit1a <- update(lm.fit1, ~ . - age - black)

anova(lm.fit1a, lm.fit1)

如果我正在使用 tidymodels 工作流程。我如何进行相同的比较?我有这样的代码:

library(tidymodels)
lm_spec <- linear_reg() %>%
  set_mode("regression") %>%
  set_engine("lm")

the_rec <- recipe(medv ~ ., data = Boston)

the_workflow <- workflow() %>% 
  add_recipe(the_rec) %>% 
  add_model(lm_spec)

the_workflow_fit1 <- 
  fit(the_workflow, data = Boston)
tidy(the_workflow_fit1)


the_workflow_fit1a <- 
  the_workflow_fit1  %>% 
  update_recipe(the_rec %>% step_rm(age, black)) %>% 
  fit(data = Boston) 
tidy(the_workflow_fit1a)

我不知道如何提取正确的对象(事物)来提供这样的语句:

anova(the_workflow_fit1a$thingy, the_workflow_fit1$thingy)

我需要什么东西?在tidymodels 生态系统中是否有一种优雅的方法可以做到这一点?

【问题讨论】:

    标签: r tidymodels


    【解决方案1】:

    几个小时后,@juliasilge https://github.com/tidymodels/workflows/issues/54 的帖子向我介绍了pull_workflow_fit() 我有一个tidymodels 解决方案。

    基本 R 代码:

    library(MASS)
    lm.fit1 <- lm(medv ~ . , data = Boston)
    lm.fit1a <- update(lm.fit1, ~ . - age - black)
    anova(lm.fit1a, lm.fit1)
    

    可以在tidymodels 中使用:

    library(tidymodels)
    lm_spec <- linear_reg() %>%
      set_mode("regression") %>%
      set_engine("lm")
    
    the_rec <- recipe(medv ~ ., data = Boston)
    
    the_workflow <- workflow() %>% 
      add_recipe(the_rec) %>% 
      add_model(lm_spec)
    
    the_workflow_fit1 <- 
      fit(the_workflow, data = Boston) %>% 
      extract_fit_parsnip()
    
    the_workflow_fit1a <- 
      the_workflow  %>% 
      update_recipe(
        the_rec %>% step_rm(age, black)
      ) %>% 
      fit(data = Boston) %>% 
      extract_fit_parsnip()
    
    anova(the_workflow_fit1a$fit, the_workflow_fit1$fit)
    

    【讨论】:

      【解决方案2】:

      我并不完全熟悉 tidymodels 生态系统,因此我不确定这是您正在寻找的优雅解决方案。

      我深入研究了the_workflow_fit1a 对象,发现子集.$fit$fit$fit 服务于lm 对象,这是anova 函数所需的。

      所以,这样可以考虑一个解决方案;

      models <- list(the_workflow_fit1,the_workflow_fit1a)
      
      models2 <- lapply(models,function(x) x$fit$fit$fit)
                        
      anova(models2[[1]],models2[[2]])
      

      输出;

        Res.Df    RSS    Df `Sum of Sq`     F `Pr(>F)`
         <dbl>  <dbl> <dbl>       <dbl> <dbl>    <dbl>
      1    492 11079.    NA         NA  NA    NA      
      2    494 11351.    -2       -272.  6.05  0.00254
      

      【讨论】:

        猜你喜欢
        • 2017-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 2014-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多