L’utilisation des poids normalisés sur la taille de l’échantillon s’avère obligatoire pour certaines analyses, en particulier pour obtenir des estimations robustes de la variance. La présente fiche présente avec les packages questionr et survey, deux manières d’introduire ces poids dans des analyses.
Activation des packages et ouverture de la table d’exemple HDV
#install.packages(questionr)#install.packages(survey)library(questionr)library(survey)#Utilisation de la table d'exemple Histoire de vie (hdv2003) data("hdv2003")# Extrait du fichierhdv2003[1:5,1:5]
id age sexe nivetud poids
1 1 28 Femme Enseignement superieur y compris technique superieur 2634.398
2 2 23 Femme <NA> 9738.396
3 3 59 Homme Derniere annee d'etudes primaires 3994.102
4 4 34 Homme Enseignement superieur y compris technique superieur 5731.662
5 5 71 Femme Derniere annee d'etudes primaires 4329.094
La variable pondérée du fichier s’appelle poids
Package questionr
Le package questionr permet d’obtenir rapidement des tableaux de fréquences ou de pourcentages avec des poids normalisés. L’opération de normalisation est passée directement dans une option.
On est ici dans la situation la plus simple simple, le design se réduisant à l’application d’un poids d’échantillonage.
Avant d’utiliser la fonction d’analyse on générère un objet renseignant les divers éléments entrant dans le design de l’enquête (ici seulement la variable hdv2003$poids_norm) avec la fonction svydesign
Fonction svydesign
dfw<-svydesign(ids =~1, data =hdv2003, weights =~hdv2003$poids)
Application du design à des fonctions analytiques
On ajoute aux fonctions l’objet généré avec svydesign (ici dfw)
Warning in eval(family$initialize): nombre de succès non entier dans un glm
binomial !
Call:
svyglm(formula = cuisine ~ age + sexe + occup + qualif, design = dfw,
family = binomial)
Survey design:
svydesign(ids = ~1, data = hdv2003, weights = ~hdv2003$poids)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.151065 0.324985 -0.465 0.642
age -0.012303 0.006407 -1.920 0.055
sexeFemme 0.922651 0.160463 5.750 1.06e-08
occupChomeur 0.344982 0.255175 1.352 0.177
occupEtudiant, eleve -0.677345 1.124417 -0.602 0.547
occupRetraite -0.256705 0.242383 -1.059 0.290
occupRetire des affaires 0.633727 1.100048 0.576 0.565
occupAu foyer 0.249697 0.286245 0.872 0.383
occupAutre inactif -0.231741 0.382382 -0.606 0.545
qualifOuvrier qualifie 0.134447 0.252713 0.532 0.595
qualifTechnicien -0.395892 0.357399 -1.108 0.268
qualifProfession intermediaire 0.220994 0.293482 0.753 0.452
qualifCadre -0.265439 0.256451 -1.035 0.301
qualifEmploye 0.018206 0.222582 0.082 0.935
qualifAutre -0.510097 0.401470 -1.271 0.204
(Dispersion parameter for binomial family taken to be 0.9331289)
Number of Fisher Scoring iterations: 4
Vous pouvez retrouver dans la documentation l’ensemble des fonctions prises en charge.
Code source
---title: "Pondérations normalisées avec R"# subtitle: ""categories: - Pondérationauthor: - name: "Elodie Baril" affiliations: - name: "Ined"date: 06/29/2023image: "https://www.r-project.org/Rlogo.png"format: html: defaultabstract: | L'utilisation des poids normalisés sur la taille de l'échantillon s'avère obligatoire pour certaines analyses, en particulier pour obtenir des estimations robustes de la variance. La présente fiche présente avec les packages `questionr` et `survey`, deux manières d'introduire ces poids dans des analyses.---| Package | Fonction ||---------------|-------------------------------------------------|| **questionr** | `wtd.table` - `cprop` - `lprop` || **survey** | `svydesign` - `svytable` - `svymean` - `svyglm` || **Base R** | `mean` |: **Fonctions utilisées dans la fiche**Documentation sur les packages: - <https://juba.github.io/questionr/>- <https://www.rdocumentation.org/packages/survey/versions/4.1-1>Activation des packages et ouverture de la table d'exemple HDV```{r warning=FALSE,message=FALSE}#install.packages(questionr)#install.packages(survey)library(questionr)library(survey)#Utilisation de la table d'exemple Histoire de vie (hdv2003) data("hdv2003")# Extrait du fichierhdv2003[1:5,1:5]```La variable pondérée du fichier s'appelle **poids**# Package questionrLe package `questionr` permet d'obtenir rapidement des tableaux de fréquences ou de pourcentages avec des poids normalisés. L'opération de normalisation est passée directement dans une option.## Fréquences pondérées * Fonction **`wtd.table()`**```{r filename="fréquences sans pondération"}table(hdv2003$sexe)``````{r filename="fréquences avec pondérations"}# tris à plat avec l'option weightswtd.table(hdv2003$sexe, weights = hdv2003$poids)# tris croiséwtd.table(hdv2003$qualif,hdv2003$sexe,weights=hdv2003$poids)```**Pour normaliser la pondération on ajoute l'option `normwt=TRUE`**. ```{r filename="fréquences avec pondérations normalisées"}wtd.table(hdv2003$sexe,weights=hdv2003$poids, normwt=TRUE)``````{r filename="tri croisé avec pondérations normalisées"}wtd.table(hdv2003$qualif,hdv2003$sexe,weights=hdv2003$poids, normwt=TRUE)```## Pourcentages pondérés```{r filename="Stocker le resultat des fréquences pondérées dans un objet, ici res"}res=wtd.table(hdv2003$qualif,hdv2003$sexe, weights=hdv2003$poids, normwt=TRUE)```* On utilise les fonctions `cprop()` et `lprop`: * cprop(): pourcentages colonnes * lprop(): pourcentages lignes```{r}cprop(res) lprop(res) ```# Le package `survey`* Plus riche, le package **`survey`** permet d'appliquer la pondération, normalisée ou non, à un ensemble plus vaster de fonction. * Pour les modèles, l'application de la pondération normalisée (**obligatoire**) permet d'obtenir une estimation robuste de la variance des paramètres.* La normalisation de la pondération se fait par la création d'une nouvelle variable. ## Création de la variable de pondération normaliséeOn divise tout simplement chaque poids individuel par la moyenne des poids (fonction `mean()`)```{r filename="creation d'une variable de pondération normalisée"}hdv2003$poids_norm=hdv2003$poids/mean(hdv2003$poids)```Comme la normalisation se fait sur la taille de l'échantillon, la somme des poids normalisés est bien égale à l'effectif de celui-ci```{r}sum(hdv2003$poids_norm)```## Design de l'échantillon* On est ici dans la situation la plus simple simple, le design se réduisant à l'application d'un poids d'échantillonage. * Avant d'utiliser la fonction d'analyse on générère un objet renseignant les divers éléments entrant dans le design de l'enquête (ici seulement la variable *hdv2003$poids_norm*) avec la fonction **`svydesign`**```{r filename="Fonction svydesign"}dfw <- svydesign(ids = ~1, data = hdv2003, weights = ~ hdv2003$poids)```## Application du design à des fonctions analytiques* On ajoute aux fonctions l'objet généré avec `svydesign` (ici **dfw**)**Tableaux de fréquence*** Fonction **`svytable`**```{r filename="fréquences pondérées"}svytable(~sexe, dfw)svytable(~ sexe + qualif, dfw)``````{r filename="Pourcentages pondérés"}tab <- svytable(~ sexe + qualif, dfw)``````{r filename="Pourcentages pondérés"}lprop(tab) # % ligne pondéréecprop(tab) # % colonne pondérée```**Moyenne pondérée*** Fonction `svymean` et `svyby````{r filename="Moyenne pondérée"}svymean(~age, dfw)```* Si on souhaite calculer une moyenne par sous groupe, on utilise la fonction `svyby` à laquelle on ajoute l'argument `svymean` en option```{r filename="Moyennes pondérées par groupe"}svyby(~age, ~sexe, dfw, svymean)```* Modèle logistique avec `svyglm````{r filename="Moyennes pondérées par groupe"}options(show.signif.stars=FALSE)summary(svyglm(cuisine ~ age + sexe + occup + qualif, dfw, family=binomial))```Vous pouvez retrouver dans la documentation l'ensemble des fonctions prises en charge.