Étude Cas-témoin réalisée chez 449 femmes: Analyse et interprétation

Description

Les données suivantes sont issues d’une enquête cas-témoins dont le but était d’évaluer l’existence d’un risque plus élevé de survenue d’un infarctus du myocarde chez les femmes qui utilisent ou ont utilisé des contraceptifs oraux. L’étude a été menée auprès de 149 femmes ayant eu un infarctus du myocarde (cas) et 300 femmes n’en ayant pas eu (témoins). Le facteur d’exposition principal est la prise de contraceptifs oraux, les autres facteurs recueillis sont : l’âge, le poids, la taille, la consommation de tabac, l’hypertension artérielle, les antécédents familiaux de maladies cardio-vasculaires.

L’analyse a été faite avec le logiciel R version 4.6.0 2026. Dédié aux usagers de R, ce document a été rédigé en vue d’une découverte approfondie des différentes manières de l’usage des codes aussi simples et rapides pour une analyse équipée et fiable. Les interprétations sont l’objet d’aide aux débutants en analyse de données pour une compréhension rapide et classique des données en R.

Chargement de chaque paquet

library(rmdformats)
library(readxl)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(gtsummary)
library(gt)
library(epitools)
library(ggstats)
library(mice)
## 
## Attaching package: 'mice'
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following objects are masked from 'package:base':
## 
##     cbind, rbind
library(labelled)
library(questionr)
## 
## Attaching package: 'questionr'
## 
## The following object is masked from 'package:ggstats':
## 
##     ggsurvey

Importation de la base de donnée infarctus

INFARCTUS_M <- read_excel("D:/ENATSE 2/Logiciel R/Analyse_infarctus_26/Infarct (1).xls")

Transformation des points (.) en NA.

La base de données utilisée est particulière et comporte des données manquantes remplacées par des points. Le logiciel R considère donc les points comme des données. Ce qui nous pousse à préciser à R de considérer et transformer ces points en NA (son language de considération des données manquantes).

INFARCTUS_M[INFARCTUS_M =="."]<-NA

Visualisation de la base

Il faut donc visualiser la base pour vérifier si les modifications concernant les <<NA>> sont appliquées à la base.

View(INFARCTUS_M)

Structuration de la base de donnée

str(INFARCTUS_M)
## tibble [449 × 10] (S3: tbl_df/tbl/data.frame)
##  $ NUMERO : num [1:449] 1 2 3 4 5 6 7 8 9 10 ...
##  $ INFARCT: num [1:449] 0 0 0 0 0 0 0 0 0 0 ...
##  $ CO     : num [1:449] 0 0 0 0 0 0 0 0 0 0 ...
##  $ TABAC  : num [1:449] 0 0 0 0 0 0 0 0 0 0 ...
##  $ AGE    : num [1:449] 47 17 35 82 50 31 60 30 44 38 ...
##  $ POIDS  : chr [1:449] "48" NA "53" "78" ...
##  $ TAILLE : num [1:449] 173 162 163 157 172 184 169 174 164 167 ...
##  $ IMC    : chr [1:449] "16.037956237792969" NA "19.94805908203125" "31.644285202026367" ...
##  $ ATCD   : chr [1:449] "0" "0" "0" "0" ...
##  $ HTA    : num [1:449] 0 0 0 0 0 0 0 0 0 0 ...

Recodage de la base

  • Recoding INFARCTUS_M$INFARCT
INFARCTUS_M$INFARCT <- as.character(INFARCTUS_M$INFARCT)
INFARCTUS_M$INFARCT[INFARCTUS_M$INFARCT == "0"] <- "Témoins"
INFARCTUS_M$INFARCT[INFARCTUS_M$INFARCT == "1"] <- "Cas"
  • Recoding INFARCTUS_M$CO
INFARCTUS_M$CO <- as.character(INFARCTUS_M$CO)
INFARCTUS_M$CO[INFARCTUS_M$CO == "0"] <- "Jamais"
INFARCTUS_M$CO[INFARCTUS_M$CO == "1"] <- "Oui"
  • Recoding INFARCTUS_M$TABAC
INFARCTUS_M$TABAC <- as.character(INFARCTUS_M$TABAC)
INFARCTUS_M$TABAC[INFARCTUS_M$TABAC == "0"] <- "Non"
INFARCTUS_M$TABAC[INFARCTUS_M$TABAC == "1"] <- "Fumeuse actuelle"
INFARCTUS_M$TABAC[INFARCTUS_M$TABAC == "2"] <- "Ancienne fumeuse"
  • Recoding INFARCTUS_M$HTA
INFARCTUS_M$HTA <- as.character(INFARCTUS_M$HTA)
INFARCTUS_M$HTA[INFARCTUS_M$HTA == "0"] <- "Non"
INFARCTUS_M$HTA[INFARCTUS_M$HTA == "1"] <- "Oui"
  • Recoding INFARCTUS_M$ATCD
