Chapitre 9 Travailler avec trois ou quatre variables
Ce chapitre réutilise le fameux exemple de Paul Lazarsfeld combinant trois variables. On explore les différentes possibilités en sélectionnant logiquement, puis empiriquement, les relations causales (CR61 à CR66). Avec un exemple de Richard Lefrançois, on examine ensuite un jeu de quatre variables quantitatives (CR68 à CR74) en utilisant la corrélation partielle du package ppcor. Pour aller beaucoup plus loin sur l'analyse à quelques variables, il faut consulter le classique de Raymond Boudon (1967).
#CR63 packages nécessaires: vcd et questionr
Ici, on commence par reconstituer la base à partir des tableaux de Lazarsfeld. Puisqu'il n'y a que trois variables, et deux valeurs par variable, il est facile d'établir les huit possibilités, d'attribuer les fréquences de Lazarsfeld, puis d'obtenir un data.frame complet avec les 2300 observations. Tout le travail sur cette base est ainsi possible.

library(questionr)
library(vcd)
#Construction de la base grâce à la fonction de répétition rep()
base = data.frame(AGE=c("jeunes", "jeunes",
"jeunes","jeunes","vieux","vieux","vieux","vieux"),
INSTRUCTION=c("inférieures","inférieures", "supérieures","supérieures", "inférieures",
"inférieures","supérieures","supérieures"), EMISSIONS=c("n'écoutent pas",
"écoutent","n'écoutent pas","écoutent","n'écoutent pas",
"écoutent","n'écoutent pas","écoutent"),
frequences=c(292,108,408,192,731,169,192,208))

base = base[rep(row.names(base), base$frequences),]

t1=table(base$EMISSIONS,base$AGE)
addmargins(t1)
cprop(t1)
assocstats(t1)
chisq.test(t1)
Complément: utilisation de la fonction matrix. #CR63 package nécessaire: vcd, questionr (anciennement rgrs)
Dans le code précédent, la base a été reproduite par le jeu des répétitions. Ici, on y va plus simplement, du moins pour un tableau unique. Avec la fonction matrix(), on reproduit le premier tableau (t1). Cela est utile quand on veut travailler un tableau de données déjà construit, sans qu'on ait accès aux données elles-mêmes. Évidemment, les résultats sont identiques! Particulièrement utile pour les méta-analyses.

library(vcd)
library(questionr)
tt=matrix(c(300,700,377,923), nrow=2) #ncol pour nombre de colonne. L'enregistrement se fait colonne par colonne: première colonne, première ligne, puis la deuxième ligne, jusqu'à la fin de la premiére colonne. On recommence avec la deuxième colonne.
colnames(tt)=c("jeunes", "vieux")
rownames(tt)=c("écoutent", "n'écoutent pas")
addmargins(tt)
cprop(tt)
assocstats(tt)
chisq.test(tt)
#CR64 packages nécessaires: vcd et questionr

library(vcd)
library(questionr)

#Construction de la base grâce à la fonction de répétition rep()
base = data.frame(AGE=c("jeunes", "jeunes",
"jeunes","jeunes","vieux","vieux","vieux","vieux"),
INSTRUCTION=c("inférieures","inférieures", "supérieures","supérieures", "inférieures",
"inférieures","supérieures","supérieures"), EMISSIONS=c("n'écoutent pas",
"écoutent","n'écoutent pas","écoutent","n'écoutent pas",
"écoutent","n'écoutent pas","écoutent"),
frequences=c(292,108,408,192,731,169,192,208))

base = base[rep(row.names(base), base$frequences),]

t1=table(base$EMISSIONS,base$INSTRUCTION)
t1
addmargins(t1)
cprop(t1)
assocstats(t1)
chisq.test(t1)
#CR65 packages nécessaires: vcd et questionr

library(vcd)
library(questionr)
#Construction de la base grâce à la fonction de répétition rep()
base = data.frame(AGE=c("jeunes", "jeunes",
"jeunes","jeunes","vieux","vieux","vieux","vieux"),
INSTRUCTION=c("inférieures","inférieures", "supérieures","supérieures", "inférieures",
"inférieures","supérieures","supérieures"), EMISSIONS=c("n'écoutent pas",
"écoutent","n'écoutent pas","écoutent","n'écoutent pas",
"écoutent","n'écoutent pas","écoutent"),
frequences=c(292,108,408,192,731,169,192,208))

base = base[rep(row.names(base), base$frequences),]

t1=table(base$INSTRUCTION,base$AGE)
addmargins(t1)
cprop(t1)
chisq.test(t1)
assocstats(t1)
#CR66  packages nécessaires: vcd et questionr

library(vcd)
library(questionr)
#Construction de la base grâce à la fonction de répétition rep()
base = data.frame(AGE=c("jeunes", "jeunes",
"jeunes","jeunes","vieux","vieux","vieux","vieux"),
INSTRUCTION=c("inférieures","inférieures", "supérieures","supérieures", "inférieures",
"inférieures","supérieures","supérieures"), EMISSIONS=c("n'écoutent pas",
"écoutent","n'écoutent pas","écoutent","n'écoutent pas",
"écoutent","n'écoutent pas","écoutent"),
frequences=c(292,108,408,192,731,169,192,208))

base = base[rep(row.names(base), base$frequences),]

base1=subset(base, base$INSTRUCTION=="inférieures")
t1= table(base1$EMISSIONS,base1$AGE)
addmargins(t1)
cprop(t1)
assocstats(t1)
chisq.test(t1)
#CR67 packages nécessaires: vcd et questionr

