--- title: "multinom models" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{multinom models} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} if (requireNamespace("nnet", quietly = TRUE)) { library(tidypredict) library(nnet) library(dplyr) eval_code <- TRUE } else { eval_code <- FALSE } knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = eval_code ) ``` | Function |Works| |---------------------------------------------------------------|-----| |`tidypredict_fit()`, `tidypredict_sql()`, `parse_model()` | ✔ | |`tidypredict_to_column()` | ✗ | |`tidypredict_test()` | ✗ | |`tidypredict_interval()`, `tidypredict_sql_interval()` | ✗ | |`parsnip` | ✔ | `nnet::multinom()` fits multinomial log-linear models. Because these models predict one probability per outcome class, `tidypredict_fit()` returns a *named list* of expressions, one for each class, rather than a single expression. The expressions implement the softmax over the per-class linear predictors, with the first level of the outcome acting as the reference class. Since the output is a list, `tidypredict_to_column()` and `tidypredict_test()` are not supported. ## `tidypredict_` functions ```{r} library(nnet) model <- multinom(Species ~ ., data = iris, trace = FALSE) ``` - Create the R formulas, one per class ```{r} fit <- tidypredict_fit(model) names(fit) fit[["setosa"]] ``` - Add the predictions to the original table ```{r} library(dplyr) iris %>% mutate(!!!tidypredict_fit(model)) %>% glimpse() ``` - Confirm that the results match the model's `predict()` results ```{r} probs <- sapply(fit, \(f) rlang::eval_tidy(f, iris)) all.equal(unname(probs), unname(predict(model, iris, type = "probs"))) ``` ## parsnip `parsnip` fitted models are also supported by `tidypredict`: ```{r} library(parsnip) p_model <- multinom_reg() %>% set_engine("nnet") %>% fit(Species ~ ., data = iris) ``` ```{r} tidypredict_fit(p_model)[["virginica"]] ``` ## Parse model spec Here is an example of the model spec: ```{r} pm <- parse_model(model) str(pm, 2) ```