INFARCTUS_M$ATCD <- INFARCTUS_M$ATCD |>
  fct_recode(
    "Non" = "0",
    "Oui" = "1"
  )
  • Recoding INFARCTUS_M$POIDS
INFARCTUS_M$POIDS <- as.numeric(INFARCTUS_M$POIDS)
  • Recoding INFARCTUS_M$IMC
INFARCTUS_M$IMC <- as.numeric(INFARCTUS_M$IMC)
  • Reordering INFARCTUS_M$INFARCT
INFARCTUS_M$INFARCT <- INFARCTUS_M$INFARCT |>
  fct_relevel(
    "Témoins", "Cas"
  )
  • Reordering INFARCTUS_M$TABAC
INFARCTUS_M$TABAC <- INFARCTUS_M$TABAC |>
  fct_relevel(
    "Non", "Ancienne fumeuse", "Fumeuse actuelle"
  )

Tranformation des variables qualitatives (“charactere”) en des facteurs

INFARCTUS_M = INFARCTUS_M %>% mutate(across(where(is.character),as.factor))

str(INFARCTUS_M)
## tibble [449 × 10] (S3: tbl_df/tbl/data.frame)
##  $ NUMERO : num [1:449] 1 2 3 4 5 6 7 8 9 10 ...
##  $ INFARCT: Factor w/ 2 levels "Témoins","Cas": 1 1 1 1 1 1 1 1 1 1 ...
##  $ CO     : Factor w/ 2 levels "Jamais","Oui": 1 1 1 1 1 1 1 1 1 1 ...
##  $ TABAC  : Factor w/ 3 levels "Non","Ancienne fumeuse",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ AGE    : num [1:449] 47 17 35 82 50 31 60 30 44 38 ...
##  $ POIDS  : num [1:449] 48 NA 53 78 52 47 60 75 68 NA ...
##  $ TAILLE : num [1:449] 173 162 163 157 172 184 169 174 164 167 ...
##  $ IMC    : num [1:449] 16 NA 19.9 31.6 17.6 ...
##  $ ATCD   : Factor w/ 2 levels "Non","Oui": 1 1 1 1 NA 1 1 1 1 1 ...
##  $ HTA    : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...

Recherche des valeurs manquantes

summary(INFARCTUS_M)
##      NUMERO       INFARCT         CO                   TABAC    
##  Min.   :  1   Témoins:300   Jamais:249   Non             :215  
##  1st Qu.:113   Cas    :149   Oui   :200   Ancienne fumeuse: 99  
##  Median :225                              Fumeuse actuelle:135  
##  Mean   :225                                                    
##  3rd Qu.:337                                                    
##  Max.   :449                                                    
##                                                                 
##       AGE             POIDS            TAILLE           IMC         ATCD    
##  Min.   : 15.00   Min.   : 33.00   Min.   :138.0   Min.   :11.36   Non:389  
##  1st Qu.: 33.00   1st Qu.: 51.00   1st Qu.:160.0   1st Qu.:18.67   Oui: 53  
##  Median : 44.00   Median : 64.00   Median :166.0   Median :23.18   NAs:  7  
##  Mean   : 45.62   Mean   : 66.07   Mean   :165.2   Mean   :24.38            
##  3rd Qu.: 56.00   3rd Qu.: 79.00   3rd Qu.:171.0   3rd Qu.:29.17            
##  Max.   :100.00   Max.   :128.00   Max.   :184.0   Max.   :47.78            
##                   NAs    :12                       NAs    :12               
##   HTA     
##  Non:290  
##  Oui:159  
##           
##           
##           
##           
## 

Imputation des données manquantes

INFARCT_imp=mice(INFARCTUS_M,method = c("","","","","","norm","", "norm","logreg",""),m=5)  
## 
##  iter imp variable
##   1   1  POIDS  IMC  ATCD
##   1   2  POIDS  IMC  ATCD
##   1   3  POIDS  IMC  ATCD
##   1   4  POIDS  IMC  ATCD
##   1   5  POIDS  IMC  ATCD
##   2   1  POIDS  IMC  ATCD
##   2   2  POIDS  IMC  ATCD
##   2   3  POIDS  IMC  ATCD
##   2   4  POIDS  IMC  ATCD
##   2   5  POIDS  IMC  ATCD
##   3   1  POIDS  IMC  ATCD
##   3   2  POIDS  IMC  ATCD
##   3   3  POIDS  IMC  ATCD
##   3   4  POIDS  IMC  ATCD
##   3   5  POIDS  IMC  ATCD
##   4   1  POIDS  IMC  ATCD
##   4   2  POIDS  IMC  ATCD
##   4   3  POIDS  IMC  ATCD
##   4   4  POIDS  IMC  ATCD
##   4   5  POIDS  IMC  ATCD
##   5   1  POIDS  IMC  ATCD
##   5   2  POIDS  IMC  ATCD
##   5   3  POIDS  IMC  ATCD
##   5   4  POIDS  IMC  ATCD
##   5   5  POIDS  IMC  ATCD

