---
title: "Introduction"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Introduction}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r}
#| include: false
#| id: settings
knitr::opts_chunk$set(
warning = FALSE,
collapse = TRUE,
comment = "#>"
)
```
Joinpoint regression is commonly used in epidemiology to identify changes in temporal trends. The joinpointR package provides tools to fit joinpoint regression models, estimate annual percentage changes, and present results.
## Joinpoint regression models by group
The function `model_jp()`allows to fit joinpoint regression models with a log-response by levels of one or more categorical variable(s).
For the examples, we are going to use a simulated dataset with the HIV rates by sex in five regions
```{r}
#| message: false
# id: example-data
# Load required packages
library(dplyr)
library(tidyr)
library(ggplot2)
library(joinpointR)
# Seed for reproducibility
set.seed(123)
# Generate example data
data <- expand_grid(
year = 2015:2024,
sex = c("Male", "Female"),
region = c("North", "Central", "South", "East", "West")
) %>%
left_join(
tribble(
~region , ~slope1 , ~slope2 ,
"North" , -6 , 4 ,
"Central" , -5 , 3 ,
"South" , 3 , -4 ,
"East" , -7 , 2 ,
"West" , 2 , -5
)
) %>%
mutate(
trend = if_else(
year <= 2019,
slope1 * (year - 2015),
slope1 * 4 + slope2 * (year - 2019)
),
hiv_rate = 100 +
trend +
if_else(sex == "Male", 10, 0) +
rnorm(n(), 0, 0.8)
) %>%
select(year, region, sex, hiv_rate)
```
### Stepwise joinpoint regression by sex
```{r}
#| id: model-1
mod1 <- model_jp(
data = data,
value = "hiv_rate",
time = "year",
group = "sex",
k = 3,
step = TRUE,
test = TRUE
)
```
### Fixed number of joinpoints by sex
```{r}
#| id: model-2
mod2 <- model_jp(
data = data,
value = "hiv_rate",
time = "year",
group = "sex",
k = 1,
step = FALSE,
test = FALSE
)
mod2
```
### Stepwise joinpoint regression models by sex and region
```{r}
#| id: model-3
mod3 <- model_jp(
data = data,
value = "hiv_rate",
time = "year",
group = c("sex", "region"),
step = TRUE
)
```
## Annual percentage change (APC)
The function `get_apc()` provides the annual percentage change and its 95% confidence interval for models with significant joinpoints (`class: "segmented" "lm"`)
```{r}
#| id: APC-1
get_apc(mod2$Female)
```
The function returns an error when no significant joinpoints are detected (`class = "lm"`).
```{r}
#| error: true
#| id: APC-2
get_apc(mod1$Female, digits = 1)
```
## Average annual percent change (AAPC)
The function `get_aapc()` allows users to estimate the global trend even when no significant joinpoints were detected.
```{r}
#| id: AAPC-1
get_aapc(mod1$Female, digits = 1, show_ci = TRUE)
```
You can choose to show significance stars instead of CI:
```{r}
#| id: AAPC-2
get_aapc(mod1$Female, digits = 1, show_ci = FALSE)
```
## Summary tables
### Results as a data frame
```{r}
# id: tab-1
mod2 |>
summary_jp(digits = 1, var1 = "Sex", ft = FALSE)
```
### HTML Tables
```{r}
# id: tab-2
mod2 |>
summary_jp(digits = 1, var1 = "Sex", ft = TRUE)
```
### HTML Tables by two grouping variables
```{r}
#| id: tab-3
mod3 |>
summary_jp(digits = 1, var1 = "Region", var2 = "Sex", ft = TRUE)
```
Change the table language to Spanish
```{r}
#| id: tab-4
mod3 |>
summary_jp(digits = 1, var1 = "Región", var2 = "Sexo", ft = TRUE, lan = "es")
```
## Regression plots
```{r}
#| id: plot-1
mod1 |>
gg_jpoint()
```
Split by sex
```{r}
#| id: plot-2
mod1 |>
gg_jpoint(facets = TRUE)
```
Split by region
```{r}
#| id: plot-3
mod3 |>
gg_jpoint(facets = TRUE)
```
Hide data points
```{r}
#| id: plot-4
mod3 |>
gg_jpoint(facets = TRUE, obs = FALSE)
```
Hide joinpoint(s) marker(s)
```{r}
#| id: plot-5
mod3 |>
gg_jpoint(facets = TRUE, jp = FALSE)
```
Change colors and legend position using `ggplot2` functions
```{r}
#| id: plot-6
mod3 %>%
gg_jpoint(facets = TRUE, jp = FALSE) +
scale_color_viridis_d(name = "Sex:Region") +
theme(legend.position = "bottom")
```
Change facet layout
```{r}
#| id: plot-7
mod3 %>%
gg_jpoint(facets = TRUE) +
facet_wrap(~group, ncol = 5) +
scale_color_viridis_d(name = "Sex:Region") +
theme(legend.position = "bottom")
```