MAT 3775 - Analyse de la régression

 


Table des matières
Télécharger et installer R
Exemple 1 : Travailler à la console
Exemple 2 : Affection d'une variable
Exemple 3 : L'éditeur de R.
Exemple 4 : Statistiques descriptives (univariées)
Exemple 5 : Statistiques descriptives (bivariées)
Exemple 6 : Loi de probabilité
Exemple 7 : Importer des données d'un fichier
Exemple 8 : Nuage de points et la surperposition d'une courbe lisse
Exemple 9 : Opérations sur une colonne
Exemple 10 : Ajuster un modèle linéaire avec la fonction lm
Exemple 12 : L'analyse de variance avec un objet lm
Exemple 13 : Un test F partiel pour comparer deux modèles
Exemple 14 : Une variable explicative binaire
Exemple 15 : La signification d'une corrélation
Exemple 21 : Introduction au modèle de régression linéaire multiple (aussi dit modèle linéaire)
Exemple 23 : Comparer des modèles emboités pour tester des hypothèses (Test F partiel)
Exemple 24 : Test de la signifcation de la régression
Exemple 25 : La loi F non-centrée et la puissance
Exemple 31 : La régression polynomiale
Exemple 32 : Une spline linéaire
Exemple 33 : Interaction entre prédicteurs
Exemple 34 : Test de l'inadéquation de l'ajustement (Test for lack-of-fit)
Exemple 35 : Diagnostique
Exemple 36 : Diagnostique pour l'homoscédascité
Exemple 37 : Correction de White pour l'hétéroscédasticité
Exemple 38 : Diagnostique pour la normalité
Exemple 39 : Construire un modèle
Exemple 40 : Aberrance en X et en Y -- Influence







 

 

Télécharger et installer R

 

 

 

 



Exemple 1 : Travailler à la console



Ci-dessous, on a un affiche de la console de R. Nous entrons des commandes à l'invite >.


Nous pouvons utiliser R comme une calculatrice. Nous avons calculé (1/8)*ln(2^3)+5. La réponse est 5,25993.


Il y a une console dans Rstudio. C'est dans la fenêtre en bas à gauche.


Exemple 2 : Affection d'une variable





Exemple 3 : L'éditeur de R







Exemple 4 : Statistiques Descriptives (univariées)



Soit x un vecteur numérique. Pour notre exemple, considérons l'attribution suivante :
x=c(16,15,14,16,13,12,14,13,10)






Exemple 5 : Statistiques Descriptives (bivariées)



Considérons les deux variables numériques suivantes : y=nombres de rhumes en 6 ans et x=la dose journalière de vitamine C (en mg). Voici l'attribution des valeurs dans R.
y<-c(16,15,14,16,13,12,14,13,10)
x<-c(0,0,0,25,25,25,50,50,50)

Exemple 6 : Loi de probabilités



Loi de probabilités Nom en R arguments
béta beta shape1, shape2, ncp
binomiale binom size, prob
Cauchy cauchy location, scale
khi-deux chisq df, ncp
exponentielle exp rate
F f df1, df2, ncp
gamma gamma shape, scale
géométrique geom prob
hypergéometric hyper m, n, k
log-normale lnorm meanlog, sdlog
logistique logis location, scale
binomiale négative nbinom size, prob
normale norm mean, sd
Poisson pois lambda
rang signé signrank n
t de Student t df, ncp
uniforme unif min, max
Weibull weibull shape, scale
Wilcoxon wilcox m, n


Le tableau ci-haut contient certaines lois de probabilités en R. On utilise le nom de la loi avec un préfixe. Voici la liste des préfixes:

Voici quelques exemples de son utilisation.

Supposons qu'on veut calculer P(Z>1.65), P(U>12.6), P(T>1.71) et P(F>1.85), où Z suit une loi N(0,1), U suit une loi khi-deux avec 6 degrés de liberté, T suit une loi t(24) et F suit une loi F(20,15). Voici les commandes.
> 1-pnorm(1.65)
[1] 0.04947147
> 1-pchisq(12.6,6)
[1] 0.04984649
> 1-pt(1.71,24)
[1] 0.05008269
> 1-pf(1.85,20,15)
[1] 0.1140452
Alors, P(Z>1.65)=0.049471, P(U>12.6)=0.0498469, P(T>1.71)=0.05008269, P(F>1.85)=0.1140452.