Actualiser la base de données

INFARCTUS_M=complete(INFARCT_imp)
Structure enfin de la base
str(INFARCTUS_M)
## 'data.frame':    449 obs. of  10 variables:
##  $ NUMERO : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ INFARCT: Factor w/ 2 levels "Témoins","Cas": 1 1 1 1 1 1 1 1 1 1 ...
##  $ CO     : Factor w/ 2 levels "Jamais","Oui": 1 1 1 1 1 1 1 1 1 1 ...
##  $ TABAC  : Factor w/ 3 levels "Non","Ancienne fumeuse",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ AGE    : num  47 17 35 82 50 31 60 30 44 38 ...
##  $ POIDS  : num  48 34 53 78 52 ...
##  $ TAILLE : num  173 162 163 157 172 184 169 174 164 167 ...
##  $ IMC    : num  16 12.6 19.9 31.6 17.6 ...
##  $ ATCD   : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
##  $ HTA    : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...

Mettre ou arrondir les valeurs de la variable POIDS et IMC à deux chiffres àprès la virgule

INFARCTUS_M$POIDS = round(INFARCTUS_M$POIDS, digits = 2)

INFARCTUS_M$IMC = round(INFARCTUS_M$IMC, digits = 2)
Etiquettage de chaque variable
var_label(INFARCTUS_M) <- list(
                        NUMERO       =          "Numéro",
                        INFARCT      =          "Infarctus du myocarde",
                        CO           =          "Prise de contraceptifs oraux",
                        TABAC        =          "Consommation de tabac",
                        AGE          =          "Age (en année)",
                        POIDS        =          "Poids (Kg)",
                        TAILLE       =          "Taille (Cm)",
                        ATCD         =          "Antécédents familiaux de maladie cardio-vasculaire",
                        HTA          =          "Hypertension artérielle",
                        IMC          =          "Indice de masse corporelle")

Vérification de la distribution

  • Test de shapiro wilk et vérification graphique de la normalité
## Normalité de l'âge
shapiro.test(INFARCTUS_M$AGE)
## 
##  Shapiro-Wilk normality test
## 
## data:  INFARCTUS_M$AGE
## W = 0.97955, p-value = 5.89e-06
qqnorm(INFARCTUS_M$AGE)
qqline(INFARCTUS_M$AGE)

## Normalité du poids des femmes
shapiro.test(INFARCTUS_M$POIDS)
## 
##  Shapiro-Wilk normality test
## 
## data:  INFARCTUS_M$POIDS
## W = 0.96476, p-value = 6.605e-09
qqnorm(INFARCTUS_M$POIDS)
qqline(INFARCTUS_M$POIDS)

## Normalité de la taille des femmes
shapiro.test(INFARCTUS_M$TAILLE)
## 
##  Shapiro-Wilk normality test
## 
## data:  INFARCTUS_M$TAILLE
## W = 0.99012, p-value = 0.00413
qqnorm(INFARCTUS_M$TAILLE)
qqline(INFARCTUS_M$TAILLE)

## Normalité de l'IMC
shapiro.test(INFARCTUS_M$IMC)
## 
##  Shapiro-Wilk normality test
## 
## data:  INFARCTUS_M$IMC
## W = 0.95469, p-value = 1.639e-10
qqnorm(INFARCTUS_M$IMC)
qqline(INFARCTUS_M$IMC)

Statistique descriptive

R=theme_gtsummary_language(language ="fr",decimal.mark = ",",big.mark = " ")
## Setting theme "language: fr"
TBL <- tbl_summary(INFARCTUS_M,include = -NUMERO,
                   statistic = list(all_categorical() ~ "{n} ({p})"),                 
                   digits=list(
                     all_categorical()~ c(0,1)
                     
                   )) %>%
  modify_header(label="**Variables**")%>%
  modify_caption("**Tableau 1:** Description des variables en étude ") %>% 
  bold_labels()%>%
  as_flex_table()
  
TBL
**Tableau 1:** Description des variables en étude

Variables

N = 4491

Infarctus du myocarde

Témoins

300 (66,8)

Cas

149 (33,2)

Prise de contraceptifs oraux

Jamais

249 (55,5)

Oui

200 (44,5)

Consommation de tabac

Non

215 (47,9)

Ancienne fumeuse

99 (22,0)

Fumeuse actuelle

135 (30,1)

Age (en année)

44 (33 – 56)

Poids (Kg)

64 (51 – 79)

Taille (Cm)

166 (160 – 171)

Indice de masse corporelle

23 (19 – 29)

Antécédents familiaux de maladie cardio-vasculaire

Non

395 (88,0)

Oui

54 (12,0)

Hypertension artérielle

Non

290 (64,6)

Oui

159 (35,4)

1n (%); Médiane (Q1 – Q3)

  • Description des variables qualitatives
