首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“`tidymodels`”中,我如何进行F测试来比较两个模型?

在“`tidymodels`”中,我如何进行F测试来比较两个模型?
EN

Stack Overflow用户
提问于 2021-10-24 12:24:49
回答 2查看 63关注 0票数 0

在base R中,很容易使用anova()函数比较两个模型并进行F检验。

代码语言:javascript
复制
library(MASS)
lm.fit1 <- lm(medv ~ . , data = Boston)
lm.fit1a <- update(lm.fit1, ~ . - age - black)

anova(lm.fit1a, lm.fit1)

如果我使用的是tidymodels工作流。我如何做同样的比较?我的代码是这样的:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
anova(the_workflow_fit1a$thingy, the_workflow_fit1$thingy)

我需要的东西是什么?在tidymodels生态系统中,有没有一种优雅的方法来实现这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-24 20:56:05

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

基本R代码:

代码语言:javascript
复制
library(MASS)
lm.fit1 <- lm(medv ~ . , data = Boston)
lm.fit1a <- update(lm.fit1, ~ . - age - black)
anova(lm.fit1a, lm.fit1)

可以在tidymodels中使用以下命令完成:

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2021-10-24 15:44:40

我不完全熟悉tidymodels生态系统,因此我不确定这就是你想要的优雅的解决方案。

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

因此,这样就可以考虑一种解决方案;

代码语言:javascript
复制
models <- list(the_workflow_fit1,the_workflow_fit1a)

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

输出;

代码语言:javascript
复制
  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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69696707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档