---
title: "Cohort tables"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{cohort_table}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
```
## Cohort table
```{r, echo = FALSE, message = FALSE, warning = FALSE}
library(omopgenerics)
library(dplyr)
```
A cohort is a **set of people that satisfy a certain set of criteria for a period of time**.
In omopgenerics we define the `cohort_table` class that allows us to represent individuals in a cohort.
A `cohort_table` is created using the `newCohortTable()` function that is defined by:
- A cohort table.
- A cohort set.
- A cohort attrition.
Let's start by creating a cdm reference with just two people.
```{r}
person <- tibble(
person_id = c(1, 2),
gender_concept_id = 0, year_of_birth = 1990,
race_concept_id = 0, ethnicity_concept_id = 0
)
observation_period <- dplyr::tibble(
observation_period_id = c(1, 2), person_id = c(1, 2),
observation_period_start_date = as.Date("2000-01-01"),
observation_period_end_date = as.Date("2021-12-31"),
period_type_concept_id = 0
)
cdm <- cdmFromTables(
tables = list(
"person" = person,
"observation_period" = observation_period
),
cdmName = "example_cdm"
)
cdm
```
Now let's say one of these people has a clinical event of interest. We can include them in a cohort table, which can then be used as part of an analysis.
```{r}
cohort <- tibble(
cohort_definition_id = 1, subject_id = 1,
cohort_start_date = as.Date("2020-01-01"),
cohort_end_date = as.Date("2020-01-10")
)
cdm <- insertTable(cdm = cdm, name = "cohort", table = cohort)
cdm$cohort <- newCohortTable(cdm$cohort)
```
The cohort table will be associated with settings and attrition. Because we did not specify these in `newCohortTable()` above, they will have been automatically populated. You can access the cohort set of a cohort table using the function `settings()`.
```{r}
settings(cdm$cohort)
```
Meanwhile, you can access the cohort attrition of a cohort table using the function `attrition()`.
```{r}
attrition(cdm$cohort)
```
The cohort attrition table is also used to compute the counts for each cohort (i.e. from the last row of the attrition). These can be seen with the function `cohortCount()`.
```{r}
cohortCount(cdm$cohort)
```
Note that because the cohort count is taken from the last row of attrition, if we make changes to a cohort we should then update attrition as we go. We can do this with:
```{r}
cdm$cohort <- cdm$cohort |>
filter(cohort_start_date == as.Date("2019-01-01")) |>
compute(name = "cohort", temporary = FALSE) |>
recordCohortAttrition("Require cohort start January 1st 2019")
attrition(cdm$cohort)
cohortCount(cdm$cohort)
```
An additional, optional, attribute keeps track of the concepts used to create the cohort. In this example we do not have a codelist associated with our cohort.
```{r}
cohortCodelist(cdm$cohort, cohortId = 1, type = "index event")
```
We can also associate our cohort with a codelist.
```{r}
cdm$cohort <- newCohortTable(cdm$cohort,
cohortCodelistRef = dplyr::tibble(
cohort_definition_id = c(1, 1),
codelist_name = c("disease X", "disease X"),
concept_id = c(101, 102),
type = "index event"
)
)
cohortCodelist(cdm$cohort, cohortId = 1, type = "index event")
```
Each element that defines a cohort table must satisfy certain criteria.
### Cohort Set
A cohort set must be a table with:
- Lowercase column names.
- At least `r cohortColumns("cohort_set")` columns (`cohortColumns("cohort_set")`).
- `cohort_name` must contain unique cohort names (currently they are converted to snake case).
- `cohort_definition_id` must contain unique cohort IDs. All IDs present in the table must be present in the cohort set and the same IDs must be present in cohort attrition.
### Cohort Attrition
A cohort attrition must be a table with:
- Lowercase column names.
- At least `r cohortColumns("cohort_attrition")` columns (`cohortColumns("cohort_attrition")`).
- `cohort_definition_id` must contain cohort IDs. All IDs present in the table must be present in the cohort attrition and the same IDs must be present in the cohort set.
- There must be unique pairs of `cohort_definition_id` and `reason_id`.
### Cohort Codelist
A cohort codelist must be a table with:
- Lowercase column names.
- At least `r cohortColumns("cohort_codelist")` columns (`cohortColumns("cohort_codelist")`).
- `cohort_definition_id` must contain cohort IDs. All IDs present in the table must be present in the cohort attrition and the same IDs must be present in the cohort set.
- `type` must be one of "index event", "inclusion criteria", and "exit criteria"
### Cohort Table
A cohort table must be a table with:
- It comes from a cdm_reference (extracted via `cdm$cohort`).
- It has the same source as this cdm_reference.
- Lowercase column names.
- At least `r cohortColumns("cohort")` columns (`cohortColumns("cohort")`).
- There is no record with an `NA` value in the required columns.
- There is no record with `cohort_start_date` after `cohort_end_date`.
- There is no overlap between records. A person can be in a cohort several times (several records with the same subject_id). But it can't enter (cohort_start_date) the cohort again before leaving it (cohort_end_date). So an individual can't be simultaneously more than once in the same cohort. This rule is applied at the cohort_definition_id level, so records with different cohort_definition_id can overlap.
- All the time between cohort_start_date and cohort_end_date (both included) the individual must be in observation.
## Combining generated cohort sets
You can bind two cohort tables using the method `bind()`. You can combine several cohort tables using this method. The only constraint is that cohort names must be unique across the different cohort tables. You have to provide a name for the new cohort table.
```{r}
asthma <- tibble(
cohort_definition_id = 1, subject_id = 1,
cohort_start_date = as.Date("2020-01-01"),
cohort_end_date = as.Date("2020-01-10")
)
cdm <- insertTable(cdm, name = "asthma", table = asthma)
cdm$asthma <- newCohortTable(cdm$asthma,
cohortSetRef = tibble(
cohort_definition_id = 1,
cohort_name = "asthma"
)
)
copd <- tibble(
cohort_definition_id = 1, subject_id = 2,
cohort_start_date = as.Date("2020-01-01"),
cohort_end_date = as.Date("2020-01-10")
)
cdm <- insertTable(cdm, name = "copd", table = copd)
cdm$copd <- newCohortTable(cdm$copd,
cohortSetRef = tibble(
cohort_definition_id = 1,
cohort_name = "copd"
)
)
cdm <- bind(cdm$asthma,
cdm$copd,
name = "exposures"
)
cdm$exposures
settings(cdm$exposures)
attrition(cdm$exposures)
cohortCount(cdm$exposures)
```
## Export metadata about a cohort table
You can export the metadata of a `cohort_table` using the function: `summary()`:
```{r}
summary(cdm$exposures) |>
glimpse()
```
This will provide a `summarised_result` object with the metadata of the cohort (cohort set, cohort counts and cohort attrition).