TBL1 <- tbl_summary(INFARCTUS_M,include = c(INFARCT,CO,TABAC,ATCD,
                                           HTA),
                   statistic = list(all_categorical() ~ "{n} ({p})"),                 
                   digits=list(
                     all_categorical()~ c(0,1)
                     
                   )) %>%
  modify_header(label="**Variables**")%>%
  bold_labels()%>%
  modify_caption("**Tableau 2:** Répartition des variables qualitatives")
Répartition des variables qualitatives (une présentation avec le paquet gt)
  • Transformer le tableau en format data frame et gérer les NA
# Transformer le tableau en format data frame et gérer les NA
TBL1_df <- TBL1$table_body %>%
  select(label, stat_0) %>%
  separate(stat_0, into = c("Effectif", "Pourcentage"),
           sep = "\\(", extra = "drop", fill = "right") %>%
  mutate(
    Pourcentage = gsub("\\)", "", Pourcentage),
    Effectif = ifelse(is.na(Effectif), " ", Effectif),  
    Pourcentage = ifelse(is.na(Pourcentage), " ", Pourcentage)  
  )
## Ajout de l'effectif total
n_total <- nrow(INFARCTUS_M)
# Reformater le tableau avec gt

gt_TBL1 <- TBL1_df %>%
  bind_rows(tibble(
    label       = "Total",
    Effectif    = as.character(n_total),
    Pourcentage = "100,0"
  )) %>% 
  gt() %>%
  cols_label(
    label = "Variables",
    Effectif = "Fréquence absolue",
    Pourcentage = "Fréquence relative (%)"
  ) %>%
  fmt_number(columns = "Pourcentage", decimals = 1) %>%
  tab_options(
    table.font.size = px(14),
    column_labels.font.weight = "bold"
  )

# Affichage du tableau
gt_TBL1
Variables Fréquence absolue Fréquence relative (%)
Infarctus du myocarde
Témoins 300 66,8
Cas 149 33,2
Prise de contraceptifs oraux
Jamais 249 55,5
Oui 200 44,5
Consommation de tabac
Non 215 47,9
Ancienne fumeuse 99 22,0
Fumeuse actuelle 135 30,1
Antécédents familiaux de maladie cardio-vasculaire
Non 395 88,0
Oui 54 12,0
Hypertension artérielle
Non 290 64,6
Oui 159 35,4
Total 449 100,0
  • Description graphique des variables
ggplot(INFARCTUS_M) +
  aes(x = "", y = AGE) +
  geom_boxplot(fill = "#4271C6") +
  stat_summary(fun = mean, geom = "point", shape = 20, size = 4, color = "red") +
  labs(
    x = "Échantillon",
    y = "Âge des femmes en années",
    title = "Boxplot de l'âge des femmes incluses dans l'étude (n=449)"
  ) +
  theme_bw() +
  theme(
    plot.title = element_text(size = 16L, face = "bold.italic", hjust = 0.5),
    axis.title.y = element_text(size = 14L, face = "bold.italic"),
    axis.title.x = element_text(size = 14L, face = "bold.italic"),
    axis.text.x = element_text(angle = 4L)
  )

ggplot(INFARCTUS_M) +
  aes(x = "", y = POIDS) +
  geom_boxplot(fill = "#3664B7") +
  stat_summary(fun = mean, geom = "point", shape = 20, size = 4, color = "red") +
  labs(
    x = "Échantillon ",
    y = "Poids des femmes en Kg",
    title = "Boxpplot du poids des femmes (n=449)"
  ) +
  theme_bw() +
  theme(
    plot.title = element_text(size = 16L,
                              face = "bold.italic",
                              hjust = 0.5),
    axis.title.y = element_text(size = 14L,
                                face = "bold.italic"),
    axis.title.x = element_text(size = 14L,
                                face = "bold.italic")
  )

ggplot(INFARCTUS_M) +
  aes(x = "", y = TAILLE) +
  geom_boxplot(fill = "#456FB9") +
  stat_summary(fun = mean, geom = "point", shape = 20, size = 4, color = "red") +
  labs(
    x = "Échantillon ",
    y = "Taille des femmes en cm",
    title = "Boxplot de la taille des femmes (n= 449)"
  ) +
  theme_bw() +
  theme(
    plot.title = element_text(size = 16L,
                              face = "bold.italic",
                              hjust = 0.5),
    axis.title.y = element_text(size = 14L,
                                face = "bold.italic"),
    axis.title.x = element_text(size = 14L,
                                face = "bold.italic")
  )

Analyse bivariée

tbl_summary(INFARCTUS_M,include = -NUMERO,
statistic = list(all_categorical() ~ "{n} ({p})"
                 ),
digits=list(
  all_categorical()~ c(0,1),
  all_continuous() ~ 1
),by=INFARCT)%>%
  add_overall(last=T,col_label= "**Total** N= {N}")%>% 
  add_p()%>%
  bold_p()%>%
  bold_labels() %>% 
  modify_header(
    list(
      label ~ "**Variables**",
      all_stat_cols() ~ "**_{level}_** (n={n}, {style_percent(p)}%)",
      stat_0 ~ "**TOTAL** (N={N})",p.value~"**Test de comparaison** (p-valeur)"
    )
  ) %>%
  modify_footnote(everything() ~ NA) %>%
  modify_spanning_header(all_stat_cols() ~ "**Infarctus du myocarde**")%>%
  modify_caption("Tableau 3: Facteurs associés à l'infarctus de myocarde chez les femmes (analyse bivariée)" 
  
)%>%
  as_flex_table()
## Warning: The `update` argument of `modify_header()` is deprecated as of gtsummary 2.0.0.
## ℹ Use `modify_header(...)` input instead. Dynamic dots allow for syntax like
##   `modify_header(!!!list(...))`.
## ℹ The deprecated feature was likely used in the gtsummary package.
##   Please report the issue at <https://github.com/ddsjoberg/gtsummary/issues>.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Tableau 3: Facteurs associés à l'infarctus de myocarde chez les femmes (analyse bivariée)

Infarctus du myocarde

Variables

**Témoins** (n=300, 67%)

**Cas** (n=149, 33%)

TOTAL (N=449)

Test de comparaison (p-valeur)

Prise de contraceptifs oraux

<0,001

Jamais

212 (70,7)

37 (24,8)

249 (55,5)

Oui

88 (29,3)

112 (75,2)

200 (44,5)

Consommation de tabac

<0,001

Non

181 (60,3)

34 (22,8)

215 (47,9)

Ancienne fumeuse

44 (14,7)

55 (36,9)

99 (22,0)

Fumeuse actuelle

75 (25,0)

60 (40,3)

135 (30,1)

Age (en année)

43,5 (31,5 – 55,5)

46,0 (36,0 – 56,0)

44,0 (33,0 – 56,0)

0,2

Poids (Kg)

61,0 (50,0 – 74,3)

69,0 (58,0 – 83,0)

64,0 (51,0 – 79,0)

<0,001

Taille (Cm)

166,0 (159,5 – 170,0)

164,0 (160,0 – 171,0)

166,0 (160,0 – 171,0)

0,4

Indice de masse corporelle

21,7 (18,1 – 28,4)

25,5 (20,9 – 31,6)

23,2 (18,7 – 29,2)

<0,001

Antécédents familiaux de maladie cardio-vasculaire

0,12

Non

269 (89,7)

126 (84,6)

395 (88,0)

Oui

31 (10,3)

23 (15,4)

54 (12,0)

Hypertension artérielle

0,019

Non

205 (68,3)

85 (57,0)

290 (64,6)

Oui

95 (31,7)

64 (43,0)

159 (35,4)

Autre méthode pour la préparation de l’analyse multivariée
tbl_uvregression(
  data = INFARCTUS_M,
  include = -NUMERO,
  y = INFARCT,
  method = glm,
  method.args = list(family = binomial),
  exponentiate = TRUE,
  add_estimate_to_reference_rows = TRUE
) %>%
  add_global_p() %>% 
  bold_p() %>% 
  modify_header(label="**Variables**",p.value= "**p**") %>% 
  as_flex_table()

Variables

N

OR

95% IC

p

Prise de contraceptifs oraux

449

<0,001

Jamais

1,00

Oui

7,29

4,70 – 11,5

Consommation de tabac

449

<0,001

Non

1,00

Ancienne fumeuse

6,65

3,91 – 11,5

Fumeuse actuelle

4,26

2,60 – 7,08

Age (en année)

449

1,01

1,00 – 1,02

0,2

Poids (Kg)

449

1,02

1,01 – 1,03

<0,001

Taille (Cm)

449

0,99

0,97 – 1,02

0,5

Indice de masse corporelle

449

1,06

1,03 – 1,09

<0,001

Antécédents familiaux de maladie cardio-vasculaire

449

0,12

Non

1,00

Oui

1,58

0,88 – 2,82

Hypertension artérielle

449

0,019

Non

1,00

Oui

1,62

1,08 – 2,44

Abréviations: IC = intervalle de confiance, OR = rapport de cotes

