29  Manipulation de données pondérées

L’objet créé avec survey::svydesign() ou srvyr::as_survey_design() n’est plus un tableau de données, mais plutôt un tableau de données auquel est attaché un plan d’échantillonnage. Les colonnes du tableau d’origine ne sont plus directement accessibles avec l’opérateur $. En fait, elles sont stockées dans un sous-objet $variables.

titanic <- dplyr::as_tibble(Titanic)
t_titanic <- titanic |> 
  srvyr::as_survey_design(weights = n)
t_titanic$variables |> dplyr::glimpse()
Rows: 32
Columns: 5
$ Class    <chr> "1st", "2nd", "3rd", "Crew", "1st", "2nd", "3rd", "Crew", "1s…
$ Sex      <chr> "Male", "Male", "Male", "Male", "Female", "Female", "Female",…
$ Age      <chr> "Child", "Child", "Child", "Child", "Child", "Child", "Child"…
$ Survived <chr> "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "…
$ n        <dbl> 0, 0, 35, 0, 0, 0, 17, 0, 118, 154, 387, 670, 4, 13, 89, 3, 5…

Il n’est pas aisé de modifier des variables dans un objet de ce type. Il est donc préférable de procéder à l’ensemble des nettoyages, recodages de variables (et au besoin transformation des vecteurs labellisés en facteur), avant de définir le plan d’échantillonnage et de procéder aux analyses.

Si l’on souhaite manipuler les données, le plus simple est d’avoir recours au package srvyr qui étend les verbes de dplyr (cf. Chapitre 8) aux objets survey.

29.1 Utilisation de {srvyr}

srvyr fournit les verbes srvyr::select() et srvyr::filter() pour sélectionner respectivement des colonnes et des lignes.

library(srvyr)

Attachement du package : 'srvyr'
L'objet suivant est masqué depuis 'package:stats':

    filter
t_titanic |> select(Sex, Age)
Independent Sampling design (with replacement)
Called via srvyr
Sampling variables:
  - ids: `1` 
  - weights: n 
Data variables: 
  - Sex (chr), Age (chr)
t_titanic |> filter(Sex == "Female")
Independent Sampling design (with replacement)
Called via srvyr
Sampling variables:
  - ids: `1` 
  - weights: n 
Data variables: 
  - Class (chr), Sex (chr), Age (chr), Survived (chr), n (dbl)

On peut aussi utiliser srvyr::pull() pour extraire le contenu d’une colonne ou srvyr::drop_na() pour supprimer les observations contenant des valeurs manquantes.

Avertissement

Par contre, le verbe arrange() (tri du tableau) ou encore les fonctions de jointures (telles que left_join()) ne sont pas implémentées car ce type d’opération entraînerait des modifications du plan d’échantillonnage. Il est donc préférable de réaliser ce type d’opérations avant la déclaration du plan d’échantillonnage (quand les données sont donc encore stockées dans un tableau de données classiques).

srvyr fournit également le verbe srvyr::summarize() permettant de calculer des statistiques sur l’ensemble du fichier ou par sous-groupe (en combinant summarize() avec group_by()). Afin de prendre en compte correctement la pondération et le plan d’échantillonnage, srvyr fournit des fonctions adaptées pour un usage au sein de summarize() : srvyr::survey_mean(), srvyr::survey_total(), srvyr::survey_prop(), srvyr::survey_ratio(), srvyr::survey_quantile() ou encore srvyr::survey_median().

t_titanic |> 
  group_by(Sex, Class, Survived) |> 
  summarise(taux_survie = survey_prop()) |> 
  filter(Survived == "Yes")
When `proportion` is unspecified, `survey_prop()` now defaults to `proportion = TRUE`.
ℹ This should improve confidence interval coverage.
This message is displayed once per session.
Warning: There were 24 warnings in `dplyr::summarise()`.
The first warning was:
ℹ In argument: `taux_survie = survey_prop()`.
ℹ In group 1: `Sex = "Female"`, `Class = "1st"`, `Survived = "No"`.
Caused by warning in `summary.glm()`:
! les observations de poids nul n'ont pas été utilisées pour le calcul de la dispersion
ℹ Run `dplyr::last_dplyr_warnings()` to see the 23 remaining warnings.
# A tibble: 8 × 5
# Groups:   Sex, Class [8]
  Sex    Class Survived taux_survie taux_survie_se
  <chr>  <chr> <chr>          <dbl>          <dbl>
1 Female 1st   Yes            0.972         0.0384
2 Female 2nd   Yes            0.877         0.145 
3 Female 3rd   Yes            0.459         0.306 
4 Female Crew  Yes            0.870         0.163 
5 Male   1st   Yes            0.344         0.312 
6 Male   2nd   Yes            0.140         0.150 
7 Male   3rd   Yes            0.173         0.183 
8 Male   Crew  Yes            0.223         0.249 

29.2 Lister / Rechercher des variables

La fonction labelled::look_for(), que nous avons déjà abordée (cf. Section 4.3), est compatible avec les objets survey et peut donc être utilisée pour lister ou rechercher des variables.

t_titanic <- titanic |> 
  labelled::set_variable_labels(
    Class = "Class du passager",
    Sex = "Sexe du passager",
    Age = "Enfant ou adulte ?",
    Survived = "A survécu au naufrage ?",
    n = "Nombre d'observations"
  ) |> 
  srvyr::as_survey_design(weights = n)
t_titanic |> labelled::look_for()
 pos variable label                   col_type missing values
 1   Class    Class du passager       chr      0             
 2   Sex      Sexe du passager        chr      0             
 3   Age      Enfant ou adulte ?      chr      0             
 4   Survived A survécu au naufrage ? chr      0             
 5   n        Nombre d'observations   dbl      0             
t_titanic |> labelled::look_for("nau")
 pos variable label                   col_type missing values
 4   Survived A survécu au naufrage ? chr      0             

29.3 Extraire un sous-échantillon

Si l’on souhaite travailler sur un sous-échantillon de l’enquête, il importe de définir le plan d’échantillonnage sur l’ensemble du jeu de données avant de procéder à la sélection des observations.

La fonction classique pour sélectionner des lignes est subset(). Cependant, elle a un inconvénient lorsque nos données comportent des étiquettes de variables (cf. Chapitre 11) ou de valeurs ( Chapitre 12), car les étiquettes ne sont pas conservées après l’opération.

On préférera donc avoir recours à srvyr::filter() qui conservent les attributs associés aux colonnes du tableau de données.

t_subset <- t_titanic |> subset(Sex == "Female")
t_subset |> labelled::look_for()
 pos variable label col_type missing values
 1   Class    —     chr      0             
 2   Sex      —     chr      0             
 3   Age      —     chr      0             
 4   Survived —     chr      0             
 5   n        —     dbl      0             
t_filter <- t_titanic |> filter(Sex == "Female")
t_filter |> labelled::look_for()
 pos variable label                   col_type missing values
 1   Class    Class du passager       chr      0             
 2   Sex      Sexe du passager        chr      0             
 3   Age      Enfant ou adulte ?      chr      0             
 4   Survived A survécu au naufrage ? chr      0             
 5   n        Nombre d'observations   dbl      0