broom::tidy 在多项式回归中失败

问题描述

我正在尝试使用 tidymodels 在 R 中运行多项逻辑回归,但我无法将结果转换为 tidy 对象。这是一个使用 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

我以为是 bc fit(data = iris)输出一个工作流对象,但是当我不使用 workflow(这是使用 {{ 1}}) 或者我是否适合线性模型。

tidymodels

有人知道我遗漏了什么还是这是一个错误

解决方法

这可能与 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)
,

我们在欧洲防风草中有一个函数 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 年 8 月 1 日创建

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...