Le quantile d'ordre p (pour la variable aléatoire X) est une valeur q tel que F(q)=P(X<=q)=p. [Si X est discrète, alors c'est la plus petite quantité q tel que P(X<=q)>=p.] Par exemple, considérons t(0,975;43), qui est le quantile d'ordre 0,975 de la loi t avec 43 degrés de liberté. Alors, si T est une variable aléatoire t(43), alors P[T<=t(0,975;43)]=0,975. La commande pour obtenir t(0,975;43) est ci-bas.
> qt(0.975,43)
[1] 2.016692
Alors t(0,975;43)=2.016692.

Supposons qu'on veut générer 10 valeurs d'une loi normale de moyenne 46 et d'écart type 7. Voici la commande.
> rnorm(10,46,7)
 [1] 46.93336 55.43874 39.04338 56.84523 52.93618 39.41287 31.94741 43.18834
 [9] 45.07614 51.84981


Exemple 7 : Importer des données d'un fichier



Nous allons sauvegarder nos données dans un fichier de format CSV (c'est-à-dire un fichier avec des colonnes délimitées par des virgules).

Commentaires:




Exemple 8 : Nuage de points avec une courbe lisse



Exemple: Dans le fichier
cerveaux.csv, nous avons n = 25 espèces de mamifères (les rangés). Nous avons deux variables pour décrire chacune des espèces : masse (en grammes), et gestation (en jours). Nous importons le fichier et nous affichons quelques rangés avec la fonction head.

> cerveau<-read.csv("cerveaux.csv")
> head(cerveau)
  masse..grammes. gestation..en.jours.
1              10                   50
2              10                   55
3              12                   56
4              12                   75
5              12                   85
6              45                   86


En supposant que x et y sont des vecteurs numériques, on peut utiliser la fonction plot(x,y) pour construire un nuage de point de y contre x.

Avec la commande suivante, nous allons construire un nuage de point de la masse du cerveau à la naissance contre la durée de la période de gestation.

with(cerveau, plot(gestation..en.jours.,masse..grammes.,xlab="Gestation (en jours)",ylab="Masse du cerveau (en grammes)"))


Voici le nuage de points.

Afin de mieux visualier le lien entre les deux variables nous pouvons ajouter une courbe lisse au diagramme.

## ajuster une courbe lisse (loess=lowess=locally weighted scatterplot smoothing)
mod.loess<-loess(masse..grammes.~gestation..en.jours.,data=cerveau)
## obtenir l'étendue pour x
range(cerveau$gestation..en.jours.)
## construire un nouveau jeu de données
new.data<-data.frame(gestation..en.jours.=seq(50,270,by=10))
## add Lowess Smooth to the plot
with(new.data,lines(x=gestation..en.jours.,y=predict(mod.loess,new.data),lty=2))
Commentaires: Voici le nuage de points avec la superposition d'une courbe lisse.



Corrélation de Spearman:





N.B.: Pour visualiser la linéarité ou non-linéarité d'une association entre deux variables numériques, nous pouvons aussi superimposer une droite estimée sur le nuage de points. On peut utiliser la fonction lm pour obtenir la droite des moindres carrés et utiliser la fonction abline pour ajouter cette droite au nuage de points. Pour ajouter la droite au nuage de points et aussi une légende, on utilise les commandes suivantes:

# estimer la droite
mod<-lm(masse..grammes.~gestation..en.jours.,data=cerveau)
# ajouter la droite au diagramme
abline(mod)
legend("topleft",legend=c("droite estimée","courbe lisse"),
       lty=c(1,2),inset=0.05)


Voici le diagramme résultant.





Exemple 9 : Opérations sur une colonne et transformations d'une variable



Soient x et y des variables numérique ayant le même nombre de rangés. Soit a un scalaire (c-à-d un nombre).

Remarque: La plupart des opérations sur les colonnes sont définies par rangée (c'est-à-dire par composante).
a+x        # additionne a à chaque composante
a*x        # multiplier a à chaque composante
x/a        # diviser chaque composante par a
x+y        # addition par composante
x*y        # multiplication par composante
log(x)     # appliquer ln à chaque composante
sqrt(x)    # appliquer la racine carrée à chaque composante
x^a        # appliquer la puissance à chaque composante
abs(x)     # appliquer la valeur absolue à chaque composante
Voici quelques fonctions pratiques :
sum(x)       # la somme des composantes de x
length(x)    # le nombre de composantes
Exemple : Considérons l'échantillon aléatoire suivant : 10, 12, 11, 12, 15, 20, 16. Calculons la variance de l'échantillon en utilisant les opérations sur les colonnes. Ensuite vérifions notre calcul avec la fonction var.
> x=c(10, 12, 11, 12, 15, 20, 16)
> sum((x-mean(x))^2)/(length(x)-1)
[1] 12.2381
> var(x)
[1] 12.2381
Rappel: La définition de la variance de l'échantillon est
s2=ni=1(xix¯)2n1.
Là considérons la variable y=c(11, 12, 11, 13, 14, 18, 17). Calculons la covariance entre x et y avec les opérations sur les colonnes. Ensuite vérifions nos calculs avec la fonction cov.
> sum((x-mean(x))*(y-mean(y)))/(length(x)-1)
[1] 9.404762
> cov(x,y)
[1] 9.404762
Rappel: La définition de la covariance de l'échantillon est x et y est
σ^X,Y=ni=1(xix¯)(yiy¯)n1.




Exemple [Carburant] : Considérons les données dans le fichier
evaporation.csv. Ce sont des mesures de la vélocité dans l'air (en cm/s) et du coefficient d'évaporation de carburant (en mm2/s) brûlant dans un moteur d'impulsion. Utilisons la notation suivante : x=la vélocité et y=l'évaporation du carburant.

On importe les données avec R et on affiche quelques rangés.
> carburant<-read.csv("evaporation.csv")
> head(carburant)
  Velocite Evaporation
1       20        0.18
2       60        0.37
3      100        0.35
4      140        0.78
5      180        0.56
6      220        0.75


Nous calculons les sommes suivantes avec R:
i=1nxi=2220; i=1nyi=9,1; i=1ny2i=9,6722; i=1nx2i=580400; i=1nxiyi=2340,4.


> x<-carburant$Velocite
> y<-carburant$Evaporation
> sum(x)
[1] 2220
> sum(y)
[1] 9.1
> sum(x^2)
[1] 580400
> sum(y^2)
[1] 9.6722
> sum(x*y)
[1] 2340.4









Exemple 10 : Ajuster un modèle linéaire avec la fonction lm



Exemple [Carburant] : Considérons les données dans le fichier
evaporation.csv. Ce sont des mesures de la vélocité dans l'air (en cm/s) et du coefficient d'évaporation de carburant (en mm2/s) brûlant dans un moteur d'impulsion. Utilisons la notation suivante : x=la vélocité et y=l'évaporation du carburant.

On importe les données avec R et on affiche quelques rangés.
> carburant<-read.csv("evaporation.csv")
> head(carburant)
  Velocite Evaporation
1       20        0.18
2       60        0.37
3      100        0.35
4      140        0.78
5      180        0.56
6      220        0.75
On peut utiliser la fonction lm pour ajuster le modèle linéaire pour décrire l'évaporation du carbutant un fonction de la vélocité dans l'air.

> mod<-lm(Evaporation ~ Velocite, data=carburant)
> mod

Call:
lm(formula = Evaporation ~ Velocite, data = carburant)

Coefficients:
(Intercept)     Velocite
   0.059033     0.003807


Alors, le modèle linéaire estimé est Evaporationˆ=0.059033+0.003807velocité.

Commentaires:





Exemple 12 : L'analyse de variance avec un objet lm



Exemple: Considérons les données sont dans le fichier suivant:
VC.csv. Sauvegarder le fichier dans votre répertoire de travail (current working directory).

Rappel: C'est une étude avec des volontaires en bonne santé. Un stimulus est appliqué aux doigts du sujet et on mesure la vitesse de conduction de la moelle épinière (VC). On veut décrire l'association entre la taille de l'indivu (en cm) et la vitesse de conduction de la moelle épinière pour les individus en bonne santé.

On importe les données avec R et on affiche quelques rangés.
> VC <- read.csv("VC.csv")
> head(VC)
  Taille.en.cm   VC
1          149 14.4
2          149 13.4
3          155 13.5
4          155 13.5
5          156 13.0
6          156 13.6
Utilisons un modèle linéaire simple pour décrire la vitesse de conduction de la moelle épinière en fonction de la taille de l'individu (en cm). La fonction de la moyenne est
E[Y|X=x]=β0+β1x.
Nous voulons tester pour la signification de la taille de l'individu en confrontant
H0: β1=0    contre    Ha: β10.
(Puisque nous avons un modèle simple, ceci est aussi dit un test pour la signification de la régression.) Nous pouvons tester ces hypothèses avec la statistique t=b1/s{b1}. Mais, une autre approche est d'utiliser une analyse de variance (ANOVA). Pour obtenir le tableau d'ANOVA, on peut mettre l'objet lm dans la fonction anova.

> mod<-lm(VC ~ Taille.en.cm, data=VC)
> anova(mod)
Analysis of Variance Table

Response: VC
              Df Sum Sq Mean Sq F value    Pr(>F)
Taille.en.cm   1 287.56 287.563   391.3 < 2.2e-16 ***
Residuals    153 112.44   0.735
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Commentaires:

Exemple 13 : Un test F partiel pour comparer deux modèles



Exemple: Considérons les données sont dans le fichier suivant:
VC.csv. Sauvegarder le fichier dans votre répertoire de travail (current working directory).

Rappel: C'est une étude avec des volontaires en bonne santé. Un stimulus est appliqué aux doigts du sujet et on mesure la vitesse de conduction de la moelle épinière (VC). On veut décrire l'association entre la taille de l'indivu (en cm) et la vitesse de conduction de la moelle épinière pour les individus en bonne santé.

On importe les données avec R et on affiche quelques rangés.
> VC <- read.csv("VC.csv")
> head(VC)
  Taille.en.cm   VC
1          149 14.4
2          149 13.4
3          155 13.5
4          155 13.5
5          156 13.0
6          156 13.6
Utilisons un modèle linéaire simple pour décrire la vitesse de conduction de la moelle épinière en fonction de la taille de l'individu (en cm). La fonction de la moyenne est
E[Y|X=x]=β0+β1x.
Nous voulons tester pour la signification de la taille de l'individu en confrontant
H0: β1=0    contre    Ha: β10.
(Puisque nous avons un modèle simple, ceci est aussi dit un test pour la signification de la régression.) Nous pouvons tester ces hypothèses avec la statistique t=b1/s{b1}.

Nous allons vous présenter une autre approche au test dit le test F partiel, qui est une comparaison de modèles. Si H0:β1=0 est vraie, alors nous imposons une contrainte \`a l'espace des param\`etres et ceci réduit le modèle. La fonction de la moyenne du modèle réduit est
E[Y|X=x]=β0.
Alors, voici une autre façon d'écrire les hypothèses\:
H0: E[Y|X=x]=β0    contre    Ha: E[Y|X=x]=β0+β1x.
Pour évaluer les preuves contre H0 en faveur de Ha, nous allons comparer l'ajustement des deux modèles tel que décrit par la somme des carrés résiduelles. Avec R, on ajuste les deux modèles et pour les comparer on met les deux objets dans la fonction anova.
> mod<-lm(VC ~ Taille.en.cm, data=VC)
> ## modele réduit
> mod0<-lm(VC ~ 1, data=VC)
> mod<-lm(VC ~ Taille.en.cm, data=VC)
> ## modele réduit
> mod0<-lm(VC ~ 1, data=VC)
> anova(mod0,mod)
Analysis of Variance Table

Model 1: VC ~ 1
Model 2: VC ~ Taille.en.cm
  Res.Df    RSS Df Sum of Sq     F    Pr(>F)
1    154 400.00
2    153 112.44  1    287.56 391.3 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Nous comparons la somme des carrés du modèle complet SSE=112,44 à la somme des carrés du modèle réduit SSE(R)=400,00, en calculant la somme des carrés supplémentaires
ExtraSS=SSE(R)SSE=287.56.
Plus que cette somme de carrés supplémentaire est grande, plus que nous considérerons le modèle réduit comme étant moins bien ajusté en comparaison au modèle complet. Si ces preuves sont fortes, alors nous avons des preuves contre H0 en faveur de Ha que la pente est non-nulle.



Exemple 14 : Une variable explicative binaire



Exemple [Azote] : Une étude fut menée sur le développement de l'ectomycorhizue, une relation symbiotique entre les racines des arbres et un champignon, dans lequel les minéraux sont transférés du champignon aux arbres et du sucre des arbres au champignon, 20 semis de chênes rouges du nord exposés au champignon pisolithus tinctorus ont été cultivés dans une serre. Toutes les semis ont été plantées dans le même type de terre et ont reçu la même quantité de soleil et d'eau. La moitié des semis (choisis au hasard) ont reçu un traitement de 368 ppm d'azote sous la forme NaNO3. Les autres semis n'ont pas reçu d'azote. La masse de la tige, en grammes, est mesurée après 140 jours. Les données sont dans le fichier
Azote.csv.

Nous importons les données et nous affichons quelques rangés. On remarque que la variable Azote est une variable catégorique.
> azote<-read.csv("Azote.csv")
> head(azote)
  Masse Azote
1  0.59   non
2  0.47   non
3  0.25   non
4  0.36   non
5  0.42   non
6  0.19   non


Affichons les catégories de la variable Azote. R considère la première catégorie comme la catégorie de référence. Alors, ne pas avoir reçu de l'azote est considéré comme le groupe de référence. On peut changer l'ordre des catégories afin que le groupe de traitement d'azote soit le groupe de référence avec la fonction factor.
> levels(azote$Azote)
[1] "non" "oui"
> azote$Azote<-factor(azote$Azote, levels=c("oui","non"))
> levels(azote$Azote)
[1] "oui" "non"
Commentaire: Si nous avons un groupe de contrôle, c'est ce groupe qui est souvent utilisé comme le groupe de référence. Alors, nous allons changer l'ordre afin que le groupe sans azote soit le groupe le premier groupe.
> azote$Azote<-factor(azote$Azote, levels=c("non","oui"))


Voici des statistiques descriptives pour la masse de la tige (y) pour chacun des groupes.
> aggregate(Masse~Azote,data=azote,FUN=mean)
  Azote Masse
1   non 0.392
2   oui 0.628
> aggregate(Masse~Azote,data=azote,FUN=var)
  Azote      Masse
1   non 0.01355111
2   oui 0.01819556
> aggregate(Masse~Azote,data=azote,FUN=length)
  Azote Masse
1   non    10
2   oui    10
En alternatif, on peut utiliser la fonction tapply.
> moyenne<-with(azote,tapply(Masse,Azote,mean))
> variance<-with(azote,tapply(Masse,Azote,var))
> n<-with(azote,tapply(Masse,Azote,length))
> data.frame(moyenne,variance,n)
    moyenne   variance  n
non   0.392 0.01355111 10
oui   0.628 0.01819556 10


Remarque: Avec la commande tapply(y,x,FUN), on évalue la fonction FUN sur la variable y selon les niveaux de la variable x.

En supposant que le groupe de contrôle soit le groupe 1 et que le groupe de traitement soit le groupe 2, on a
y¯1=0,392; y¯2=0,628; s21=0,013551; s22=0,018196;  n1=n2=10.
Si on suppose que les variances des deux populations sont égales, alors on peut estimer cette variance avec la variance pondérée
s2p=(n11)s21+(n21)s22n1+n22=0,014286.


Avec R :
> ## variance poindérée
> sum(variance*(n-1)/sum(n))
[1] 0.014286
Pour comparer les deux groupes visuellement, on peut utiliser des diagrammes à boîte comparatifs avec une superposition de points.
boxplot(Masse~Azote,data=azote,ylab="Masse",
names=c("Sans azote","Avec azote"))
stripchart(Masse~Azote,data=azote,method="jitter",
vertical = TRUE,add=TRUE)
Voici le diagramme correspondant.



On peut utiliser un test T de Student pour comparer les deux moyennes. La valeur observée de la statistique du test est
t=y¯1y¯2sp1/n1+1/n2=4,1885.
La valeur p est 2P(T(18)>|4,1885|)=0,0005521.

Avec R :
> t.test(Masse~Azote,data=azote,var.equal=TRUE)

        Two Sample t-test

data:  Masse by Azote
t = -4.1885, df = 18, p-value = 0.0005521
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.3543747 -0.1176253
sample estimates:
mean in group non mean in group oui
            0.392             0.628


On peut utiliser une approche de régression pour faire ce test. (Ceci va nous aider à généraliser le test à la comparaison de plus que 2 groupes plus tard.)

Pour identifier les groupes, nous allons utiliser une variable muette (dummy variable en anglais)~:
xi={1,0,group de traitementsinon.
Consid\'erons le modèle de régression linéaire simple: Y1,Y2,,Yn sont normales, ind\'ependantes tel que
E[Yi]=β0+β1xi={β0=μ1,β0+β1=μ2,xi=0xi=1
et $V[Y_i]=\sigma^2. Alors, nous avons deux populations normales indépendantes avec des variances égales.

Quand notre variable explicative est une variable catégorique (ceci est dit factor dans la terminologie de R), alors R va coder des variables muettes correspondantes. Pour afficher ces variables muettes, on utilise la fonction contrasts.
> contrasts(azote$Azote)
    oui
non   0
oui   1
On interprète la variable de la façon suivante. Ceci est utilisé pour identifier la catégorie oui. Elle est égale à 0, si l'unité est non. Elle est égale à 1, si l'unité est oui.

Ajustons le modèle linéaire pour décrire la masse selon le groupe de traitement.
> mod<-lm(Masse~Azote,data=azote)
> mod$coefficients
(Intercept)    Azoteoui
      0.392       0.236
> summary(mod)$sigma^2
[1] 0.01587333
Alors, notre estimation de la masse moyenne est
μ^Y|X=x=b0+b1x={b0=0.392,b0+b1=0.392+0.236=0.628,x=0x=1
L'estimation de la variance σ2 est MSE=0.01587333. Remarquons que ceci nous donne y¯1, y¯2, et s2p, respectivement.

Remarquons que μ1=μ2 si et seulement si β1=0. Alors tester pour la signification de la variable explicative qui identifie le traitement est interpréter comme un test pour l'égalité des moyennes. La valeur observée de la statistique du test est t=b1/s{b1}=4,1885 et la valeur p du test est 2P(T(18)>|4,1885|)=0,0005521.

> summary(mod)$coefficients
            Estimate Std. Error  t value     Pr(>|t|)
(Intercept)    0.392 0.03984135 9.839024 1.145796e-08
Azoteoui       0.236 0.05634418 4.188543 5.520945e-04








Exemple 15 : Inférence concernant une corrélation

Exemple [VC] : Considérons les données sont dans le fichier suivant:
VC.csv. Sauvegarder le fichier dans votre répertoire de travail (current working directory).

Rappel: C'est une étude avec des volontaires en bonne santé. Un stimulus est appliqué aux doigts du sujet et on mesure la vitesse de conduction de la moelle épinière (VC). On veut décrire l'association entre la taille de l'indivu (en cm) et la vitesse de conduction de la moelle épinière pour les individus en bonne santé.

On importe les données avec R et on affiche quelques rangés.
> VC <- read.csv("VC.csv")
> head(VC)
  Taille.en.cm   VC
1          149 14.4
2          149 13.4
3          155 13.5
4          155 13.5
5          156 13.0
6          156 13.6


Supposons que nous voulons testez H0:ρ=0 (o\`u ρ est la corrélation (de Pearson) entre la vitesse de conduction et la taille de l'individu) contre Ha:ρ0. On peut utiliser la fonction cor.test.

> with(VC,cor.test(Taille.en.cm,VC))

        Pearson's product-moment correlation

data:  Taille.en.cm and VC
t = 19.781, df = 153, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.7967316 0.8869721
sample estimates:
      cor
0.8478829
Alors, la valeur observée de la statistique du test est
t=rn21r2=19,781.
La valeur p est 2P(T(153)>|19,781|)<0,00001. Les preuves que la corrélation est non-nulle sont significatives.

Commentaires:



Exemple 21 : Introduction au modèle de régression linéaire multiple (aussi dit modèle linéaire)






Exemple [Examen SAT en 1999]: Considérons les données de une étude des résultats aux examens SAT aux Etats-Unis en 1999. Les données sont dans le fichier :
sat.csv. On importe les données et on affiche quelques rangés du jeu de données.

> SAT<-read.csv("sat.csv")
> head(SAT)
         State Expenditure.per.student student.teacher.ratio Avg.teacher.salary Percent.taking verbalSAT99 mathSAT99 totalSAT99
1    "Alabama"                   4.405                  17.2             31.144              8         491       538       1029
2     "Alaska"                   8.963                  17.6             47.951             47         445       489        934
3    "Arizona"                   4.778                  19.3             32.175             27         448       496        944
4   "Arkansas"                   4.459                  17.1             28.934              6         482       523       1005
5 "California"                   4.992                  24.0             41.078             45         417       485        902
6   "Colorado"                   5.443                  18.4             34.571             29         462       518        980
> dim(SAT)
[1] 50  8


Commentaires: Il y a 50 unités statistiques (les rangés). Les unités sont les 50 états aux Etats-Unis. Nous avons 8 variables pour décrire ces unités. Les trois premières variables sont 3 variables définie au niveau de l'état qui pourrait être lié aux résultats aux examens du SAT.

Nous voulons étudier le lien entre le revenu moyen des enseignents et les résultats aux SAT (test standardisé utilisé pour les admissions au collège aux Etats-Unis) en 1999. On observe que l'association entre le salaire moyen et les résultats aux SAT est significative (p = 0,0031). Cette association est approximativement linéaire, négative avec une corrélation de r=R2=0,44.



Avec R :
> with(SAT,plot(Avg.teacher.salary,totalSAT99,xlab="Salaire Moyen",ylab="SAT (Math et Verbal)"))
> mod<-lm(totalSAT99~Avg.teacher.salary,data=SAT)
> abline(mod)
> summary(mod)

Call:
lm(formula = totalSAT99 ~ Avg.teacher.salary, data = SAT)

Residuals:
     Min       1Q   Median       3Q      Max
-147.125  -45.354    4.073   42.193  125.279

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)
(Intercept)        1158.859     57.659  20.098  < 2e-16 ***
Avg.teacher.salary   -5.540      1.632  -3.394  0.00139 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 67.89 on 48 degrees of freedom
Multiple R-squared:  0.1935,    Adjusted R-squared:  0.1767
F-statistic: 11.52 on 1 and 48 DF,  p-value: 0.001391



Question : Est-ce que nous avons identifié un lien causal? Est-ce que le salaire élevé des enseignants de certains états est la cause des résultats médiocres aux tests? Est-ce que certains états devraient réduire le salaire des enseignants pour améliorer la performance des étudiants aux tests?

Réponse : Non, quand nous observons une association significative entre deux variables, ceci ne veut pas nécessairement impliquer qu'une est la cause de l'autre. Il peut exister une autre variable qui est liée aux deux variables et qui explique l'assocation qu'on ait observée. Si une telle variable existe, elle est dite une variable confusionnelle (confounding variable en anglais).

Variable confusionnelle possible : Essayons de penser à une explication du phénomène ci-haut qui va contre le bon sense. Il est possible que le taux de participation au test soit lié aux résultats et aux salaires.



Stratification des unités avec une variable muette : La médiane du taux de participation est 28%, alors nous allons utiliser ce niveau pour définir une variable muette :

MuetteHaut={1;0;taux de participation 28%taux de participation <28%


Nous avons diviser les états en 2 groupes : haut taux de participation et faible taux de participation.

Avec R :
> summary(SAT$Percent.taking)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
   4.00    9.00   28.00   35.24   63.00   81.00
> ## definir une variable muette
> SAT$MuetteHaut<-as.numeric(SAT$Percent.taking>=28)


Commentaire:

Un modèle linéaire pour estimer les deux droites: Considérons un modèle linéaire avec 3 variables indépendantes :
x1=MuetteHaut;  x2=Salaire moyen;  x3=MuetteHaut * Salaire moyen.
La fonction de la moyenne pour ce mod\`ele est
E{Y}==β0+β1x1+β2x2+β3x3{β0+β1+(β2+β3)(salaire moyen),β0+β2(salaire moyen),MuetteHaut =1MuetteHaut =0


L'estimation par les moindres carrés nous donne:

Strate Ordonnée à l'origine Pente
MuetteHaut = 1 b0+b1=861,05 b2+b3=1,0657
MuetteHaut = 0 b0=1035,71 b2=0,1733


Avec R:
> ## fonction I() nous permet d'appliquer des operations
> ## sur des colonnes du dataframe
> mod<-lm(totalSAT99~MuetteHaut+Avg.teacher.salary+I(MuetteHaut*Avg.teacher.salary),data=SAT)
> mod$coefficients
                       (Intercept)                         MuetteHaut                 Avg.teacher.salary
                      1035.7189251                       -174.6680327                         -0.1733339
I(MuetteHaut * Avg.teacher.salary)
                         1.2390482
> OrdHaut=mod$coefficients[1]+mod$coefficients[2]
> PenteHaut=mod$coefficients[3]+mod$coefficients[4]
> OrdBas=mod$coefficients[1]
> PenteBas=mod$coefficients[3]
> ## parametres (estimes) des deux droites
> c(OrdHaut,PenteHaut,OrdBas,PenteBas)
       (Intercept) Avg.teacher.salary        (Intercept) Avg.teacher.salary
       861.0508923          1.0657143       1035.7189251         -0.1733339


Revoici le nuage de points avec la superposition des deux droites.



with(SAT,plot(Avg.teacher.salary,totalSAT99,
xlab="Salaire Moyen",ylab="SAT (Math et Verbal)",
col=factor(MuetteHaut), cex=1.25))
with(SAT,text(Avg.teacher.salary,totalSAT99,MuetteHaut,cex=0.75, pos=4))
abline(OrdHaut,PenteHaut)
abline(OrdBas,PenteBas,lty=2)



Taux de participation comme variable quantitative : Dans la pratique, si la variable confusionnelle est une variable quantitative, alors on devrait l'inclure dans le modèle comme une des variables indépendantes. C'est-à-dire, on ne devrait pas transformer une variable quantitative en variable catégorique. La plupart du temps ceci cause une dimimution de précision et de puissance. Nous utilisons un modèle linéaire ou le résultat total aux tests SAT est la variable dépendante et les variables indépendantes sont le salaire moyen et le taux de participation. La valeur explicative du modèle est décrite avec R2=80,56% et R2a=79,73%. L'écart type résiduel est se=33,69. L'association entre le taux de participation et les résultats aux tests SAT est significative et négative. Tandis que l'association entre le salaire moyen des enseignants et le résultat au SAT est significative et positive.

> mod<-lm(totalSAT99~Avg.teacher.salary+Percent.taking,data=SAT)
> summary(mod)

Call:
lm(formula = totalSAT99 ~ Avg.teacher.salary + Percent.taking,
    data = SAT)

Residuals:
    Min      1Q  Median      3Q     Max
-78.313 -26.731   3.168  18.951  75.590

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)
(Intercept)        987.9005    31.8775  30.991   <2e-16 ***
Avg.teacher.salary   2.1804     1.0291   2.119   0.0394 *
Percent.taking      -2.7787     0.2285 -12.163    4e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 33.69 on 47 degrees of freedom
Multiple R-squared:  0.8056,    Adjusted R-squared:  0.7973
F-statistic: 97.36 on 2 and 47 DF,  p-value: < 2.2e-16


Le modèle linéaire estimée est
Total SATˆ=987,9005+2,1804(Salaire Moyen)2,7787(Taux de participation (en %)).












Exemple 23 : Comparer des modèles emboités pour tester des hypothèses (Test F partiel)




Considérons un modèle linéaire avec la matrice du plan X de taille n×p. Supposons que nous voulons tester H0 qui nous donne un modèle réduit qui est emboité dans notre modèle. Supposons que X0 de taille n×q est la matrice du plan du modèle réduit, où les colonnes de X0 appartiennent à l'espace colonne de X. On peut tester H0 avec la statistique F suivante:
F=ExtraSS/(pq)SSE/(np),   où   ExtraSS=SSE(R)SSE.
Plus que ExtraSS est grande, plus que nous avons des preuves contre H0. Sous H0, la statistique suit une loi F(pq,np). Alors, la valeur-p est P(F(pq,np)>F), où F est la valeur observée de la statistique.

Exemple [Rétablissement]: Considérons les données d'une étude observationnelle bio-médicale. Les participants de cette étude dans une étude a subi une opération du genou. La variable dépendante est le temps de rééducation, et la variable explicative est une variable catégorique décrivant la forme du patient avant une intervention chirurgicale (1 = inférieur à la moyenne; 2 = moyen; 3 = supérieur à la moyenne). Les 24 participants sont des hommes de 18 ans à 30 ans. Nous avons aussi l'âge du participant dans le jeu de données. Les données sont dans le fichier :
genou.csv. On importe les données et on affiche quelques rangés du jeu de données. On change type du vecteur \verb|genou| en vecteur catégorique et on affiche ces niveaux.

> genou<-read.csv("genou.csv")
> head(genou)
  Temps Groupe  Age
1    29      1 18.3
2    42      1 30.0
3    38      1 26.5
4    40      1 28.1
5    43      1 29.7
6    40      1 27.8
> genou$Groupe<-factor(genou$Groupe)
> levels(genou$Groupe)
[1] "1" "2" "3"


Remarques:

Nous allons utliser un modèle linéaire pour décrire le temps de rétablissement selon la forme. La fonction de la moyenne du modèle linéaire est \[ E\{Y\}=\beta_0+\beta_1\,\,I\{\mbox{Groupe}=2\} +\beta_2\,I\{\mbox{Groupe}=3\}. \] Ici on utilise la notation \(I\) pour une fonction indicatrice, où \(I(A)=1\), si \(A\) est réalisé, sinon \(I(A)=0\). Alors, on a \[ \begin{eqnarray*} E\{Y\} &=&\beta_0+\beta_1\,\,I\{\mbox{Groupe}=2\} +\beta_2\,I\{\mbox{Groupe}=3\} \\ &=& \left\{ \begin{array}{ll} \beta_0=\mu_1, & \mbox{Groupe}=1\\ \beta_0+\beta_1=\mu_2 & \mbox{Groupe}=2\\ \beta_0+\beta_2=\mu_3 & \mbox{Groupe}=3\\ \end{array} \right. \end{eqnarray*} \] Remarques: Nous ajustons le modèle d'ANOVA pour décrire le temps de rétablissement selon la forme du patient. Le modèle est significatif \((F(2,21)=16.96; p<0.0001)\).
mod<-lm(Temps~Groupe,data=genou)
> summary(mod)

Call:
lm(formula = Temps ~ Groupe, data = genou)

Residuals:
   Min     1Q Median     3Q    Max
  -9.0   -3.0   -0.5    3.0    8.0

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)   38.000      1.574  24.149  < 2e-16 ***
Groupe2       -6.000      2.111  -2.842  0.00976 **
Groupe3      -14.000      2.404  -5.824 8.81e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.451 on 21 degrees of freedom
Multiple R-squared:  0.6176,	Adjusted R-squared:  0.5812
F-statistic: 16.96 on 2 and 21 DF,  p-value: 4.129e-05



Commentaires: