broom::tidy 多项式回归失败
broom::tidy fails on multinomial regression
我正在尝试 运行 使用 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
时这段代码似乎工作正常(这是使用的全部意义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
有人知道我遗漏了什么或者这是一个错误吗?
这可能是与 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)
我们在 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 创建
我正在尝试 运行 使用 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
时这段代码似乎工作正常(这是使用的全部意义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
有人知道我遗漏了什么或者这是一个错误吗?
这可能是与 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)
我们在 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 创建