【问题标题】:broom::tidy fails on multinomial regressionbroom::tidy 在多项回归中失败
【发布时间】:2021-10-02 18:24:03
【问题描述】:

我正在尝试使用 tidymodels 在 R 中运行多项逻辑回归,但我无法将结果转换为整洁的对象。这是使用 iris 数据集的示例。

# Multinomial  -----------------------------------------------------------------
# recipe
multinom_recipe <-
  recipe(Species ~ Sepal.Length + Sepal.Width + Sepal.Length + Petal.Width, data = iris) %>% 
  step_relevel(Species, ref_level = "setosa")

# model 
multinom_model <-  multinom_reg() %>% 
  set_engine("nnet")

# make workflow
multinom_wf <- 
  workflow() %>% 
  add_model(multinom_model) %>% 
  add_recipe(multinom_recipe) %>% 
  fit(data = iris) %>% 
  tidy()

multinom_wf

最后一步抛出如下错误:

Error in eval(predvars, data, env) : object '..y' not found

我认为这是因为 fit(data = iris) 的输出是一个工作流对象,但是当我不使用 workflow(这是使用 tidymodels 的全部意义)或者如果我拟合了一个线性模型。

# recipe
linear_recipe <-
  recipe(Sepal.Length ~ Sepal.Width + Sepal.Length + Petal.Width, data = iris) 

# model 
linear_model <-  linear_reg() %>% 
  set_engine("lm")

# make workflow
linear_wf <- 
  workflow() %>% 
  add_model(linear_model) %>% 
  add_recipe(linear_recipe) %>% 
  fit(data = iris) %>% 
  tidy()

linear_wf

有人知道我缺少什么或者这是一个错误吗?

【问题讨论】:

    标签: r tidyverse multinomial tidymodels


    【解决方案1】:

    我们在 parsnip 中有一个函数 repair_call() 来修复那些不符合“典型”规范的包的调用对象;阅读more about it here

    library(tidymodels)
    #> Registered S3 method overwritten by 'tune':
    #>   method                   from   
    #>   required_pkgs.model_spec parsnip
    
    multinom_model <-  multinom_reg() %>% 
       set_engine("nnet")
    
    nnet_fit <- 
       multinom_model %>%
       fit(Species ~ Sepal.Length + Sepal.Width + Sepal.Length + Petal.Width, data = iris)
    
    tidy(nnet_fit)
    #> Error in model.frame.default(formula = Species ~ Sepal.Length + Sepal.Width + : 'data' must be a data.frame, environment, or list
    
    nnet_fixed <- repair_call(nnet_fit, data = iris)
    tidy(nnet_fixed)
    #> # A tibble: 8 × 6
    #>   y.level    term         estimate std.error statistic p.value
    #>   <chr>      <chr>           <dbl>     <dbl>     <dbl>   <dbl>
    #> 1 versicolor (Intercept)      4.17     260.     0.0160   0.987
    #> 2 versicolor Sepal.Length     1.08      64.8    0.0167   0.987
    #> 3 versicolor Sepal.Width     -9.13      80.4   -0.114    0.910
    #> 4 versicolor Petal.Width     20.9       98.1    0.213    0.831
    #> 5 virginica  (Intercept)    -16.0      261.    -0.0616   0.951
    #> 6 virginica  Sepal.Length     2.37      64.8    0.0365   0.971
    #> 7 virginica  Sepal.Width    -13.9       80.4   -0.173    0.862
    #> 8 virginica  Petal.Width     36.8       98.2    0.375    0.708
    

    reprex package (v2.0.0) 于 2021-08-01 创建

    【讨论】:

      【解决方案2】:

      这可能与call 发生冲突。我们可以把它改成

      multinom_wf$fit$fit$fit$call <- quote(nnet::multinom(formula = Species ~ ., data = iris, trace = FALSE))
      multinom_wf  %>%
           tidy
      

      -输出

      # A tibble: 8 x 6
        y.level    term         estimate std.error statistic p.value
        <chr>      <chr>           <dbl>     <dbl>     <dbl>   <dbl>
      1 versicolor (Intercept)      4.17      12.0    0.348  0.728  
      2 versicolor Sepal.Length     1.08      42.0    0.0258 0.979  
      3 versicolor Sepal.Width     -9.13      81.5   -0.112  0.911  
      4 versicolor Petal.Width     20.9       14.0    1.49   0.136  
      5 virginica  (Intercept)    -16.0       12.1   -1.33   0.185  
      6 virginica  Sepal.Length     2.37      42.0    0.0563 0.955  
      7 virginica  Sepal.Width    -13.9       81.5   -0.171  0.864  
      8 virginica  Petal.Width     36.8       14.1    2.61   0.00916
      

      在哪里

      multinom_wf <- 
        workflow() %>% 
        add_model(multinom_model) %>% 
        add_recipe(multinom_recipe) %>% 
        fit(data = iris)
      

      【讨论】:

      • 太棒了。我的下一步将是学习表达式!
      • @akrun,所以听起来这是一个错误
      • @akrun 和@TarJae。感谢您的帮助,但它并没有解决我的问题。我认为这与它的多项式回归有关,因此具有超过 1 个结果类别,并且函数没有抓住所有这些?每次Error in eval(predvars, data, env) : object '..y' not found 都会引发相同的错误。这是一个有点类似的问题:stackoverflow.com/questions/50539633/…
      • @kaseyzapatka 所以即使我提供了修复程序,您仍然会收到错误消息?
      • @akrun,是的,我正在放弃使用tidy models 工作流程,但是当你有很多模型时,这似乎是一个好习惯。不幸的是,这里比它的价值更麻烦
      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 2018-09-14
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 2018-03-22
      相关资源
      最近更新 更多