Cette page propose une mise en application des méthodes de régression présentées lors des quatre premières séances du séminaire “Méthodes quantitatives pour la sociologie 2”.
Cette page a été réalisée avec Rstudio sous Rmarkdown et compilée le 08/03/2018.
L’enquête Pisa () est une enquête réalisée tous les trois ans par l’Organisation de coopération et de développement économique (OCDE) dans une soixantaine de pays auprès des élèves de 15 ans (quelle que soit leur classe au moment de l’enquête).
Elle vise à mesurer les acquis des élèves de 15 ans dans trois disciplines : mathématiques, compréhension de l’écrit (ou littéracie) et sciences. En plus des scores aux tests standardisés de mathématiques, compréhension de l’écrit et sciences, cette enquête comporte de très nombreuses informations sur l’origine sociale des élèves, leurs conditions d’enseignement ainsi que leur rapport aux enseignants et à l’école.
Il s’agit d’une enquête par sondage: à ce titre, chaque fichier dispose d’un poids à utiliser pour généraliser les résultats de l’échantillon d’élèves interrogés à l’ensemble de la population qu’ils représentent.
Organisation des fichiers Les fichiers de l’enquête Pisa 2012 et leur documentation sont librement téléchargeables sur le site de l’OCDE. Seuls deux des nombreux fichiers de données qui constituent l’enquête seront utilisés et ont été restreints à la France uniquement:
int_stu12
comporte la plupart des variables d’intérêt de l’enquête;int_scq12
comporte quelques données de contexte intéressantes.Le fichier établissement est présent en plusieurs formats informatiques (.txt
, .csv
et .sas7bdat
) pour illustrer les différentes méthodes d’importation des données. Les tableaux suivants recensent les principales variables d’intérêt de ces deux fichiers.
Fichier élèves (int_stu12
)
Variable | Description |
---|---|
cnt | Pays |
stidstd | Identifiant de l’élève |
schoolid | Identifiant de l’établissement |
w_fstuwt | Poids de sondage final de l’élève |
st01q01 | Classe en nombre d’années depuis l’entrée en primaire: la 10\(^{ème}\) classe correspond à la seconde en France. |
st04q01 | Sexe : (1) Femme (2) Homme |
st05q01 | A suivi une scolarité pré-primaire (1) Non (2) Oui, un an ou moins (3) Oui, plus d’un an |
st07q01 st07q02 st07q03 | A redoublé à un moment de sa scolarité : (1) Non (2-3) Oui, une ou plusieurs fois |
st08q01 | Est arrivé en retard au cours des deux semaines précédant l’enquête |
st09q01 | A séché les cours au cours des deux semaines précédant l’enquête |
anxmat | Score synthétique d’anxiété en mathématiques |
disclima | Score synthétique de climat de discipline dans la classe |
escs | Indicateur synthétique de statut économique, social et culturel |
immig | Immigration : (1) Né en France (2) Immigré de deuxième génération (3) Immigré de première génération |
hisced | Niveau d’étude le plus élevé des parents (nomenclature CITE) |
pv1math | Score synthétique à l’évaluation de mathématiques |
pv1read | Score synthétique à l’évaluation de compréhension de l’écrit |
pv1scie | Score synthétique à l’évaluation de sciences |
Fichier établissements (int_scq12
)
Variable | Description |
---|---|
cnt | Pays |
schoolid | Identifiant de l’établissement |
senwgt_scq | Poids de sondage (la somme vaut 1 000 dans chaque pays) |
sc01q01 | Statut public ou privé (1) public (2) privé |
sc03q01 | Taille de la commune de l’établissement : (1) Village (2) Small town (3) Town (4) City (5) Large city |
sc05q01 | Taille de la classe en cours de français : (01) 15 ou moins (02) 16-20 (03) 21-25 … (08) 46-50 (09) Plus de 50 élèves |
Documentaton Plusieurs éléments de documentation sont fournis:
PISA12_ScQ_ENG.pdf
) et la description du fichier élèves (M_stu_codebook.pdf
) (en anglais);PISA12_ScQ_ENG.pdf
) et la description du fichier établissements (M_sch_codebook.pdf
) (en anglais);PISA-2012-technical-report-final.pdf
) (en anglais).
Vérifiez la présence et identifiez l’ensemble des fichiers mentionnés ci-dessus. Ouvrez en particulier le questionnaire élève et observez les premières questions posées (Section A : About you). Retrouvez les variables correspondantes dans le tableau ci-dessus ainsi que dans le fichier .pdf
de description du fichier élève.
Ouvrez la note rédigée sur la France (PISA-2012-results-france.pdf
) et prenez connaissance de ses principaux résultats. Quand il est fait référence à un résultat statistique précis (moyenne, pourcentage, etc.), recherchez dans les tableaux ci-dessus les variables susceptibles d’avoir été utilisées pour y aboutir.
Plusieurs formats de fichiers sont fournis afin de présenter différentes méthodes d’importation courantes. Les fichiers de référence à importer et à utiliser dans le reste de la partie pratique sont les fichiers SAS au format .sas7bdat
(importation présentée à la sous-question d.).
Le fichier INT_SCQ12_DEC03.txt
correspond au format original des données (sur le site de l’OCDE). Il s’agit d’un fichier de données à largeur fixe (fixed-width format): contrairement aux fichiers dont les colonnes sont séparées par un délimiteur (virgules, tabulations, etc.), ici à chaque colonne correspond un nombre de caractères fixe qui est utilisé pour reconstituer les variables du fichier dans le logiciel statistique.
Recherchez le programme Notepad++ sur l’ordinateur et utilisez-le (ou à défaut le bloc-note Windows) pour visualiser le contenu de INT_SCQ12_DEC03.txt
(celui-ci étant un peu gros l’ouverture peut prendre un peu de temps). Vérifiez visuellement que les colonnes sont bien de largeur fixe.
Définissez comme répertoire de travail le dossier dans lequel se situent les données de l’enquête. La fonction read.fwf()
permet de lire un fichier de données à largeur fixe pour autant qu’on lui fournisse la largeur correspondant à chaque variable. Comment comprenez-vous alors le code suivant (établi à partir des fichiers .sas
mis en ligne par l’OCDE) ? Soumettez le code suivant et vérifiez que l’importation se déroule correctement.
sch_fwf <- read.fwf("INT_SCQ12_DEC03.txt", width = c(
3, 7, 7, 1, 6, 7, 1, 9, 9, 9, 9, 1, 1, 2, 9, 9, 4, 4, 4, 4, 4, 4, 4
, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9
, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 1, 1, 2, 9, 1, 9, 9, 9, 9, 1
, 1, 9, 9, 9, 9, 9, 9, 8, 8, 9, 1, 1, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9
, 9, 9, 9, 7
), stringsAsFactors = FALSE)
Bien souvent les fichiers à importer ne sont pas des fichiers à largeur fixe mais des fichiers séparés par un délimiteur (virgule, tabulation, etc.). Rercherchez de l’aide sur la fonction read.csv()
et utilisez-la pour importer le fichier INT_SCQ12_DEC03.csv
.
Le package de manipulation de données data.table
comporte une fonction d’import optimisé pour les données plates séparées par des délimiteurs fread()
dont la syntaxe est proche de celle de read.csv()
: installez ce package, recherchez de l’aide sur fread()
et comparez (soit “à vue d’oeil”, soit en mesurant le temps d’exécution) la vitesse de fread()
par rapport à read.csv()
.
Sur le site de l’OCDE pour l’heure tout est fait pour privilégier un import avec les logiciels SAS ou SPSS. Les fichiers int_stu12.sas7bdat
et int_scq12.sas7bdat
correspondent aux fichiers importés par SAS au format natif SAS .sas7bdat
et restreints à la France. Utilisez la fonction read_sas()
pour lire ces fichiers (c’est sur ceux-ci que l’on travaillera désormais).
Utilisez la fonction names()
pour afficher les noms de variables des deux tables. Afin de faciliter les exploitations futures, passez tous ces noms en minuscules.
Affichez les principales caractéristiques des deux objets importés (structure, dimension, nom des variables, etc.). Vérifiez qu’ils ne comportent que des informations relatives à la France.
Afin d’alléger les traitements à venir (pas impératif ici mais toujours utile en pratique), on décide de restreindre les variables d’intérêt à celles identifiées dans les tableaux ci-dessus. Supprimez toutes les autres variables des fichiers.
On souhaite utiliser les informations au niveau de l’établissement dans des exploitations au niveau des élèves. Pour ce faire, il convient de fusionner les tables stu
et sch
sur la base de la variable schoolid
présente dans les deux tables :
schoolid
);Utilisez les fonctions unique()
, intersect()
et setdiff()
pour vérifier que l’identifiant schoolid
prend bien les mêmes valeurs dans les deux tables.
schoolid
est un identifiant pour la table sch
, à savoir : (1) qu’elle est renseignée pour chaque ligne (2) qu’elle prend une valeur distincte pour chaque ligne.
merge()
pour fusionner stu
et sch
par schoolid
dans l’objet stusch
. Vérifiez que ses propriétés sont cohérentes avec le résultat des questions précédentes : même nombre de lignes que stu
, nombre de colonnes égal à celui de stu
et de sch
moins 1.
Inspirez-vous de la note rédigée sur la France pour choisir un sujet d’étude. Par exemple:
Vous pouvez en particulier chercher à recalculer certaines statistiques de la note rédigée sur la France.
Utilisez les fonctions vues lors de la première session du certificat pour mener l’analyse uni- et bi-variée des variables pertinentes pour le sujet d’étude que vous avez choisi. En particulier:
construisez au moins un tri croisé entre deux variables qualitatives et interprétez les sur- ou sous-représentations dans la distribution de la première variable ventilée selon les modalités de la seconde;
calculez le coefficient de corrélation entre deux variables quantitatives et menez le test de nullité de ce coefficient (avec la fonction cor.test()
);
calculez la moyenne d’une variable quantitative ventilée selon les modaliités d’une variable qualitative et effectuez l’analyse de la variance à un seul facteur correspondante pour déterminer si la relation entre ces variables est significative (avec la fonction anova()
).
Proposez des représentations graphiques pertinentes pour synthétiser les relations mises en évidence à la question précédente. Vous pouvez consulter à ce sujet la première partie du support complémentaire pour la partie pratique. En particulier:
construisez au moins un diagramme en bâton ou circulaire à l’aide des fonctions barplot()
ou pie()
et utilisez les options de mise en forme pour améliorer sa présentation (ajouter un titre avec main()
, modifiez les titres des axes avec xlab()
et ylab()
, etc.);
construisez au moins un nuage de points à l’aide de la fonction plot()
;
construisez au moins une série de boîtes à moustache à l’aide de la fonction boxplot()
.
utilisez les fonctionnalités de RStudio (menus déroulants de la fenêtre de graphiques) pour sauvegarder ces graphiques dans la qualité et le format que vous préférez.
Consultez attentivement la deuxième partie du support complémentaire pour la partie pratique puis cherchez à reproduire les graphiques de la question précédente avec ggplot2
.
Sur la mise en oeuvre pratique des méthodes de régressions avec R, ne jamais hésiter à consulter les tutoriels très bien faits de UCLA.
Inspirez-vous de certaines analyses de la note sur la France (par exemple p. 12, sur les performances des élèves issus de l’immigration après contrôle des caractéristiques socio-démographiques) pour proposer des modèles de régression linéaire cohérents avec votre étude. Pensez bien en particulier:
NA
si ce n’est pas déjà le cas);confint.default()
);predict()
et à les représenter.
Utilisez les variables socio-démographiques disponibles pour modéliser la probabilité d’être en retard scolaire au moment de l’enquête. Pensez bien en particulier:
Exportez et mettez en forme vos résultats de façon à pouvoir construire un rapport statistique sur votre étude. En particulier:
intégrez les résultats numériques dans un logiciel d’édition sous forme de tableaux et présentez-les correctement: numéro de tableau, titre, source, note de lecture, décimales homogènes.
intégrez les graphiques dans un logiciel d’édition et présentez-les correctement: numéro de figure, titre, source, note de lecture.
en particulier pour les modèles de régression: choisissez les indicateurs pertinents à représenter (quelques indicateurs d’ajustements, les coefficients, les odds-ratio ou les effets marginaux d’un modèle logistique dichotomique) et la manière de faire apparaître la significativité (par des étoiles - rappelez alors les seuils en note de lecture - avec les p-valeurs ou les erreurs standards).
Consultez attentivement la dernière partie du support complémentaire pour la partie pratique sur Rmarkdown puis créez un nouveau fichier Rmarkdown dans RStudio. Après installation des packages nécessaires, sauvegardez et compilez une première fois le fichier d’exemple. Modifiez petit à petit cette base pour intégrer les exploitations statistiques et la présentation des résultats de votre étude.
conc()
: calcul du pourcentage de concordance d’un modèle logistique dichotomique
conc <- function(m){
un <- m$fitted.values[m$y == 1]
zero <- m$fitted.values[m$y == 0]
t <-rowSums(sapply(un, function(i){
c(sum(i > zero), sum(i < zero), sum(i == zero))
}))
return(c(
"Pct concordant" = t[1] * 100 / sum(t)
, "Pct discordant" = t[2] * 100 / sum(t)
, "Pct ex-aequo"= t[3] * 100 / sum(t)
))
}
margins()
: calcul des effets marginaux moyens dans un modèle logistique dichotomique
margins <- function(fit, factor = NULL){
# fit <- m2; factor <- NULL
if(as.character(fit$call[1]) != "glm")
stop("Le modèle doit avoir été estimé avec la fonction glm().", call. = FALSE)
if(!(fit$family$link %in% c("identity", "log", "inverse", "logit")))
stop("La fonction de lien doit être \"identity\", \"log\", \"inverse\" ou \"logit\"", call. = FALSE)
x1 <- model.matrix(fit)
be <- as.matrix(coef(fit))
vcv <- vcov(fit)
disch <- if(is.null(factor)){
temp1 <-apply(x1,2,function(x)length(table(x))==2)
names(temp1[temp1])
}else factor
invlink <- switch(fit$family$link
, logit = plogis, log = exp, identity = identity, inverse = (function(x) 1/x)
)
invlink_derivative <- switch(fit$family$link
, "logit" = dlogis, "log" = exp, "identity" = identity, inverse = (function(x) -1/x^2)
)
lapply(setNames(disch, disch), function(var){
# var <- "femme"
disx0 = disx1 = x1
disx1[, var] = max(x1[, var])
disx0[, var] = min(x1[, var])
est1 <- mean(invlink(disx1 %*% be))
est0 <- mean(invlink(disx0 %*% be))
est <- est1 - est0
gr = as.numeric(invlink_derivative(disx1 %*% be)) * disx1 - as.numeric(invlink_derivative(disx0 %*% be)) * disx0
avegr = as.matrix(colMeans(gr))
se <- sqrt(t(avegr) %*% vcv %*% avegr)
matrix(c(
est0, est1, est1 - est0
, NA, NA, se
, NA, NA, est/se
, NA, NA, 2 * pt(-abs(est/se), df = Inf)
), nrow = 3, dimnames = list(
c(paste(var, "=", c(0, 1)), "Diff")
, c("Average MFX", "Std. Error", "z value", "P>|z|")
))
})
}
robust()
: calcul d’erreurs standards robustes dans un modèle linéaire (inspiré de cette page)
robust <- function(model, cluster = NULL){
if(!require(multiwayvcov)) stop("Le package multiwayvcov est requis. Installez-le avec install.packages(\"multiwayvcov\")", call. = FALSE)
if(is.null(cluster)) cluster <- 1:length(model$residuals)
return(coeftest(model, cluster.vcov(model, cluster)))
}