Une application avec epitools pour croiser la variable explicative principale (CO) avec l’événement (INFARCT)
table(INFARCTUS_M$CO,INFARCTUS_M$INFARCT)
##         
##          Témoins Cas
##   Jamais     212  37
##   Oui         88 112
oddsratio(table(INFARCTUS_M$CO,INFARCTUS_M$INFARCT))
## $data
##         
##          Témoins Cas Total
##   Jamais     212  37   249
##   Oui         88 112   200
##   Total      300 149   449
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate    lower    upper
##   Jamais 1.000000       NA       NA
##   Oui    7.238001 4.664499 11.44983
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact   chi.square
##   Jamais         NA           NA           NA
##   Oui             0 1.688545e-20 3.532887e-20
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
table(INFARCTUS_M$TABAC,INFARCTUS_M$INFARCT)
##                   
##                    Témoins Cas
##   Non                  181  34
##   Ancienne fumeuse      44  55
##   Fumeuse actuelle      75  60
oddsratio(table(INFARCTUS_M$TABAC,INFARCTUS_M$INFARCT))
## $data
##                   
##                    Témoins Cas Total
##   Non                  181  34   215
##   Ancienne fumeuse      44  55    99
##   Fumeuse actuelle      75  60   135
##   Total                300 149   449
## 
## $measure
##                   odds ratio with 95% C.I.
##                    estimate    lower     upper
##   Non              1.000000       NA        NA
##   Ancienne fumeuse 6.590283 3.864550 11.439918
##   Fumeuse actuelle 4.231345 2.580375  7.041255
## 
## $p.value
##                   two-sided
##                      midp.exact fisher.exact   chi.square
##   Non                        NA           NA           NA
##   Ancienne fumeuse 1.610267e-12 2.434653e-12 3.859372e-13
##   Fumeuse actuelle 6.727606e-09 7.085207e-09 4.040132e-09
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Corrélation entre les variables
ggplot(INFARCTUS_M) +
 aes(x = AGE, y = TAILLE) +
 geom_point(size = 2.15, colour = "#112446") +
 labs(x = "Âge des femmes en années", 
 y = "Taille en cm", title = "Relation entre l'âge et la taille ") +
 theme_classic() +
 theme(plot.title = element_text(size = 15L, 
 face = "bold", hjust = 0.5), axis.title.y = element_text(size = 13L, face = "bold.italic", hjust = 1), 
 axis.title.x = element_text(size = 13L, face = "bold.italic", hjust = 1))

Cor_spearman1 = cor(INFARCTUS_M$AGE, INFARCTUS_M$TAILLE, method = "spearman")

Cor_spearman1 
## [1] -0.06836811
ggplot(INFARCTUS_M) +
 aes(x = AGE, y = POIDS) +
 geom_point(size = 2.2, colour = "#112446") +
 labs(x = "Âge des femmes", 
 y = "Poids en kg", title = "Relation entre l'âge et le poids chez les femmes ") +
 theme_classic() +
 theme(plot.title = element_text(size = 15L, face = "bold", hjust = 0.5), axis.title.y = element_text(size = 13L, 
 face = "bold.italic", hjust = 1), axis.title.x = element_text(size = 13L, face = "bold.italic", 
 hjust = 1))

Cor_spearman2 = cor(INFARCTUS_M$AGE, INFARCTUS_M$POIDS, method = "spearman")

Cor_spearman2
## [1] 0.1095422

Analyse multivariée

## Le modèle 

mod = glm(
  INFARCT ~ CO+AGE+TABAC+HTA+POIDS+ATCD+TAILLE,
  family = binomial,data = INFARCTUS_M
)

mod
## 
## Call:  glm(formula = INFARCT ~ CO + AGE + TABAC + HTA + POIDS + ATCD + 
##     TAILLE, family = binomial, data = INFARCTUS_M)
## 
## Coefficients:
##           (Intercept)                  COOui                    AGE  
##              -5.12233                2.54818                0.05019  
## TABACAncienne fumeuse  TABACFumeuse actuelle                 HTAOui  
##               2.47154                2.14310                0.49447  
##                 POIDS                ATCDOui                 TAILLE  
##               0.02130                0.49028               -0.01372  
## 
## Degrees of Freedom: 448 Total (i.e. Null);  440 Residual
## Null Deviance:       570.7 
## Residual Deviance: 379.5     AIC: 397.5
tbl_regression(mod, 
               exponentiate = T,
               add_estimate_to_reference_rows = TRUE
               )%>%
  bold_labels() %>%
  bold_p()%>%
  italicize_levels()%>%
  modify_header(label="**Variables**",p.value= "**p**")%>%
  modify_footnote(everything() ~ NA)%>%
  remove_abbreviation(abbreviation = NULL)%>%
  modify_caption("Tableau 4: Facteurs associés à l'infarctus de myocarde chez les femmes (analyse multivariée)" )%>%
  as_flex_table()
Tableau 4: Facteurs associés à l'infarctus de myocarde chez les femmes (analyse multivariée)

Variables

OR

95% IC

p

Prise de contraceptifs oraux

Jamais

1,00

Oui

12,8

7,30 – 23,3

<0,001

Age (en année)

1,05

1,03 – 1,07

<0,001

Consommation de tabac

Non

1,00

Ancienne fumeuse

11,8

5,67 – 25,9

<0,001

Fumeuse actuelle

8,53

4,51 – 16,8

<0,001

Hypertension artérielle

Non

1,00

Oui

1,64

0,91 – 2,97

0,10

Poids (Kg)

1,02

1,01 – 1,04

0,004

Antécédents familiaux de maladie cardio-vasculaire

Non

1,00

Oui

1,63

0,78 – 3,42

0,2

Taille (Cm)

0,99

0,96 – 1,02

0,4

  • Graphiques
ggcoef_model(mod,exponentiate = T)

ggcoef_table(mod,exponentiate = T)

