knitr::opts_chunk$set(echo = TRUE,
                      comment = "#>",
                      out.width = "100%")
library(data.table)
library(lubridate)

Objectif

Joindre des périodes d'admissibilité à des périodes index. On conservera les périodes d'admissibilité qui chevauchent au moins une journée la période index.

Datas

Code préliminaire

# Création des datasets d'analyse
data_admis <- data.table(  # dataset créé par la fonction import_struct()
  ID = c(1, 1, 2, 3, 4, 5),
  DateNais = c(-100, -100, -98, -97, -96, 201),
  DateDeces = c(NA, NA, NA, NA, 170, NA),
  DebutAdmis = c(1, 21, 47, 90, 150, 201),
  FinAdmis = c(10, 30, 60, 130, 170, 260)
)
data_admis[  # arranger le dataset pour le rendre vraisemblable
  , `:=` (ID = as.integer(ID),
          DateNais = as_date(DateNais) + 15000,
          DateDeces = as_date(DateDeces) + 15000,
          DebutAdmis = as_date(DebutAdmis) + 15000,
          FinAdmis = as_date(FinAdmis) + 15000)
][]  # afficher tableau

data_index <- data.table(  # dataset fourni par l'utilisateur
  ID = c(1, 2, 3, 4, 5, 6),
  DebutIndex = c(1, 41, 101, 161, 195, 301),
  FinIndex = c(10, 50, 110, 180, 260, 310)
)
data_index[  # arranger le dataset pour le rendre vraisemblable
  , `:=` (ID = as.integer(ID),
          DebutIndex = as_date(DebutIndex) + 15000,
          FinIndex = as_date(FinIndex) + 15000)
][]  # afficher tableau


# Manipulations
dt <- merge(  # joindre les périodes admis à index
  data_admis, data_index,  # admis en premier pour avoir DateNais+DateDeces au début
  by = "ID"
)
dt[]
dt <- dt[FinAdmis >= DebutIndex & DebutAdmis <= FinIndex]  # conserver les admis qui chevauchent index
dt[]
dt[DebutAdmis < DebutIndex, DebutAdmis := DebutIndex]  # ajuster les dates Admis pour les inclure dans
dt[FinAdmis > FinIndex, FinAdmis := FinIndex]          # l'intervalle index
dt[]
dt[, `:=` (nJours_index = as.integer(FinIndex - DebutIndex + 1L),   # indiquer le nombre de jour pour
           nJours_admis = as.integer(FinAdmis - DebutAdmis + 1L))]  # index et admis
dt[]
dt[, ratio := nJours_admis / nJours_index]  # ratio indiquant le nombre de jours admissible dans index
dt[, estNe := FALSE]  # indiquer si ID est né lors de la période index
dt[DebutIndex <= DateNais & DateNais <= FinIndex, estNe := TRUE]
dt[, estDCD := FALSE]  # indiquer si ID est décédé lors de la période index
dt[DebutIndex <= DateDeces & DateDeces <= FinIndex, estDCD := TRUE]
dt[]
dt[, Admis_Continue := FALSE]
dt[ratio == 1, Admis_Continue := TRUE]
dt[]
dt[, Admis_Continue_Nais := FALSE]  # admis en continue depuis sa naissance
dt[  # TRUE si période index commence avant naissance, mais ID toujours admissible
  DateNais == DebutAdmis  # admissible à partir de la naissance
  & DebutAdmis >= DebutIndex  # admissible après début index
  & FinAdmis == FinIndex,  # admissible jusqu'à la fin
  Admis_Continue_Nais := TRUE
]
dt[, Admis_Continue_Deces := FALSE]  # admis en continue jusqu'à sa mort
dt[
  DebutAdmis == DebutIndex  # admissible dès le début
  & DebutIndex <= DateDeces & DateDeces <= FinIndex  # date de décès dans intervalle index
  & FinAdmis == DateDeces,  # admissible jusqu'à sa mort
  Admis_Continue_Deces := TRUE
]

À vérifier



INESSS-QC/admissibilite1 documentation built on Aug. 7, 2020, 9:39 a.m.