Temporalité dans les données de santé Maxime Wack Camille Nevoret 9 janvier 2018
Introduction Notion de temporalité est primordiale Données rarement ponctuelles Techniques statistiques variées Problématiques soulevées par les entrepôts de données cliniques Temporalité dans les données de santé 09.01.2018
Types de temporalité 1 temps 2 temps n temps n états ∞ temps Temporalité dans les données de santé 09.01.2018
1 temps Temporalité dans les données de santé 09.01.2018
1 temps — Contexte Études épidémiologiques Transversales Descriptives Comparatives Entre deux ou plusieurs groupes Temporalité dans les données de santé 09.01.2018
Rappel test statistique Temporalité dans les données de santé 09.01.2018
1 temps — Techniques Bivarié Statistiques descriptives Statistiques fréquentistes classiques t-test, ANOVA, Chi², etc. tests de comparaison entre groupes Temporalité dans les données de santé 09.01.2018
1 temps — Techniques Multivarié Régression linéaire Régression logistique Y = β₀1 + β₁x₁ + β₂x₂ + … + βnxn + ε Y = βX + ε Temporalité dans les données de santé 09.01.2018
1 temps — Problématiques Choix du test statistique Valeurs manquantes Temporalité dans les données de santé 09.01.2018
1 temps — Exemples Variables numériques : comparaison âge Variables catégorielles : comparaison CSP Temporalité dans les données de santé 09.01.2018
Exemples — Prérequis install.packages("tidyverse") library(tidyverse) library(lme4) library(lmerTest) library(TraMineR) library(TSA) library(astsa) library(zoo) library(Rssa) library(survival) Temporalité dans les données de santé 09.01.2018
Ceci n’est pas un pipe. %>% Provenant des packages magrittr et dplyr « sucre syntaxique » Permet de chaîner les instructions en un pipeline x %>% f f(x) > data %>% select(var1, var3) %>% filter(var1 > 5) %>% summary Temporalité dans les données de santé 09.01.2018
1 temps — Exemples # Data data(iris) data(mtcars) mtcars %>% mutate_at(vars(am, cyl, vs, gear), factor) -> mtcars Temporalité dans les données de santé 09.01.2018
1 temps — Exemples boxplot(mpg ~ am, data = mtcars) Temporalité dans les données de santé 09.01.2018
1 temps — Exemples ggplot(mtcars) + aes(x = am, y = mpg) + geom_boxplot() + geom_point(alpha = .5) Temporalité dans les données de santé 09.01.2018
1 temps — Exemples # Paramétrique t.test(mpg ~ am, data = mtcars, var.equal = T) oneway.test(mpg ~ am, data = mtcars, var.equal = T) # Non-paramétrique wilcox.test(mpg ~ am, data = mtcars) Temporalité dans les données de santé 09.01.2018
1 temps — Exemples iris %>% ggplot() + aes(x = Species, y = Sepal.Width) + geom_violin() + geom_point(position = "jitter", alpha = .5) Temporalité dans les données de santé 09.01.2018
1 temps — Exemples iris %>% ggplot() + aes(x = Petal.Length) + geom_histogram(data = iris %>% select(-Species)) + geom_histogram(aes(fill = Species)) + facet_grid(~Species) Temporalité dans les données de santé 09.01.2018
1 temps — Exemples # Paramétrique oneway.test(Sepal.Width ~ Species, data = iris) # Non-paramétrique kruskal.test(Sepal.Width ~ Species, data = iris) Temporalité dans les données de santé 09.01.2018
1 temps — Exemples plot(mtcars) Temporalité dans les données de santé 09.01.2018
1 temps — Exemples # Régression linéaire fit <- lm(mpg ~ am, data = mtcars) summary(fit) plot(fit) fit <- lm(mpg ~ cyl + disp + hp + drat + wt + vs + am, data = mtcars) # Régression logistique fit <- glm(am ~ mpg + drat + wt, data = mtcars, family = "binomial") Temporalité dans les données de santé 09.01.2018
2 temps Temporalité dans les données de santé 09.01.2018
2 temps — Contexte Études longitudinales : État initial – état final cas-témoin cohorte exposé-non exposé essai randomisé État initial – état final 2 mesures du même paramètre chez les mêmes patients Temporalité dans les données de santé 09.01.2018
2 temps — Techniques Bivarié Statistiques descriptives tests appariés étude de l’évolution (différence pour valeurs numériques) Temporalité dans les données de santé 09.01.2018
2 temps — Techniques Multivarié Régression linéaire Régression logistique Temps comme co-facteur Y modélisant l’évolution Temporalité dans les données de santé 09.01.2018
2 temps — Problématiques Variable d’intérêt non numérique Perdus de vue Calibration de la mesure Temporalité dans les données de santé 09.01.2018
2 temps — Exemples Variables numériques : évolution cholestérolémie avant et après traitement Variables catégorielles : évolution statut tabagique avant et après campagne de communication Temporalité dans les données de santé 09.01.2018
2 temps — Exemples # Data data(ChickWeight) Temporalité dans les données de santé 09.01.2018
2 temps — Exemples ChickWeight %>% filter(Time %in% c(0, 2)) %>% ggplot() + aes(x = Time, y = weight, group = Chick, color = Diet) + geom_point() + geom_line() Temporalité dans les données de santé 09.01.2018
2 temps — Exemples t.test(ChickWeight$weight[ChickWeight$Time == 0], paired = T) ChickWeight %>% filter(Time %in% c(0, 2)) %>% group_by(Chick) %>% summarise(weightDiff = last(weight) - first(weight), Diet = first(Diet)) -> deuxTemps Temporalité dans les données de santé 09.01.2018
2 temps — Exemples deuxTemps %>% ggplot() + aes(x = weightDiff, fill = Diet) + geom_density(alpha = .25) #, position = "fill") # position = "stack" "fill" Temporalité dans les données de santé 09.01.2018
2 temps — Exemples oneway.test(weightDiff ~ Diet, data = deuxTemps) kruskal.test(weightDiff ~ Diet, data = deuxTemps) Temporalité dans les données de santé 09.01.2018
2 temps variables — Contexte Études dites de survie État initial – survenue d’un évènement Données censurées Temporalité dans les données de santé 09.01.2018
2 temps variables — Techniques Bivarié Log-rank Courbe de Kaplan-Meier Temporalité dans les données de santé 09.01.2018
2 temps variables — Techniques Multivarié Modèle de régression à risque proportionnel Modèle de Cox λ(t|Xi) = λ0(t) exp(Xi·β) Temporalité dans les données de santé 09.01.2018
2 temps variables — Problématiques Perdus de vue Caractérisation de l’évènement Temporalité dans les données de santé 09.01.2018
2 temps variables — Exemples Survie après diagnostic de cancer du poumon «Survie» avant récidive de tachycardie ventriculaire Temporalité dans les données de santé 09.01.2018
2 temps variables — Exemples # Data data(lung) lung$Surv <- Surv(lung$time, lung$status) Temporalité dans les données de santé 09.01.2018
2 temps variables — Exemples survfit(Surv ~ 1, data = lung) -> fit plot(fit) Temporalité dans les données de santé 09.01.2018
2 temps variables — Exemples survfit(Surv ~ sex, data = lung) -> fit plot(fit, conf.int = T, col = c("blue", "red")) legend("topright", legend = c("Hommes", "Femmes"), col = c("blue", "red"), lty = 1) Temporalité dans les données de santé 09.01.2018
2 temps variables — Exemples survdiff(Surv ~ sex, data = lung) coxph(Surv ~ sex + age + ph.ecog + ph.karno + meal.cal + wt.loss, data = lung) -> fit cox.zph(fit) plot(cox.zph(fit)) Temporalité dans les données de santé 09.01.2018
n temps Temporalité dans les données de santé 09.01.2018
n temps — Contexte Études longitudinales prospectives : cohorte essai randomisé État initial – états intermédiaires – état final n mesures du même paramètre chez les mêmes patients Temporalité dans les données de santé 09.01.2018
n temps — Techniques ANOVA à mesures répétées Modèle mixte associe effets fixes et effets aléatoires Y = βX + uZ + ε Variable aléatoire = variable dont on ne connaît pas toutes les valeurs possibles Temporalité dans les données de santé 09.01.2018
n temps — Problématiques Temps de mesures fixes Mesure à chaque point Temporalité dans les données de santé 09.01.2018
n temps — Exemples Évolution du poids/triglycérides au cours d’un régime alimentaire Évolution des notes au cours d’un cursus universitaire Temporalité dans les données de santé 09.01.2018
n temps — Exemples ChickWeight %>% ggplot() + aes(x = Time, y = weight, group = Chick, color = Diet) %>% geom_line(alpha = .5) + geom_smooth(aes(x = Time, y = weight, color = Diet)) Temporalité dans les données de santé 09.01.2018
n temps — Exemples ChickWeight %>% ggplot() + aes(x = Time, y = weight, group = Chick, color = Diet) %>% geom_line(alpha = .5) + geom_smooth(aes(x = Time, y = weight, color = Diet)) Temporalité dans les données de santé 09.01.2018
n temps — Exemples lmer(weight ~ Diet + (1|Time) + (1|Chick), data = ChickWeight) -> fit summary(fit) plot(fit) Temporalité dans les données de santé 09.01.2018
n états Temporalité dans les données de santé 09.01.2018
n états — Contexte Données collectées en continu Entrepôts de données cliniques Données du SNDS (Système National de Données de Santé) Temporalité dans les données de santé 09.01.2018
n états — Techniques Modèle de survie avec multi-états et risques compétitifs Réseaux bayésiens Étude de trajectoires Temporalité dans les données de santé 09.01.2018
n états — Problématiques États doivent être catégoriels Temporalité dans les données de santé 09.01.2018
n états — Exemples Trajectoires de soin États successifs dans une maladie chronique Temporalité dans les données de santé 09.01.2018
n états — Exemples library(TraMineR) library(cluster) ## Data data(mvad) Temporalité dans les données de santé 09.01.2018
n états — Exemples ## Description mvad.seq <- seqdef(mvad, 17:86, xtstep = 12) plot(mvad.seq, 1:20) seqdplot(mvad.seq) Temporalité dans les données de santé 09.01.2018
n états — Exemples ## Clustering mvad.om <- seqdist(mvad.seq, method = "OM", sm = "TRATE") clusterward <- agnes(mvad.om, diss = T, method = "ward") mvad.cl <- cutree(clusterward, k = 4) cl.lab <- factor(mvad.cl, labels = paste("Cluster", 1:4)) Temporalité dans les données de santé 09.01.2018
n états — Exemples seqdplot(mvad.seq, group = cl.lab) Temporalité dans les données de santé 09.01.2018
n états — Exemples seqfplot(mvad.seq, group = cl.lab) Temporalité dans les données de santé 09.01.2018
n états — Exemples seqmsplot(mvad.seq, group = cl.lab) Temporalité dans les données de santé 09.01.2018
n états — Exemples ## Analyse mvad.ent <- seqient(mvad.seq) lm.ent <- lm(mvad.ent ~ male + funemp + gcse5eq, data = mvad) summary(lm.ent) Temporalité dans les données de santé 09.01.2018
∞ temps Temporalité dans les données de santé 09.01.2018
∞ temps — Contexte Mesures biologiques : Données de moniteurs : ECG Température corporelle Sécrétion hormonale … Données de moniteurs : ECG EEG Temporalité dans les données de santé 09.01.2018
∞ temps — Contexte Suivi du nombre de cas d’une pathologie Données de l’Institut de Veille Sanitaire Temporalité dans les données de santé 09.01.2018
∞ temps — Contexte Analyse d’un signal Prévision Comparaison de série Aide au diagnostic Temporalité dans les données de santé 09.01.2018
∞ temps — Contexte Evènement : Mortalité cardiovalculaire Période de 10 ans 508 points de mesures 1 point de mesure correspond à une moyenne sur 6 jours Données libres d’accès, R package astsa Temporalité dans les données de santé 09.01.2018
∞ temps — Contexte Etude préliminaire des données (fenêtre temporelle, nombre d’observation, visualisation des données ….) # Data data(cmort) is.ts(cmort) #On vérifie qu'il s'agit bien d'un objet série temporelle start(cmort) #Première observation end(cmort) #Dernière observation frequency(cmort) #Fréquence des observations deltat(cmort) #Intervalle de temps entre deux observations length(cmort) #Nombre de points head(cmort) #Visualisation des premier éléments de l'objet cmort tsplot(cmort) #Visualisation graphique de la série Temporalité dans les données de santé 09.01.2018
∞ temps — Techniques Méthode de décomposition Principe : Une série temporelle peut être décomposé suivant 3 composantes : Tendance 𝑚 𝑡 Saisonnalité 𝑠 𝑡 Bruit 𝜀 𝑡 Tendance : Suite déterministe, Modélise l’évolution moyenne « à long terme » Saisonnalité : Suite déterministe et périodique, Modélise les fluctuations déterministes à court terme et récurrent Bruit : Suite aléatoire, Modélise les fluctuations aléatoire Temporalité dans les données de santé 09.01.2018
∞ temps — Techniques Méthode de décomposition Différents modèles à partir de cette décomposition Modèle additif 𝑌 𝑡 = 𝑚 𝑡 + 𝜀 𝑡 𝑌 𝑡 = 𝑚 𝑡 + 𝑠 𝑡 + 𝜀 𝑡 Modèle multiplicatif 𝑌 𝑡 = 𝑚 𝑡 𝜀 𝑡 𝑌 𝑡 = 𝑠 𝑡 𝜀 𝑡 Modèle hybride 𝑌 𝑡 = 𝑚 𝑡 𝑠 𝑡 + 𝜀 𝑡 Temporalité dans les données de santé 09.01.2018
∞ temps — Techniques Méthode de décomposition Temporalité dans les données de santé 09.01.2018
∞ temps — Techniques Méthode de décomposition Test de tendance de Mann-Kendall : H0 : « il n'y a pas de tendance » Test de stationnarité : Teste si la série est stationnaire ie la série à le même comportement au temps t ou au temps t+k Test de blancheur : Teste si la série est un bruit blanc ie Moyenne nulle Variance σ² Covariance nulle Temporalité dans les données de santé 09.01.2018
∞ temps — Exemple Méthode de décomposition Tester l’existence d’une tendance sur les données cmort Décomposer les données selon un modèle additif (puis multiplicatif) MannKendall(cmort) #test de tendance : significatif donc il existe bien une tendance D_additif1 = decompose(cmort, "additive") plot(D_additif1) D_additif2 = stl(cmort, "periodic") plot(D_additif2) D_multiplicatif = decompose(cmort, "multiplicative") plot(D_multiplicatif) Temporalité dans les données de santé 09.01.2018
∞ temps — Exemple Méthode de décomposition Recomposer le signal avec et sans bruit #Fonction permettant d’avoir le graphique graph = function(var){ plot(var, lwd = 2, col = "#FFC000", main = substitute(var)) lines(cmort,lty = 2) } cmort_ad1 = D_additif1$trend + D_additif1$seasonal + D_additif1$random graph(cmort_ad1) cmort_ad1_ssrandom = D_additif1$trend + D_additif1$seasonal graph(cmort_ad1_ssrandom) Temporalité dans les données de santé 09.01.2018
∞ temps — Technique Autocorrélation et Modélisation Autocorrélation partielle : Corrélation de la série entre 𝑌 𝑡 et 𝑌 𝑡−𝑘 en retirant l’influence des variables ( 𝑌 𝑡−1 , 𝑌 𝑡−2 ,… 𝑌 𝑡−𝑘+1 ) Autocorrélation : Corrélation de la série avec elle-même décalé de k périodes (Corr( 𝑌 𝑡 , 𝑌 𝑡−𝑘 )) acf(cmort) pacf(cmort) Temporalité dans les données de santé 09.01.2018
∞ temps — Technique Autocorrélation et Modélisation Pour pouvoir faire une prévision, il est nécessaire de modéliser une série temporelle. Différentes modélisations sont possibles. Pour déterminer le modèle adéquate on se repose sur les propriétés de la série et sur les autocorrélogrammes Processus AR Processus MA Processus ARMA (stationnaire, sans saisonnalité) Processus SARMA (stationnaire, avec saisonnalité) Processus ARIMA (non stationnaire, sans saisonnalité) Processus SARIMA (non stationnaire, avec saisonnalité) Processus ARCH …. Temporalité dans les données de santé 09.01.2018
∞ temps — Exemple Autocorrélation et Modélisation Temporalité dans les données de santé 09.01.2018
∞ temps — Technique Analyse spectrale Détermination de la période : autocorrélation ou périodogramme de Fourrier Fréquence = 0.01953125 Période Période Temporalité dans les données de santé 09.01.2018
∞ temps — Technique Analyse spectrale Lissage par moyenne glissante Lissage par noyaux Temporalité dans les données de santé 09.01.2018
∞ temps — Exemple Analyse spectrale Déterminer la période de la série cmort Tracer le lissage par moyenne mobile p = periodogram(cmort) Periode = 1/p$freq[which.max(p$spec)] plot(cmort, ylab = "cmort", main = "Lissage par moyenne glissante") lines(filter(cmort, rep(1/20, 20), side = 1), col = "#FFC000", lwd = 2) lines(filter(cmort, rep(1/12, 12), side = 1), col = "red", lwd = 2) lines(filter(cmort, rep(1/50, 50), side = 1), col = "indianred4", lwd = 2) legend("topright", col = c("red", "#FFC000", "indianred4"), legend = c("1/12", "1/20", "1/100"), lwd = c(2,2,2)) Temporalité dans les données de santé 09.01.2018
∞ temps — Exemple Analyse spectrale Tracer les lissages par noyau k1 <- kernel("daniell", 10) k2 <- kernel("daniell", 5) k3 <- kernel("daniell", 30) x1 <- kernapply(cmort, k1) x2 <- kernapply(cmort, k2) x3 <- kernapply(cmort, k3) plot(cmort, main = "Lissage par noyaux") lines(x1, col = "#FFC000", lwd = 2) lines(x2, col = "red", lwd = 2) lines(x3, col = "indianred4", lwd = 2) legend("topright", col = c("red", "#FFC000", "indianred4"), legend = c("5", "10", "30"), lwd = c(2,2,2)) Temporalité dans les données de santé 09.01.2018
∞ temps — Technique Série temporelle multiple Test de Granger : Causalité au sens de Granger On veux savoir si la variable Y1 cause la variable Y2 ie si la connaissance des valeurs passées de Y1 peut améliorer la prévision de Y2. Temporalité dans les données de santé 09.01.2018
∞ temps — Exemple Analyse spectrale Tester la causalité entre les données cmort et des données environnementales grangertest(cmort ~ lap[,4]) #Température grangertest(cmort ~ lap[,5]) #Humidité relative grangertest(cmort ~ lap[,6]) #Monoxyde de carbone grangertest(cmort ~ lap[,7]) #Dioxyde de soufre grangertest(cmort ~ lap[,8]) #Dioxyde d'azote grangertest(cmort ~ lap[,9]) #Hydrocarbure grangertest(cmort ~ lap[,10]) #Ozone grangertest(cmort ~ lap[,11]) #Particule Temporalité dans les données de santé 09.01.2018
Merci de votre attention ! maximewack@free.fr www.maximewack.com @wack_maxime https://github.com/MaximeWack