qesR charge dans R les Études électorales québécoises et d’autres enquêtes électorales québécoises à partir d’un code d’étude. Chaque code d’étude lit le fichier de données original de l’étude, toujours la même version, vérifié avant usage. Le catalogue des études, leurs documents, leurs citations et la description de chaque variable de chaque étude sont livrés avec le package.
Cette page va d’un code d’étude à une estimation pondérée. Tous ses
blocs de code s’exécutent sans connexion réseau, sauf ceux de la
dernière section : ils utilisent le catalogue, les métadonnées livrées
et qes_demo, une petite étude synthétique fournie avec
qesR. Les blocs qui téléchargeraient une vraie étude sont montrés, mais
pas exécutés, et la dernière section, Sur les
données réelles, refait les mêmes étapes sur une vraie étude,
qu’elle télécharge.
Installation
Installez qesR depuis GitHub, et le package survey pour
les estimations avec intervalles de confiance :
# install.packages("remotes")
remotes::install_github("ThomasGareau/qesR")
install.packages("survey")Quelles études sont offertes ?
qes_studies() énumère les études, avec leur année, leur
famille, leur devis, leur population cible, leur licence, leur DOI et la
version de ses données que qesR lit.
studies <- qes_studies()
studies[, c("study", "year", "family", "study_design", "licence")]
#> study year family study_design licence
#> 1 qes2022 2022 qes pre_post CC BY-NC 4.0
#> 2 qes2018 2018 qes post CC0 1.0
#> 3 qes2018_panel 2018 durand_panel panel CC0 1.0
#> 4 qes2014 2014 qes post CC0 1.0
#> 5 qes2012 2012 qes post CC0 1.0
#> 6 qes2012_panel 2012 durand_panel panel CC0 1.0
#> 7 qes_crop_2007_2010 2007 crop_polls pooled_polls CC0 1.0
#> 8 qes2008 2008 qes post CC0 1.0
#> 9 qes2007 2007 qes post CC0 1.0
#> 10 qes2007_panel 2007 durand_panel panel CC0 1.0
#> 11 qes1998 1998 polls_1998 panel CC0 1.0
#> 12 qes1998_crop 1998 polls_1998 panel CC0 1.0
#> 13 qes1998_createc 1998 polls_1998 panel CC0 1.0Toutes ne sont pas des Études électorales québécoises (famille
qes) : les panels Durand, les sondages CROP et les sondages
de 1998 ont leurs propres devis et populations. qes_docs()
énumère les livres de codes, questionnaires et rapports de chaque
étude.
qes_docs("qes2014")[, c("role", "lang", "file_name")]
#> role lang
#> 1 questionnaire en
#> 2 questionnaire fr
#> 3 technical_report fr
#> file_name
#> 1 Quebec Election Study 2014 EN.doc
#> 2 Quebec Election Study 2014 FR.doc
#> 3 Quebec Election Study 2014 - Technical Report - Post-Election Study.docCharger une étude
get_qes() retourne les données. Elle n’écrit rien dans
votre espace de travail : assignez vous-même le résultat. L’étude de
démonstration est lue dans le package ; une vraie étude est téléchargée
une fois par session (ou gardée d’une session à l’autre avec
options(qesR.cache = "disk")).
demo <- get_qes("qes_demo", quiet = TRUE)
dim(demo)
#> [1] 60 11
head(demo[, c("QSEXE", "Q2", "Q3", "Q19")])
#> QSEXE Q2 Q3 Q19
#> 1 2 1 3 2
#> 2 2 1 4 2
#> 3 1 1 1 1
#> 4 1 1 2 1
#> 5 1 1 4 2
#> 6 2 1 3 1
qes2014 <- get_qes("qes2014")Les colonnes gardent les codes et les étiquettes du fichier (colonnes
labelled de haven). Les codes « ne sait pas » et « refus »
restent des valeurs tant que vous ne demandez pas à
qes_missing() de les remplacer par NA ; la
fonction consigne ce qu’elle a changé.
demo_clean <- qes_missing(demo, quiet = TRUE)
attr(demo_clean, "qes_missing_log")
#> variable value missing_type n_set
#> 1 QAGE 9999 refused 0
#> 2 Q2 9 refused 3
#> 3 Q3 99 refused 2
#> 4 Q19 8 dk 3
#> 5 Q19 9 refused 2
#> 6 Q28 8 dk 1
#> 7 Q28 9 refused 0
#> 8 Q32 98 dk 5
#> 9 Q32 99 refused 0Codebooks, questions et recherche, sans réseau
Le codebook de chaque étude est livré avec qesR : étiquettes des variables, texte des questions en français et en anglais tiré des questionnaires déposés (pour l’étude de 2022, de son livre de codes bilingue), étiquettes de valeurs et codes manquants.
cb <- qes_codebook("qes2014")
cb[cb$variable %in% c("Q2", "Q3", "Q19", "POND"), c("variable", "label", "n_value_labels")]
#> <qes_codebook>
#> Variables: 4
#> Codebook/support files: 0
#> variable label n_value_labels
#> 1 Q2 Avez-vous voté à cette élection provi... 3
#> 2 Q3 Pour quel parti avez-vous voté? 8
#> 3 Q19 Si un référendum sur l'indépendance a... 4
#> 4 POND Pondération 0
qes_codebook("qes2014", layout = "long", variables = "Q19")
#> <qes_codebook> survey: qes2014
#> DOI: 10.5683/SP3/64F7WR
#> Data file: Quebec Election Study 2014.sav (Dataverse: Quebec Election Study 2014 (SPSS).tab)
#> Variables: 1
#> Rows: 4
#> Codebook/support files: 3
#> variable value value_label
#> 1 Q19 1 Oui
#> 2 Q19 2 Non
#> 3 Q19 8 Je ne sais pas
#> 4 Q19 9 Je préfère ne pas répondre
#> label
#> 1 Si un référendum sur l'indépendance a...
#> 2 Si un référendum sur l'indépendance a...
#> 3 Si un référendum sur l'indépendance a...
#> 4 Si un référendum sur l'indépendance a...
#> question study missing_type is_declared_na
#> 1 Si un référendum sur l’indépendance a... qes2014 <NA> FALSE
#> 2 Si un référendum sur l’indépendance a... qes2014 <NA> FALSE
#> 3 Si un référendum sur l’indépendance a... qes2014 dk FALSE
#> 4 Si un référendum sur l’indépendance a... qes2014 refused FALSEqes_question() donne le libellé exact, dans l’une ou
l’autre langue :
qes_question("qes2014", "Q19", lang = "en")$question
#> [1] "If there were a referendum on independence that asked whether Quebec should be an independent country, would you vote YES or NO?"
qes_question("qes2014", "Q19", lang = "fr")$question
#> [1] "Si un référendum sur l’indépendance avait lieu vous demandant si vous voulez que le Québec devienne un pays indépendant, voteriez-vous OUI ou voteriez-vous NON?"qes_search() cherche dans toutes les études à la fois,
sans tenir compte de la casse ni des accents :
hits <- qes_search("souverain|sovereign")
head(hits[!is.na(hits$label), c("study", "variable", "label")])
#> study variable label
#> 1 qes2022 cps_impissue_matrix What is the most important issue to y...
#> 2 qes2022 pes_q23 Did you vote in the 1995 referendum o...
#> 3 qes2014 Q1 Parmi les enjeux suivants, lequel éta...
#> 4 qes2014 Q16 Avez-vous voté lors du référendum de ...
#> 5 qes2014 Q50 Certaines personnes croient qu'il est...
#> 6 qes2012 q34bb Of the following issues, which was, f...Le codebook de l’étude de 2022 est sous licence CC BY-NC 4.0
(attribution, pas d’usage commercial) ; voir
vignette("fr-citations", package = "qesR").
Une estimation pondérée
Quelle part des adultes québécois aurait voté OUI à un référendum sur
l’indépendance, juste après l’élection de 2014 ? La question Q19 de
qes2014 le demande (son libellé figure plus haut). Une
estimation correcte précise quatre choses, et les étapes précédentes
donnent chacune d’elles.
-
La population. Le catalogue donne le devis et la
population cible de chaque étude :
qes2014est une enquête postélectorale qui vise la population adulte du Québec, et rien de plus large. Ses répondants viennent d’un panel en ligne à adhésion volontaire, et non d’un échantillon probabiliste. -
La pondération.
PONDest la pondération deqes2014. Son rapport technique (qes_docs("qes2014")) indique qu’elle ajuste l’échantillon au dernier recensement selon le sexe, l’âge, la région et la langue. L’estimation ne décrit la population adulte que dans la mesure où cet ajustement corrige le panel.
studies[studies$study == "qes2014",
c("study", "study_design", "target_population_en", "target_population_fr")]
#> study study_design target_population_en target_population_fr
#> 4 qes2014 post Quebec adult population Population adulte du Québec
qes_codebook("qes2014", variables = "POND")[, c("variable", "label")]
#> <qes_codebook>
#> Variables: 1
#> Codebook/support files: 0
#> variable label
#> 1 POND Pondération- La question et ses codes. Q19 code OUI 1, NON 2, « je ne sais pas » 8 et « je préfère ne pas répondre » 9 (le codebook long plus haut).
-
Le dénominateur.
qes_missing()a mis les codes 8 et 9 àNA. La part ci-dessous est calculée parmi les répondants qui ont répondu OUI ou NON, et elle le dit.
Sur l’étude de démonstration, qui reprend ces noms et ces codes :
answered <- demo_clean$Q19 %in% c(1, 2)
yes <- demo_clean$Q19[answered] == 1
weight <- demo_clean$POND[answered]
c(
respondents = sum(answered),
unweighted = mean(yes),
weighted = sum(weight * yes) / sum(weight)
)
#> respondents unweighted weighted
#> 55.0000000 0.4000000 0.4158442Les données de démonstration sont synthétiques : ces nombres ne décrivent aucune population, ils montrent le calcul. Sur le vrai fichier, les mêmes lignes donnent la part de OUI pondérée selon la population adulte du Québec de 2014 ; la dernière section de cette page la calcule, avec son intervalle de confiance.
qes2014 <- qes_missing(get_qes("qes2014"))
answered <- qes2014$Q19 %in% c(1, 2)
yes <- qes2014$Q19[answered] == 1
weight <- qes2014$POND[answered]
sum(weight * yes) / sum(weight)C’est une estimation ponctuelle. qes2014 est un panel en
ligne non probabiliste : son rapport technique
(qes_docs("qes2014")) ne donne pas de marge d’erreur, et
une erreur type fondée sur le plan de sondage, celle du package
survey par exemple, n’aurait pas son sens habituel.
Calculez chaque estimation dans une seule étude : les études diffèrent
par leur devis, leur population et le libellé de leurs questions, et
leurs pondérations sont chacune sur leur propre échelle.
Données harmonisées entre études
qes_harmonize() construit un seul tableau à partir de
plusieurs études, une colonne par variable harmonisée (« cible »), selon
des règles livrées avec qesR. qes_spec() montre quelle
question de chaque étude alimente une cible et à quel point elle est
comparable à la question d’ancrage de la cible :
xw <- qes_spec("crosswalk", targets = "sov_indep", lang = "fr")
xw[, c("study", "wave", "source_var", "grade", "weight_var")]
#> study wave source_var grade weight_var
#> 1 qes2012 post q52 identical pond
#> 2 qes2014 post Q19 identical POND
#> 3 qes2018 post q26 comparable pond
#> 4 qes2022 cps cps_qc_referendum comparable cps_weight_generalToutes les études n’ont pas une pondération validée : le tableau des pondérations du site
web dit lesquelles. Pour une étude qui n’en a pas, les colonnes de
pondération valent NA, et qes_design() vous
prévient quand il écarte des lignes. Sur l’étude de démonstration, qui
tient lieu de qes2014 :
h <- qes_harmonize("qes_demo", targets = c("sov_indep", "vote_prov_recall"),
missing = "reasons", quiet = TRUE, lang = "fr")
h[1:4, c("study", "eligible_voter", "sov_indep", "sov_indep__na", "weight_post")]
#> study eligible_voter sov_indep sov_indep__na weight_post
#> 1 qes_demo TRUE Non <NA> 1.2593217
#> 2 qes_demo TRUE Non <NA> 0.6685168
#> 3 qes_demo TRUE Oui <NA> 1.3786438
#> 4 qes_demo TRUE Oui <NA> 0.9836078
attr(h, "qes_weight_guide")[, c("target", "study", "weight_column", "weight_var")]
#> target study weight_column weight_var
#> 1 vote_prov_recall qes_demo weight_post POND
#> 2 sov_indep qes_demo weight_post PONDChaque valeur manquante a un motif (sov_indep__na).
eligible_voter indique si la personne pouvait voter à
l’élection, et la pondération recommandée de chaque vague a une moyenne
de 1 : ces questions ont été posées après l’élection, donc
weight_post est leur pondération, comme l’indique le guide
des pondérations. qes_design() transmet les données au
package survey. droplevels() retire d’abord
les réponses qu’aucun répondant de l’étude de démonstration n’a données,
pour qu’elles n’apparaissent pas comme des lignes de zéros :
if (requireNamespace("survey", quietly = TRUE)) {
h$sov_indep <- droplevels(h$sov_indep)
d <- qes_design(h, weight = "weight_post")
survey::svymean(~sov_indep, d, na.rm = TRUE)
}
#> mean SE
#> sov_indepOui 0.41584 0.0718
#> sov_indepNon 0.58416 0.0718L’erreur type traite l’échantillon pondéré comme un échantillon
probabiliste ; pour un panel à participation volontaire comme qes2014,
lisez-la seulement comme un ordre de grandeur (voir
?qes_design).
Une question préélectorale (l’intention de vote) prend plutôt
weight_pre, et les deux vagues d’une étude peuvent avoir
des pondérations différentes : qes_design() demande de
choisir quand les cibles en demandent de différentes. La référence de
chaque cible, générée à partir de la spécification, est
vignette("fr-reference-harmonisation", package = "qesR").
Pour démarrer plus vite avec toutes les études,
qes_decon() renvoie un seul tableau aux noms de colonnes
simples (vote_choice, sovereignty,
education, …), assoupli pour que chaque colonne porte un
seul concept même là où les questions diffèrent ; voir Un seul fichier pour toutes les études sur le
site web.
Provenance et citations
Les données retournées par get_qes() indiquent de quel
fichier elles viennent. qes_provenance() renvoie cette
information, et qes_cite() cite qesR et les jeux de données
utilisés (voir
vignette("fr-citations", package = "qesR")).
qes_provenance(demo)
#> qes_demo : fichier 0 (qes_demo.sav), données synthétiques fournies avec qesR.
#> Somme md5 e956e315800690cb0894c86ed85c8bea, vérifiée. 60 lignes, 11 colonnes.
#> Obtenu le 2026-10-06 05:11:16 UTC (local_demo). Lu avec
#> haven::read_sav(user_na = TRUE), haven 2.5.5. Licence : CC0 1.0. Catalogue
#> qesR 2.4.1.
#>
#> as.data.frame() donne toutes les colonnes.
qes_cite("qes2014")
#> [1] "Gareau-Paquette, Thomas, 2026, \"qesR: Access Quebec Election Study Datasets\", R package version 0.9.2, https://github.com/ThomasGareau/qesR"
#> [2] "Bélanger, Éric; Nadeau, Richard, 2023, \"Étude électorale québécoise 2014\", https://doi.org/10.5683/SP3/64F7WR, Borealis, V1, UNF:6:OoiAJ3ShbycsxmWCefqrjw=="qes_download() enregistre les fichiers originaux
eux-mêmes (fichier de données et documents), vérifiés, dans un dossier
de votre choix :
dir <- file.path(tempdir(), "qes_originals")
dir.create(dir)
qes_download("qes2014", path = dir, what = c("data", "docs"))Messages et erreurs
Les messages, avertissements et erreurs s’affichent en français avec
options(qesR.lang = "fr") ; les données retournées sont les
mêmes dans les deux langues. Les erreurs ont des classes : un script
peut y réagir sans lire leur texte.
Sur les données réelles
La même estimation sur le vrai qes2014, de
l’harmonisation à une part avec son intervalle de confiance à 95 %.
Cette section télécharge une étude (environ 0,4 Mo) la première fois
qu’elle s’exécute ; options(qesR.cache = "disk") la garde
sur le disque pour les sessions suivantes. L’intervalle traite le panel
pondéré comme un échantillon probabiliste ; pour un panel à
participation volontaire comme qes2014, lisez-le comme un
ordre de grandeur.
library(survey)
h14 <- qes_harmonize("qes2014", targets = "sov_indep", quiet = TRUE)
d14 <- qes_design(h14, weight = "weight_post")
d14 <- subset(d14, sov_indep %in% c("Yes", "No"))
svyciprop(~I(sov_indep == "Yes"), d14, method = "logit")
#> 2.5% 97.5%
#> I(sov_indep == "Yes") 0.348 0.318 0.379qes_harmonize() étiquette les réponses en anglais par
défaut, d’où "Yes" et "No" ci-dessus ;
lang = "fr" les donne en français.
Du code écrit pour une version antérieure
Voir Passer de qesR 0.4.4 à la version actuelle,
vignette("fr-migrer-0.7", package = "qesR").