library(questionr)
library(vcd)
#Construction de la base grâce à la fonction de répétition rep()
base = data.frame(AGE=c("jeunes", "jeunes",
"jeunes","jeunes","vieux","vieux","vieux","vieux"),
INSTRUCTION=c("inférieures","inférieures", "supérieures","supérieures", "inférieures",
"inférieures","supérieures","supérieures"), EMISSIONS=c("n'écoutent pas",
"écoutent","n'écoutent pas","écoutent","n'écoutent pas",
"écoutent","n'écoutent pas","écoutent"),
frequences=c(292,108,408,192,731,169,192,208))

base = base[rep(row.names(base), base$frequences),]

base2=subset(base, base$INSTRUCTION=="supérieures")
t2= table(base2$EMISSIONS,base2$AGE)
addmargins(t2)
cprop(t2)
assocstats(t2)
chisq.test(t2)
#CR68

base = data.frame(AGE=c(0, 0, 0,0,1,1,1,1),
INSTRUCTION=c(0,0,1,1,0,0,1,1), EMISSIONS=c(0,1,0,1,0,1,0,1),
frequences=c(292, 108, 408,192,731,169,192,208))
base = base[rep(row.names(base), base$frequences),]
base$frequences=NULL
round(cor(base),3)
#CR69 package nécessaire: pwr

library(pwr)
pwr.r.test(r=-.29,n=2300,sig.level=.05,alternative="less")
pwr.r.test(r=.20,n=2300,sig.level=.05,alternative="greater")
#CR70

bienetre=c(17,14,16,11,10,15,14,17,8,7,15,15,18,12,13)
sante=c(17,13,15,10,12,16,14,18,7,8,15,14,19,13,14)
age=c(69,65,73,65,75,66,68,70,70,67,77,68,85,75,68)
mobilite=c(18,12,16,9,13,17,15,19,6,8,16,15,18,12,13)
base=data.frame(bienetre,sante, age,mobilite)
base
#CR71

bienetre=c(17,14,16,11,10,15,14,17,8,7,15,15,18,12,13)
sante=c(17,13,15,10,12,16,14,18,7,8,15,14,19,13,14)
age=c(69,65,73,65,75,66,68,70,70,67,77,68,85,75,68)
mobilite=c(18,12,16,9,13,17,15,19,6,8,16,15,18,12,13)
base=data.frame(bienetre,sante, age,mobilite)
base
summary(base)
#CR72

bienetre=c(17,14,16,11,10,15,14,17,8,7,15,15,18,12,13)
sante=c(17,13,15,10,12,16,14,18,7,8,15,14,19,13,14)
age=c(69,65,73,65,75,66,68,70,70,67,77,68,85,75,68)
mobilite=c(18,12,16,9,13,17,15,19,6,8,16,15,18,12,13)
base=data.frame(bienetre,sante, age,mobilite)
round(cor(base),3)
round(cor(base)^2,3)
#CR73

bienetre=c(17,14,16,11,10,15,14,17,8,7,15,15,18,12,13)
sante=c(17,13,15,10,12,16,14,18,7,8,15,14,19,13,14)
age=c(69,65,73,65,75,66,68,70,70,67,77,68,85,75,68)
mobilite=c(18,12,16,9,13,17,15,19,6,8,16,15,18,12,13)
base=data.frame(bienetre,sante, age,mobilite)
base
plot(base, main="Graphiques des relations entre les variables")
#CR74 package nécessaire: ppcor

library(ppcor)
bienetre=c(17,14,16,11,10,15,14,17,8,7,15,15,18,12,13)
sante=c(17,13,15,10,12,16,14,18,7,8,15,14,19,13,14)
age=c(69,65,73,65,75,66,68,70,70,67,77,68,85,75,68)
mobilite=c(18,12,16,9,13,17,15,19,6,8,16,15,18,12,13)
base=data.frame(bienetre,sante, age,mobilite)
pcor.test(base$sante,base$bienetre,base$age )
pcor.test(base$sante,base$bienetre,base$mobilite)
pcor.test(base$mobilite,base$bienetre,base$sante)
#CR75 package nécessaire: ppcor

library(ppcor)
bienetre=c(17,14,16,11,10,15,14,17,8,7,15,15,18,12,13)
sante=c(17,13,15,10,12,16,14,18,7,8,15,14,19,13,14)
age=c(69,65,73,65,75,66,68,70,70,67,77,68,85,75,68)
mobilite=c(18,12,16,9,13,17,15,19,6,8,16,15,18,12,13)
base=data.frame(bienetre,sante, age,mobilite)
round(pcor(base)$estimate,2)
round(pcor(base)$p.value,2)
#CR76 package nécessaire: pwr

library(pwr)
bienetre=c(17,14,16,11,10,15,14,17,8,7,15,15,18,12,13)
sante=c(17,13,15,10,12,16,14,18,7,8,15,14,19,13,14)
age=c(69,65,73,65,75,66,68,70,70,67,77,68,85,75,68)
mobilite=c(18,12,16,9,13,17,15,19,6,8,16,15,18,12,13)
base=data.frame(bienetre,sante, age,mobilite)
pwr.r.test(r=.66,n=15,sig.level=.05,alternative="less")
pwr.r.test(r=.79,n=15,sig.level=.05,alternative="greater")