---
title: "MARS models via the `earth` package"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{mars}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
library(tidypredict)
library(earth)
library(dplyr)
```

| Function                                                      |Works|
|---------------------------------------------------------------|-----|
|`tidypredict_fit()`, `tidypredict_sql()`, `parse_model()`      |  ✔  |
|`tidypredict_to_column()`                                      |  ✔  |
|`tidypredict_test()`                                           |  ✔  |
|`tidypredict_interval()`, `tidypredict_sql_interval()`         |  ✗  |
|`parsnip`                                                      |  ✔  |


## `tidypredict_` functions

```{r}
library(earth)
data("etitanic", package = "earth")

model <- earth(age ~ sibsp + parch, data = etitanic, degree = 3)
```

- Create the R formula
    ```{r}
    tidypredict_fit(model)
    ```

- SQL output example
    ```{r}
    tidypredict_sql(model, dbplyr::simulate_odbc())
    ```

- Add the prediction to the original table
    ```{r}
    library(dplyr)
    
    etitanic %>%
      tidypredict_to_column(model) %>%
      glimpse()
    ```

- Confirm that `tidypredict` results match to the model's `predict()` results
    ```{r}
    tidypredict_test(model, etitanic)
    ```

## GLM models

`tidypredict` supports the `glm` argument as well:
```{r}
model <- earth(survived ~ .,
               data = etitanic,
               glm = list(family = binomial), degree = 2)

tidypredict_fit(model)
```

The spec sets the `is_glm` entry to 1, as well as the `family` and `link` entries. 
```{r}
str(parse_model(model), 2)
```

## parsnip

`parsnip` fitted models are also supported by `tidypredict`:
```{r}
library(parsnip)

p_model <- mars(mode = "regression", prod_degree = 3) %>%
  set_engine("earth") %>%
  fit(age ~ sibsp + parch, data = etitanic)

tidypredict_fit(p_model)
```

## Parse model spec

Here is an example of the model spec:
```{r}
pm <- parse_model(model)
str(pm, 2)
```

```{r}
str(pm$terms[1:2])
```

