---
title: "Ordinal Regression with plssem"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Ordinal Regression with plssem}
  %\VignetteEngine{knitr::rmarkdown}
  \usepackage[utf8]{inputenc}
---

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

library(plssem)
```

This vignette demonstrates how to fit an ordinal regression model with `plssem`
using the `titanic` dataset.

In `plssem`, regression-style model syntax like `y ~ x1 + x2` is supported.
When the dependent variable (and/or predictors) are ordinal.
Ordinal variables can be supplied  via the `ordered` argument, or by
making sure they are `ordered` in the dataset.

## Data

```{r data}
head(titanic[, c("Survived", "Age", "Sex", "Female", "Pclass")])
```

## Linear ordinal regression

This model predicts survival as a function of age and sex.

```{r linear, message=FALSE, warning=FALSE}
m_linear <- "Survived ~ Age + Female"

fit_linear <- pls(
  m_linear,
  data          = titanic,
  ordered       = "Survived",
  boot.R        = 50,
  bootstrap     = TRUE,
  boot.parallel = "multicore",
  boot.ncpus    = 2
)

summary(fit_linear)
```

Optional: evaluate predictive performance.

```{r linear-predict, message=FALSE, warning=FALSE}
pls_predict(fit_linear, benchmark = "acc")
```

## Non-linear ordinal regression (interaction)

To include a non-linear (interaction) effect, add an interaction term. With
ordinal indicators and interactions, `plssem` automatically switches to the
Monte-Carlo ordinal PLSc estimator.

```{r interaction, message=FALSE, warning=FALSE}
m_int <- "Survived ~ Age + Female + Age:Female"

fit_int <- pls(
  m_int,
  data          = titanic,
  ordered       = "Survived",
  boot.R        = 50,
  bootstrap     = TRUE,
  boot.parallel = "multicore",
  boot.ncpus    = 2
)

summary(fit_int)
```

```{r interaction-predict, message=FALSE, warning=FALSE}
pls_predict(fit_int, benchmark = "acc")
```
