Afficher le code R
library(tidyverse)
library(haven)
library(labelled)
library(survey)
library(gtsummary)Cette annexe regroupe les opérations les plus courantes du livre. Elle sert de mémo, pas de substitut aux chapitres méthodologiques : une fonction correcte appliquée au mauvais univers ou au mauvais design reste une mauvaise analyse.
library(tidyverse)
library(haven)
library(labelled)
library(survey)
library(gtsummary)Pour savoir d’où vient une fonction :
survey::svymean
?survey::svymean| Besoin | Fonction |
|---|---|
| CSV séparé par virgules | readr::read_csv() |
CSV séparé par ; |
readr::read_csv2() |
| Fichier texte avec séparateur choisi | readr::read_delim() |
| Excel | readxl::read_excel() |
| SPSS | haven::read_sav() |
| Stata | haven::read_dta() |
| SAS | haven::read_sas() |
| RDS | readRDS() |
data <- readr::read_csv(
"data/raw/enqueter_brut.csv",
show_col_types = FALSE
)dim(data)
nrow(data)
ncol(data)
names(data)
dplyr::glimpse(data)
summary(data)
head(data)dplyr::n_distinct(data$id)
data %>%
count(id) %>%
filter(n > 1)sort(unique(data$sexe))
count(data, sexe)labelled::look_for(data)
labelled::var_label(data$sexe)
haven::as_factor(data$sexe)sum(is.na(data$revenu_mensuel))
mean(is.na(data$revenu_mensuel))Plusieurs variables :
data %>%
summarise(
across(
everything(),
~ mean(is.na(.x))
)
) %>%
pivot_longer(
everything(),
names_to = "variable",
values_to = "taux_na"
) %>%
arrange(desc(taux_na))data %>%
select(id, age, sexe)
data %>%
filter(age >= 18, age <= 79)
data %>%
arrange(desc(age))Retirer des colonnes :
data %>%
select(-c(variable_a, variable_b))data <- data %>%
mutate(age_centre = age - mean(age, na.rm = TRUE))case_when()data <- data %>%
mutate(
sport_regulier = case_when(
sport_freq %in% c(3, 4) ~ 1,
sport_freq %in% c(0, 1, 2) ~ 0,
TRUE ~ NA_real_
)
)data <- data %>%
mutate(
age_classe = cut(
age,
breaks = c(18, 30, 45, 60, 80),
right = FALSE,
labels = c("18-29", "30-44", "45-59", "60-79")
)
)data <- data %>%
mutate(
sexe_f = factor(
sexe,
levels = c(1, 2, 3),
labels = c("Homme", "Femme", "Autre/non-binaire")
)
)Changer la référence :
data$sexe_f <- relevel(data$sexe_f, ref = "Femme")Regrouper des niveaux :
forcats::fct_collapse(
data$diplome_f,
"Inférieur au bac" = c("Sans diplôme", "Brevet/CEP", "CAP/BEP")
){dplyr}data %>%
summarise(
n = n(),
moyenne = mean(age, na.rm = TRUE),
mediane = median(age, na.rm = TRUE),
ecart_type = sd(age, na.rm = TRUE)
)Par groupe :
data %>%
group_by(sexe_f) %>%
summarise(
age_moyen = mean(age, na.rm = TRUE),
n = n(),
.groups = "drop"
)design <- survey::svydesign(
ids = ~psu,
strata = ~strate,
weights = ~poids_final,
data = data,
nest = TRUE
)Sous-population :
design_emploi <- subset(
design,
statut_emploi == 1
)Préférez subset(design, ...) lorsque vous analysez un domaine d’une enquête complexe plutôt que de supprimer les observations du fichier avant d’avoir construit le design.
survey::svymean(~age, design, na.rm = TRUE)survey::svyquantile(
~age,
design,
quantiles = c(.25, .5, .75),
na.rm = TRUE,
ci = TRUE
)survey::svymean(
~sport_regulier,
design,
na.rm = TRUE
)survey::svytable(~sexe_f, design)survey::svyby(
~satisfaction_vie,
~sexe_f,
design,
survey::svymean,
na.rm = TRUE,
vartype = c("se", "ci")
)est <- svymean(~age, design, na.rm = TRUE)
confint(est)Proportion :
svyciprop(
~I(sport_regulier == 1),
design,
method = "logit",
na.rm = TRUE
)svychisq(
~sexe_f + sport_regulier,
design,
statistic = "F"
)svyttest(
satisfaction_vie ~ sexe_f,
design
)regTermTest(modele, ~diplome_4)mod_lin <- svyglm(
satisfaction_vie ~ age + sexe_f + diplome_4,
design = design
)
summary(mod_lin)mod_log <- svyglm(
sport_regulier ~ age + sexe_f + diplome_4,
design = design,
family = quasibinomial()
)Odds ratios :
exp(coef(mod_log))
exp(confint(mod_log))mod_ord <- survey::svyolr(
sante_ord ~ age + sexe_f + diplome_4,
design = design
)mod_count <- svyglm(
livres_12m ~ age + sexe_f + diplome_4,
design = design,
family = quasipoisson(link = "log")
)nouveau <- data.frame(
age = 45,
sexe_f = factor("Femme", levels = levels(data$sexe_f)),
diplome_4 = factor("Bac", levels = levels(data$diplome_4))
)
predict(
mod_log,
newdata = nouveau,
type = "response",
se.fit = TRUE
)library(mice)
imp <- mice(
data_imp,
m = 20,
maxit = 20,
seed = 2026,
printFlag = FALSE
)
fit <- with(
imp,
lm(y ~ x1 + x2)
)
pool(fit)Format long :
panel_long %>%
arrange(id, vague)Effet fixe individuel :
plm::plm(
satisfaction_vie ~ revenu_mensuel,
data = plm::pdata.frame(panel_long, index = c("id", "vague")),
model = "within"
)Modèle mixte :
lme4::lmer(
satisfaction_vie ~ vague + revenu_mensuel + (1 | id),
data = panel_long
)data %>%
select(age, sexe_f, diplome_4) %>%
gtsummary::tbl_summary()design %>%
gtsummary::tbl_svysummary(
include = c(age, sexe_f, diplome_4)
)gtsummary::tbl_regression(
mod_log,
exponentiate = TRUE
)ggplot(data, aes(x = sexe_f)) +
geom_bar()ggplot(data, aes(x = age)) +
geom_histogram(binwidth = 5)ggplot(data, aes(x = diplome_4, y = satisfaction_vie)) +
geom_boxplot()Calculez d’abord les estimations avec svyby(), puis tracez le tableau agrégé avec geom_point() et geom_errorbar().
readr::write_csv(data, "data/derived/fichier.csv")
saveRDS(data, "data/derived/fichier.rds")
ggsave("figures/figure1.png", width = 8, height = 5)stopifnot(n_distinct(data$id) == nrow(data))
stopifnot(all(data$age >= 18 & data$age <= 79, na.rm = TRUE))
stopifnot(all(data$sport_regulier %in% c(0, 1, NA)))names(), class() et str() des objets concernés.?fonction.Comprendre la question
↓
Vérifier la documentation
↓
Contrôler l'univers et les types
↓
Construire le design
↓
Décrire avant de modéliser
↓
Quantifier l'incertitude
↓
Interpréter sans dépasser les données