Plus d’information après discrétisation en classe d’âge

# Création de la variable classe d'âge
INFARCTUS_M <- mutate(INFARCTUS_M,
                       CLASSE_AGE= 
                         case_when(AGE >=  15  &   AGE <= 49   ~  "15-49",
                                   AGE >=  50  &   AGE <= 100  ~  "50-100"
                          )
                      )

### Transformation de la nature de la variable CLASSE_AGE en facteur et labellisation

INFARCTUS_M$CLASSE_AGE = as.factor(INFARCTUS_M$CLASSE_AGE)

var_label(INFARCTUS_M) <- list(
  NUMERO       =          "Numéro",
  INFARCT      =          "Infarctus du myocarde",
  CO           =          "Prise de contraceptifs oraux",
  TABAC        =          "Consommation de tabac",
  AGE          =          "Age (en année)",
  POIDS        =          "Poids (Kg)",
  TAILLE       =          "Taille (Cm)",
  ATCD         =          "Antécédents familiaux de maladie cardio-vasculaire",
  HTA          =          "Hypertension artérielle",
  IMC          =          "Indice de masse corporelle",
  CLASSE_AGE   =          "Classe d'âge")

Analyse bivariée tenant compte de la classe d’âge

tbl_summary(INFARCTUS_M,include = -c(NUMERO,AGE),
            statistic = list(all_categorical() ~ "{n} ({p})"
            ),
            digits=list(
              all_categorical()~ c(0,1),
              all_continuous() ~ 1
            ),by=INFARCT)%>%
  add_overall(last=T,col_label= "**Total** N= {N}")%>% 
  add_p()%>%
  bold_p()%>%
  bold_labels() %>% 
  modify_header(
    list(
      label ~ "**Variables**",
      all_stat_cols() ~ "**_{level}_** (n={n}, {style_percent(p)}%)",
      stat_0 ~ "**TOTAL** (N={N})",p.value~"**Test de comparaison** (p-valeur)"
    )
  ) %>%
  modify_footnote(everything() ~ NA) %>%
  modify_spanning_header(all_stat_cols() ~ "**Infarctus du myocarde**")%>%
  modify_caption("Tableau 5: Facteurs associés à l'infarctus de myocarde chez les femmes (analyse bivariée)" 
                 
  )%>%
  as_flex_table()
Tableau 5: Facteurs associés à l'infarctus de myocarde chez les femmes (analyse bivariée)

Infarctus du myocarde

Variables

**Témoins** (n=300, 67%)

**Cas** (n=149, 33%)

TOTAL (N=449)

Test de comparaison (p-valeur)

Prise de contraceptifs oraux

<0,001

Jamais

212 (70,7)

37 (24,8)

249 (55,5)

Oui

88 (29,3)

112 (75,2)

200 (44,5)

Consommation de tabac

<0,001

Non

181 (60,3)

34 (22,8)

215 (47,9)

Ancienne fumeuse

44 (14,7)

55 (36,9)

99 (22,0)

Fumeuse actuelle

75 (25,0)

60 (40,3)

135 (30,1)

Poids (Kg)

61,0 (50,0 – 74,3)

69,0 (58,0 – 83,0)

64,0 (51,0 – 79,0)

<0,001

Taille (Cm)

166,0 (159,5 – 170,0)

164,0 (160,0 – 171,0)

166,0 (160,0 – 171,0)

0,4

Indice de masse corporelle

21,7 (18,1 – 28,4)

25,5 (20,9 – 31,6)

23,2 (18,7 – 29,2)

<0,001

Antécédents familiaux de maladie cardio-vasculaire

0,12

Non

269 (89,7)

126 (84,6)

395 (88,0)

Oui

31 (10,3)

23 (15,4)

54 (12,0)

Hypertension artérielle

0,019

Non

205 (68,3)

85 (57,0)

290 (64,6)

Oui

95 (31,7)

64 (43,0)

159 (35,4)

Classe d'âge

0,7

15-49

186 (62,0)

95 (63,8)

281 (62,6)

50-100

114 (38,0)

54 (36,2)

168 (37,4)

Autre méthode pour la préparation de l’analyse multivariée (2)

tbl_uvregression(
  data = INFARCTUS_M,
  include = -c(NUMERO,AGE),
  y = INFARCT,
  method = glm,
  method.args = list(family = binomial),
  exponentiate = TRUE,
  add_estimate_to_reference_rows = TRUE
) %>%
  add_global_p() %>% 
  bold_p() %>% 
  modify_header(label="**Variables**",p.value= "**p**") %>% 
  as_flex_table()

Variables

N

OR

95% IC

p

Prise de contraceptifs oraux

449

<0,001

Jamais

1,00

Oui

7,29

4,70 – 11,5

Consommation de tabac

449

<0,001

Non

1,00

Ancienne fumeuse

6,65

3,91 – 11,5

Fumeuse actuelle

4,26

2,60 – 7,08

Poids (Kg)

449

1,02

1,01 – 1,03

<0,001

Taille (Cm)

449

0,99

0,97 – 1,02

0,5

Indice de masse corporelle

449

1,06

1,03 – 1,09

<0,001

Antécédents familiaux de maladie cardio-vasculaire

449

0,12

Non

1,00

Oui

1,58

0,88 – 2,82

Hypertension artérielle

449

0,019

Non

1,00

Oui

1,62

1,08 – 2,44

Classe d'âge

449

0,7

15-49

1,00

50-100

0,93

0,62 – 1,39

Abréviations: IC = intervalle de confiance, OR = rapport de cotes

Relation entre les variables

## CLASSE_AGE - POIDS

ggplot(INFARCTUS_M) +
 aes(x = CLASSE_AGE, y = POIDS, fill = CLASSE_AGE) +
 geom_boxplot() +
 stat_summary(fun = mean, geom = "point", shape = 20, size = 4, color = "red")+
 scale_fill_hue(direction = 1) +
 labs(x = "Classe d'âge ", y = "Poids (Kg)", title = "Distibution du poids des femmes selon la classe d'âge") +
 theme_classic() +
 theme(plot.title = element_text(size = 16L, face = "bold", hjust = 0.5), axis.title.y = element_text(size = 13L, 
 face = "bold.italic", hjust = 1), axis.title.x = element_text(size = 13L, face = "bold.italic", hjust = 1), 
 axis.text.y = element_text(size = 14L), axis.text.x = element_text(size = 14L))

## CLASSE_AGE - TAILLE

ggplot(INFARCTUS_M) +
  aes(x = CLASSE_AGE, y = TAILLE, fill = CLASSE_AGE) +
  geom_boxplot() +
  stat_summary(fun = mean, geom = "point", shape = 20, size = 4, color = "red")+
  scale_fill_hue(direction = 1) +
  labs(x = "Classe d'âge ", y = "Taille (Cm)", title = "Distibution de la taille des femmes selon la classe d'âge") +
  theme_classic() +
  theme(plot.title = element_text(size = 16L, face = "bold", hjust = 0.5), axis.title.y = element_text(size = 13L, 
                                                                                                       face = "bold.italic", hjust = 1), axis.title.x = element_text(size = 13L, face = "bold.italic", hjust = 1), 
        axis.text.y = element_text(size = 14L), axis.text.x = element_text(size = 14L))

Analyse multivariée tenant compte la classe d’âge

mod1 = glm(
  INFARCT ~ CO+TABAC+HTA+POIDS+ATCD+TAILLE+CLASSE_AGE,
  family = binomial,data = INFARCTUS_M
)

mod1
## 
## Call:  glm(formula = INFARCT ~ CO + TABAC + HTA + POIDS + ATCD + TAILLE + 
##     CLASSE_AGE, family = binomial, data = INFARCTUS_M)
## 
## Coefficients:
##           (Intercept)                  COOui  TABACAncienne fumeuse  
##              -1.70116                2.23966                1.98996  
## TABACFumeuse actuelle                 HTAOui                  POIDS  
##               1.88715                0.83821                0.02150  
##               ATCDOui                 TAILLE       CLASSE_AGE50-100  
##               0.38682               -0.02037                0.66824  
## 
## Degrees of Freedom: 448 Total (i.e. Null);  440 Residual
## Null Deviance:       570.7 
## Residual Deviance: 400.5     AIC: 418.5
tbl_regression(mod1, 
               exponentiate = T,
               add_estimate_to_reference_rows = TRUE
)%>%
  bold_labels() %>%
  bold_p()%>%
  italicize_levels()%>%
  modify_header(label="**Variables**",p.value= "**p**")%>%
  modify_footnote(everything() ~ NA)%>%
  remove_abbreviation(abbreviation = NULL)%>%
  modify_caption("**Tableau 6: Facteurs associés à l'infarctus de myocarde chez les femmes (analyse multivariée)**" )%>%
  as_flex_table()
**Tableau 6: Facteurs associés à l'infarctus de myocarde chez les femmes (analyse multivariée)**

Variables

OR

95% IC

p

Prise de contraceptifs oraux

Jamais

1,00

Oui

9,39

5,60 – 16,2

<0,001

Consommation de tabac

Non

1,00

Ancienne fumeuse

7,32

3,75 – 14,7

<0,001

Fumeuse actuelle

6,60

3,62 – 12,4

<0,001

Hypertension artérielle

Non

1,00

Oui

2,31

1,32 – 4,10

0,004

Poids (Kg)

1,02

1,01 – 1,04

0,003

Antécédents familiaux de maladie cardio-vasculaire

Non

1,00

Oui

1,47

0,72 – 2,98

0,3

Taille (Cm)

0,98

0,95 – 1,01

0,2

Classe d'âge

15-49

1,00

50-100

1,95

1,09 – 3,54

0,025

### Graphiques

ggcoef_model(mod1,exponentiate = T)

ggcoef_table(mod1,exponentiate = T)