Introduction à R - Laboratoire de Statistique Théorique et Appliquée

publicité
Université Pierre et Marie Curie
Master Mathématiques et Applications
Spécialité Statistique
Année 2014/2015
Premier Semestre
Introduction à R
Arnaud Guyader & Laurent Rouvière
Ce document est en grande partie tiré du livre [1] : Statistiques avec R, troisième édition, Presses
Universitaires de Rennes, 2012.
Table des matières
1 StartR
1.1 Création d’objets . . . . . . . . .
1.1.1 Scalaires . . . . . . . . . .
1.1.2 Scalaires chaînes . . . . .
1.1.3 Vecteurs . . . . . . . . . .
1.1.4 Matrices . . . . . . . . . .
1.1.5 Les listes . . . . . . . . .
1.1.6 Data-frames . . . . . . . .
1.2 Programmer en R . . . . . . . . .
1.2.1 Les boucles (for ou while)
1.2.2 Les conditions (if, else) . .
1.2.3 Les fonctions . . . . . . .
1.3 Exercices . . . . . . . . . . . . .
1.4 Corrigés . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
1
2
2
3
4
6
6
6
7
7
7
8
2 Etude descriptive d’un jeu de données
2.1 Importation du jeu de données . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Indicateurs numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Calcul d’indicateurs pour une variable . . . . . . . . . . . . . . . . . .
2.2.2 Calcul d’indicateurs pour un ensemble de variables . . . . . . . . . . .
2.2.3 Distribution d’une quantitative suivant les modalités d’une qualitative
2.3 Corrigés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
11
12
12
12
12
12
3 Représentation graphique des données
3.1 Représentation d’une variable . . . . . . . . . . . . . . . .
3.1.1 Variable quantitative continue . . . . . . . . . . . .
3.1.2 Variable quantitative discrète, variable qualitative
3.2 Représentation de deux variables . . . . . . . . . . . . . .
3.3 Améliorer la présentation d’un graphe . . . . . . . . . . .
3.4 Graphiques en trois dimensions . . . . . . . . . . . . . . .
3.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5.1 Graphes de fonctions . . . . . . . . . . . . . . . . .
3.5.2 Comparaisons de variables . . . . . . . . . . . . . .
3.6 Corrigés . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
15
15
15
16
16
16
16
17
17
17
17
.
.
.
.
21
21
22
22
23
4 Probabilités avec R
4.1 Loi, fonction de répartition, quantiles
4.1.1 La loi binomiale . . . . . . .
4.1.2 La loi normale . . . . . . . .
4.2 Simulations . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
i
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ii
Table des matières
4.3
.
.
.
.
.
.
.
23
23
23
24
24
24
24
5 Intervalles de confiance
5.1 Illustration sur des données simulées . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Application sur des données réelles . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3 Corrigés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
29
30
30
6 Comparaisons de moyennes
6.1 Illustrations des risques de première et deuxième espèces
6.1.1 Risque de première espèce . . . . . . . . . . . . .
6.1.2 Risque de deuxième espèce . . . . . . . . . . . .
6.2 Applications sur des données réelles . . . . . . . . . . . .
6.2.1 Test d’une moyenne . . . . . . . . . . . . . . . .
6.2.2 Comparaison de deux moyennes . . . . . . . . . .
6.3 Corrigés . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
33
33
33
33
34
34
34
34
.
.
.
.
.
.
.
39
39
39
39
40
40
40
40
8 Test d’une proportion
8.1 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2 To be or not to be independent ? . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3 Corrigés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
43
43
44
9 Régression linéaire simple
9.1 Introduction . . . . . . .
9.2 Exemple . . . . . . . . .
9.3 Exercice . . . . . . . . .
9.4 Corrigés . . . . . . . . .
.
.
.
.
45
45
46
46
46
.
.
.
.
49
49
50
50
51
4.4
Exercices . . . . . . . . . . . .
4.3.1 Loi de Student . . . . .
4.3.2 Loi des grands nombres
4.3.3 Théorème central limite
4.3.4 Loi du χ2 . . . . . . . .
4.3.5 Loi de Fisher . . . . . .
Corrigés . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7 Tests du χ2
7.1 Test du χ2 d’indépendance . . . . . . . . .
7.1.1 Principe . . . . . . . . . . . . . . .
7.1.2 Not even God could sink this ship
7.2 Test d’ajustement à une loi multinomiale .
7.2.1 Principe . . . . . . . . . . . . . . .
7.2.2 Winter is coming . . . . . . . . . .
7.3 Corrigés . . . . . . . . . . . . . . . . . . .
.
.
.
.
10 Régression linéaire multiple
10.1 Introduction . . . . . . . .
10.2 Exemple . . . . . . . . . .
10.3 Exercice . . . . . . . . . .
10.4 Corrigés . . . . . . . . . .
Arnaud Guyader & Laurent Rouvière
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Introduction à R
Table des matières
11 Analyse discriminante linéaire
11.1 Introduction . . . . . . . . . .
11.2 Exemple . . . . . . . . . . . .
11.3 Exercice . . . . . . . . . . . .
11.4 Corrigés . . . . . . . . . . . .
iii
.
.
.
.
53
53
54
54
55
12 Régression logistique
12.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.3 Corrigé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
57
57
59
13 Analyse de la variance
13.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.3 Corrigé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
61
62
62
14 Modes de convergence stochastique
14.1 Méthode Monte-Carlo pour le calcul d’intégrales
14.2 Visualisation des modes de convergence . . . . .
14.2.1 Convergence en probabilité . . . . . . . .
14.2.2 Convergence presque sûre . . . . . . . . .
14.2.3 Convergence en moyenne d’ordre r . . . .
14.2.4 Convergence en loi . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
65
65
65
66
66
67
68
15 Fonctions utiles en R
15.1 Les fonctions génériques . . . . . . . . . . .
15.2 Les fonctions numériques . . . . . . . . . . .
15.3 Les fonctions de gestion de données . . . . .
15.4 Les distributions de probabilité . . . . . . .
15.5 Les fonctions de statistique de base . . . . .
15.6 Les fonctions de statistique avancée . . . . .
15.7 Les fonctions graphiques . . . . . . . . . . .
15.8 Les fonctions d’importation et d’exportation
15.9 La gestion de texte . . . . . . . . . . . . . .
15.10Autres fonctions utiles . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
69
69
69
70
71
72
73
74
75
75
75
Introduction à R
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Arnaud Guyader & Laurent Rouvière
Chapitre 1
StartR
Introduction
Pour utiliser le logiciel R, il faut ouvrir une session de travail. Pour chaque projet, il convient de
créer un fichier texte dans lequel seront sauvagardées les commandes afin de pouvoir les réutiliser
ultérieurement. Une fois la session ouverte, R attend une instruction, ce qu’indique le signe ">" en
début de ligne. Chaque instruction doit être validée par Entrée pour être exécutée. Si l’instruction
est correcte, R redonne la main, ce qu’indique ">". Si l’instruction est incomplète, R retourne le
signe "+". Il faut alors compléter l’instruction ou sortir de cette situation et récupérer la main en
tapant Ctrl + c ou Echap. Si l’instruction est erronée, un message d’erreur apparaît.
> 1+2
[1] 3
> 5+ 2
[1] 3
> 1+a
Erreur : objet ’a’ introuvable
La création d’un objet peut se faire par affectation avec un des trois opérateurs “<-”, “->”, “=” en
donnant un nom à cet objet :
> b<-9.09
> x=2014
1.1
1.1.1
Création d’objets
Scalaires
– calculs directs :
> 2+3
> 3^2-5*log(100)+sqrt(8)
– création :
> x=2*cos(-5)
> y=pi^2
> x*y
[1]
> a=cos(x*y)
> a
1
2
Chapitre 1. StartR
[1]
> a=sqrt(a)
> a
[1]
1.1.2
Scalaires chaînes
> x="il fait"
> x
[1]
> y="beau"
> paste(x,y)
[1]
1.1.3
Vecteurs
Création Pour construire un vecteur, différentes méthodes sont possibles. Voici les principales :
– Construction par la fonction collecteur c :
> x = c(5.6,-2,78,42.3)
> x
[1]
> x = c(x,3,c(12,8))
> x
[1]
– Construction par l’opérateur séquence “ :” :
> 1:6
[1]
– Construction par la fonction seq (séquence régulière) :
> seq(1,6,by=0.5)
[1]
> seq(1,6,length=5)
[1]
– Construction par la fonction rep (réplication) :
> rep(1,4)
[1]
> rep(c(1,2),each=3)
[1]
Extraction L’extraction s’effectue à partir des indices des éléments du vecteur que l’on souhaite
extraire :
> x=15:25
> x[2]
[1]
> x[2:5]
[1]
> x[c(1,3,5,7)]
[1]
Opérations Les opérations sur les vecteurs s’effectuent élément par élément :
Arnaud Guyader & Laurent Rouvière
Introduction à R
1.1. Création d’objets
3
> x=1:5
> y=3:7
> x+y
[1]
> x*y
[1]
1.1.4
Matrices
Création La principale méthode pour créer une matrice est d’utiliser la fonction matrix qui
prend en arguments les coefficients de la matrice ainsi que son nombre de lignes (ou de colonnes) :
> m = matrix(1:6,ncol=2)
> m
[,1] [,2]
[1,]
[2,]
[3,]
> m = matrix(1:8,nrow=2)
> m
[,1] [,2] [,3] [,4]
[1,]
[2,]
Par défaut, R range les valeurs par colonne. Pour ranger par ligne, on utilise l’argument byrow :
> m = matrix(1:8,nrow=2,byrow=T)
> m
[,1] [,2] [,3] [,4]
[1,]
[2,]
Extraction L’emplacement d’un élément dans une matrice est en général donné par le numéro
de sa ligne et de sa colonne. Ainsi, pour sélectionner l’élément (1, 3) de la matrice m, il faut écrire :
> m[1,3]
[1]
Il est rare qu’on ait besoin de ne sélectionner qu’un élément d’une matrice. Usuellement, on sélectionne une ou plusieurs lignes et/ou une ou plusieurs colonnes. Exemples :
– Sélection par des entiers positifs :
> m[2,]
[1]
– Sélection par des entiers négatifs :
> m[-1,]
[1]
> m[1:2,-1]
[,1] [,2] [,3]
[1,]
[2,]
Introduction à R
Arnaud Guyader & Laurent Rouvière
4
Chapitre 1. StartR
Opérations
> m = matrix(1:4,ncol=2)
> m
[,1] [,2]
[1,]
[2,]
> n = matrix(3:6,ncol=2,byrow=T)
> n
[,1] [,2]
[1,]
[2,]
> m+n
[,1] [,2]
[1,]
[2,]
> m*n
[,1] [,2]
[1,]
[2,]
> m%*%n
[,1] [,2]
[1,]
[2,]
> exp(m)
Exemples de fonctions classiques en algèbre linéaire :
> det(m)
[1]
> solve(m)
[,1] [,2]
[1,]
[2,]
> eigen(m)
$values
[1]
$vectors
[,1]
[,2]
[1,]
[2,]
1.1.5
Les listes
Les listes permettent de regrouper différents objets. Elles permettent, par exemple, de stocker dans
un même objet un vecteur et une matrice :
>
>
>
>
vec=c(1,2,3)
mat=matrix(1,ncol=2,nrow=3)
L=list(vec,mat)
L
Arnaud Guyader & Laurent Rouvière
Introduction à R
1.1. Création d’objets
5
[[1]]
[1]
[[2]]
[,1] [,2]
[1,]
[2,]
[3,]
L’objet L ainsi créé est une liste de longueur 2. Le premier élément est le vecteur vec, le second la
matrice mat. On extrait les éléments d’une liste à l’aide de double crochets :
> L[[1]]
[1]
> L[[2]]
[,1] [,2]
[1,]
[2,]
[3,]
Il est également possible, et souvent utile, de donner des noms aux différents éléments d’une liste.
Ceci peut se faire grâce à la fonction names :
> names(L)=c("vecteur","matrice")
> L
$vecteur
[1] 1 2 3
$matrice
[,1] [,2]
[1,]
1
1
[2,]
1
1
[3,]
1
1
Dans ce cas, l’extraction peut toujours se faire via les doubles crochets ou bien à partir des noms
des différentes composantes, le symbole $ séparant le nom de la liste du nom de la composante :
> L$vecteur
[1] 1 2 3
De nombreuses fonctions de R renvoient un résultat sous la forme d’une liste, c’est le cas par exemple
de la fonction eigen vue dans la partie précédente, donc on liste les éléments via la fonction ls.
Exemple :
> m =matrix(1:4,ncol=2)
> dec=eigen(m)
> ls(dec)
[1] "values" "vectors"
> dec$values
[1] 5.3722813 -0.3722813
> dec$vectors
[,1]
[,2]
[1,] -0.5657675 -0.9093767
[2,] -0.8245648 0.4159736
Introduction à R
Arnaud Guyader & Laurent Rouvière
6
Chapitre 1. StartR
1.1.6
Data-frames
Les data-frames sont les objets typiques pour faire des statistiques sous R. Ce sont des listes
particulières dont les composantes sont de même longueur, mais de types éventuellement différents.
Les tableaux de données utilisés en statistique, de forme (individus,variables), doivent être mis sous
la forme d’un data-frame. En effet, un tableau de données est constitué de variables quantitatives
et/ou qualitatives mesurées sur les mêmes individus. Les data-frames permettent de tenir compte
de la nature de chaque variable. Considérons un jeu de données de 6 individus et deux variables :
>
>
>
>
age=c(17,28,64,8,25,36)
sexe=c("H","F","F","H","H","F")
donnees=data.frame(age,sexe)
donnees
age sexe
1
2
3
4
5
6
L’extraction d’éléments peut se faire :
– comme pour une matrice :
> donnees[3,1]
[1]
> donnees[4,]
age sexe
4
> donnees[,2]
[1]
Levels:
– comme pour une liste :
> donnees[[2]]
[1]
Levels:
> donnees$sexe
[1]
Levels:
La fonction names permet de retrouver les noms des variables, ce qui peut être utile lorsque le
tableau de données contient beaucoup de variables :
> names(donnees)
[1]
1.2
1.2.1
Programmer en R
Les boucles (for ou while)
De manière générale, la boucle for s’écrit :
> for (i in vecteur) {
+
expr1
Arnaud Guyader & Laurent Rouvière
Introduction à R
1.3. Exercices
7
+
expr2
+
...
+ }
Une autre possibilité de boucle est la condition while. Sa syntaxe générale est la suivante :
> while (condition) {
+
expr1
+
expr2
+
...
+ }
1.2.2
Les conditions (if, else)
Sous sa forme générale, la condition if, else s’écrit :
> if (condition) {
+
expr1
+
expr2
+
...
+ } else {
+
expr3
+
expr4
+
...
+ }
Achtung, l’ordre else doit être sur la même ligne que la parenthèse fermante "}" de la clause if.
1.2.3
Les fonctions
Une fonction permet d’effectuer un certain nombre d’instructions R, lesquelles dépendent généralement d’arguments spécifiés en entrée. La fonction fournit un résultat unique, qui est désigné à
l’intérieur de la fonction par return. En l’absence de cette instruction, la fonction renvoit comme
résultat le dernier résultat obtenu dans celle-ci. Donnons un exemple simple, à savoir la somme des
n premiers entiers. Le nombre n est un entier qui est l’argument d’entrée, le résultat est simplement
la somme demandée :
somme = function(n){return(sum(1:n))}
La fonction est ensuite appelée grâce à son nom (ici, somme), suivi du (ou des) argument(s) en
entrée entre parenthèses. Ainsi :
> somme(3)
[1] 6
1.3
Exercices
Exercice 1.1 (Factorielle)
1. Programmer factorielle n, c’est-à-dire n! = n × (n − 1) × · · · × 2 × 1 en utilisant prod.
2. Programmer factorielle n en utilisant une boucle for.
3. Comparer à la fonction gamma disponible sous R.
Introduction à R
Arnaud Guyader & Laurent Rouvière
8
Chapitre 1. StartR
Exercice 1.2 (Création et inversion d’une matrice)
1. Créer la matrice mat suivante (avec les noms de lignes et noms de colonnes, on pourra utiliser
les fonctions rownames et colnames, ou encore la fonction dimnames) :
ligne-1
ligne-2
ligne-3
ligne-4
colonne 1 colonne 2 colonne 3 colonne 4
1
5
5
0
0
5
6
1
3
0
3
3
4
4
4
2
2. Calculer le déterminant puis inverser la matrice en utilisant les fonctions appropriées.
3. Stocker la matrice mat, son déterminant et sa matrice inverse dans une liste de trois éléments.
On nommera ces éléments, matrice, determinant et inverse.
Exercice 1.3 (Diagonalisation)
Les matrices suivantes sont-elles diagonalisables ? Si oui, expliciter la diagonalisation.




µ
¶
µ
¶
0 1 1
15 −11 5
5 −2
2 0
A=
B=
C =  20 −15 8  D =  1 0 1 
4 −1
3 2
1 1 0
8 −7 6
Exercice 1.4 (Sélection et tri dans un data-frame)
Le data-frame iris est disponible sous R. Il suffit de taper data(iris) pour le charger.
1. Déterminer les dimensions de ce jeu de données grâce à la fonction dim.
2. Visualiser ses cinq premières lignes.
3. Créer un nouveau data-frame, que vous appellerez iris2, comportant uniquement les données
de la modalité versicolor de la variable Species.
4. Trier par ordre décroissant les données de iris2 en fonction de la variable Petal.Length
(vous pourrez utiliser la fonction order).
1.4
Corrigés
Exercice 1.1 (Factorielle)
1. On rappelle que 0! = 1, ce qui donne :
> factorielle=function(n){ if (n==0) {return (1)} else {return(prod(1:n))}}
2. Avec une boucle for, cette fonction s’écrit :
> factorielle=function(n) { if (n==0) {return (1)} else
+
{
+
aux=1
+
for (k in 1:n) {aux=aux*k}
+
return(aux)
+
}
+ }
3. La fonction Γ est définie pour tout x > 0 par
Z ∞
tx−1 e−t dt,
Γ(x) =
0
avec en particulier, pour tout entier naturel n, la relation Γ(n + 1) = n! d’où
> factorielle=function(n){return(gamma(n+1))}
Arnaud Guyader & Laurent Rouvière
Introduction à R
1.4. Corrigés
9
Exercice 1.2 (Création et inversion d’une matrice)
1. Création de la matrice :
> mat=matrix(c(1,0,3,4,5,5,0,4,5,6,3,4,0,1,3,2),ncol=4)
> rownames(mat)=c("ligne-1","ligne-2","ligne-3","ligne-4")
> colnames(mat)=c("colonne 1","colonne 2","colonne 3","colonne 4")
ou bien :
> mat=matrix(c(1,0,3,4,5,5,0,4,5,6,3,4,0,1,3,2),ncol=4)
> rownames(mat)=rownames(mat,do.NULL = FALSE,prefix="ligne-")
> colnames(mat)=colnames(mat,do.NULL = FALSE,prefix="colonne ")
2. Déterminant et inverse s’obtiennent comme suit :
> determinant=det(mat)
> inverse=solve(mat)
Pour l’inverse, la fonction ginv du package MASS est une autre possibilité :
> library(MASS)
> inverse=ginv(mat)
3. On collecte le tout dans une liste :
> L=list(matrice=mat,determinant=determinant,inverse=inverse)
Exercice 1.3 (Diagonalisation)
On commence par déclarer la matrice A pour obtenir ensuite sa décomposition spectrale via la
fonction eigen.
>
>
>
>
>
A=matrix(c(5,4,-2,-1),ncol=2)
dec=eigen(A)
D=diag(dec$values)
P=dec$vectors
P%*%D%*%solve(P)
Sans grande surprise, on retrouve A.
Exercice 1.4 (Sélection et tri dans un data-frame)
Le jeu de données iris est un grand classique, déjà utilisé par Fisher dans les années 30.
> data(iris)
> summary(iris)
On obtient ainsi un résumé de ce data-frame.
1. Pour obtenir les dimensions, il suffit de taper :
> dim(iris)
2. Visualisation des 5 premières lignes :
> iris[1:5,]
3. Extraction de l’espèce versicolor :
> iris2=iris[iris[,5]=="versicolor",]
4. Tri en fonction de la longueur des pétales :
> iris2[order(iris2$Petal.Length),] # ordre croissant
> iris2[order(iris2$Petal.Length,decreasing=TRUE),] # ordre decroissant
Introduction à R
Arnaud Guyader & Laurent Rouvière
Chapitre 2
Etude descriptive d’un jeu de données
Introduction
Dans le cadre d’une étude de la population, le CHU d’Angers s’est intéressé à la propension à
ronfler d’hommes et de femmes. Le fichier ronfle.txt contient un échantillon de 100 patients, les
variables considérées étant :
– AGE : en années ;
– POIDS : en kg ;
– TAILLE : en cm ;
– ALCOOL : nombre de verres bus par jour (en équivalent verre de vin rouge) ;
– SEXE : sexe de la personne (F=femme, H=homme) ;
– RONFLE : diagnostic de ronflement (O=ronfle, N=ne ronfle pas) ;
– TABA : comportement au niveau du tabac (O=fumeur, N=non fumeur).
Le but de cette étude est d’essayer d’expliquer le ronflement (variable ronfle) par les six autres
variables présentées ci-dessus. On dispose de 100 individus pour faire l’analyse. Le tableau suivant
présente un extrait du jeu de données :
AGE
47
56
.
.
.
68
50
2.1
POIDS
71
58
.
.
.
108
109
TAILLE
158
164
.
.
.
194
195
ALCOOL
0
7
.
.
.
0
8
SEXE
H
H
.
.
.
F
H
RONFLE
N
O
.
.
.
O
O
TABA
O
N
.
.
.
N
O
Importation du jeu de données
La première étape consiste à importer le jeu de données sous R. Pour ce faire, il faut au préalable
vérifier que le fichier est enregistré dans le répertoire où R travaille. L’importation s’effectue alors
grâce à la fonction read.table :
> donnees = read.table("ronfle.txt")
1. Extraire le premier individu du fichier de données. Que remarquez-vous ?
2. A partir de l’aide de la fonction read.table, résoudre ce problème.
3. Analyser les sorties de la commande :
> summary(donnees)
11
12
Chapitre 2. Etude descriptive d’un jeu de données
2.2
Indicateurs numériques
Nous présentons dans cette partie les commandes permettant d’obtenir des indicateurs statistiques
tels que la moyenne, la variance, les quantiles, etc.
2.2.1
Calcul d’indicateurs pour une variable
Nous étudions ici la variable age du jeu de données.
> age=donnees$AGE
1. Calculer la moyenne et l’écart-type de la variable age (on pourra utiliser la fonction sum).
2. Déterminer une médiane de la variable age (on pourra utiliser la fonction sort). Calculer le
premier décile.
3. Retrouver les indicateurs des questions précédentes à l’aide des fonctions mean, var, median
et quantile.
4. Déterminer les quartiles.
2.2.2
Calcul d’indicateurs pour un ensemble de variables
Nous reprenons les indicateurs de la question précédente dans le cas d’un tableau de données
constitué uniquement de variables quantitatives. Par exemple,
> donnees1 = donnees[,c(1,2,3)]
1. Calculer la moyenne de chacune des trois variables.
2. Retrouver le résultat précédent à l’aide de la fonction apply.
3. Calculer l’écart-type de chacune des trois variables.
4. Calculer le premier décile de chacune des trois variables.
2.2.3
Distribution d’une quantitative suivant les modalités d’une qualitative
On cherche à comparer les indicateurs numériques suivant les modalités de la variable à expliquer,
à savoir la variable ronfle.
1. Créer deux tableaux de données issus du tableau original : un tableau nommé ronfleur qui
contient uniquement les individus qui ronflent et un autre nommé nonronfleur (on pourra
utiliser la fonction split).
2. Calculer les moyenne, variance et médiane de chaque variable quantitative dans les deux
tableaux. Comparer ces indicateurs, interpréter.
3. Quelles sont les proportions d’hommes ronfleurs et non-ronfleurs ?
2.3
Corrigés
Exercice 2.1 (Importation du jeu de données)
1. L’extraction
> donnees[1,]
montre que le 1er individu correspond au nom des variables, ce qui n’est bien entendu pas
souhaitable.
2. Il convient donc de le préciser lors de l’importation des données :
Arnaud Guyader & Laurent Rouvière
Introduction à R
2.3. Corrigés
13
> donnees=read.table("ronfle.txt",header=TRUE) # Mission accomplished
3. La commande
> summary(donnees)
offre un résumé de chacune des 7 variables sur les 100 individus de l’étude.
Exercice 2.2 (Calcul d’indicateurs pour une variable)
1. On commence par vérifier le nombre d’individus avant de calculer moyenne et écart-type :
>
>
>
>
>
age=donnees$AGE
n=length(age)
moy=sum(age)/n
ecart=sqrt((sum(age^2))/n-moy^2) # premiere formule pour l’ecart-type
ecart=sqrt(sum((age-moy)^2)/n) # seconde formule pour l’ecart-type
2. Rappelons que d’un point de vue probabiliste, m est une médiane de la variable aléatoire X
si
P(X ≤ m) ≥ 0.5
et
P(X ≥ m) ≥ 0.5.
Dès lors, dans certaines situations, plusieurs valeurs sont envisageables pour la médiane, de
même pour le premier décile en remplaçant 0.5 respectivement par 0.1 et 0.9 dans la définition
ci-dessus.
> vec=sort(age)
> med=(vec[n/2]+vec[n/2+1])/2
> d1=(vec[n/10]+vec[n/10+1])/2
3. Toutes ces fonctions classiques sont bien sûr prêtes à l’emploi sous R.
> mean(age)
> sd(age)
Attention ! La fonction sd est basée sur l’estimateur sans biais pour la variance : on divise
donc par (n − 1), non par n.
> median(age)
> quantile(age,0.1)
4. On peut tout faire en une fois :
> quantile(age,probs=c(0.25,0.5,0.75))
Rappelons enfin qu’il est possible d’obtenir la plupart des indicateurs avec summary :
> summary(age)
Exercice 2.3 (Calcul d’indicateurs pour un ensemble de variables)
1. Plusieurs possibilités :
>
>
>
>
donnees1 = donnees[,c(1,2,3)]
mean(donnees1[,1]) # ou bien mean(donnees1$AGE)
mean(donnees1[,2]) # ou bien blablabla
mean(donnees1[,3])
2. Plus concis : la moyenne de chaque colonne (argument "2") du tableau donnees1 peut s’obtenir simplement comme suit :
> apply(donnees1,2,mean)
3. De la même façon, pour l’écart-type :
Introduction à R
Arnaud Guyader & Laurent Rouvière
14
Chapitre 2. Etude descriptive d’un jeu de données
> apply(donnees1,2,sd)
4. Il faut préciser que c’est le premier décile qui nous intéresse :
> apply(donnees1,2,quantile,probs=0.1)
Exercice 2.4 (Distribution d’une quantitative suivant les modalités d’une qualitative)
1. Création d’une liste de deux data-frames :
> decoupe=split(donnees,donnees$RONFLE)
> ronfleur=decoupe$O # data-frame des ronfleurs
> nonronfleur=decoupe$N # data-frame des non-ronfleurs
2. On peut lire les différents indicateurs dans les résumés :
> summary(ronfleur)
> summary(nonronfleur)
On peut aussi les retrouver avec la fonction apply :
> apply(ronfleur[,1:4],2,mean)
> apply(nonronfleur[,1:4],2,mean)
D’où il ressort que les ronfleurs sont en moyenne plus vieux et boivent plus.
>
>
>
>
apply(ronfleur[,1:4],2,median)
apply(nonronfleur[,1:4],2,median)
apply(ronfleur[,1:4],2,var)
apply(nonronfleur[,1:4],2,var)
3. Calculs des proportions :
> n1=nrow(ronfleur)
> nbhommes1=sum(ronfleur$SEXE=="H")
> nbhommes1/n1
Ainsi 86% des ronfleurs sont des hommes.
> n2=nrow(nonronfleur)
> nbhommes2=sum(nonronfleur$SEXE=="H")
> nbhommes2/n2
Et 69% des non-ronfleurs sont des hommes.
Arnaud Guyader & Laurent Rouvière
Introduction à R
Chapitre 3
Représentation graphique des données
Introduction
La fonction plot est une fonction générique de R permettant de représenter tous les types de
données. L’utilisation classique de la fonction plot consiste à représenter un nuage de points d’une
variable Y en fonction d’une variable X. Elle admet en arguments le vecteur x des abscisses et
le vecteur y des ordonnées. Par exemple, pour représenter à intervalles réguliers les points de la
courbe de x 7→ sin(2πx) sur [0, 1], on utilise les commandes suivantes :
> x = seq(0,1,length=50)
> y = sin(2*pi*x)
> plot(x,y)
Ces commandes entraînent l’ouverture d’une fenêtre graphique. Il est plus classique en statistique
d’utiliser la fonction plot avec des formules du type y~x. Par exemple, le graphique précédent peut
aussi être obtenu par :
> plot(y~x)
3.1
Représentation d’une variable
Nous étudions les différentes manières de représenter une seule variable suivant sa nature. Pour ce
faire, nous utilisons le jeu de données sur le ronflement du chapitre précédent.
3.1.1
Variable quantitative continue
Nous étudions ici la variable continue AGE.
1. La représenter sous forme d’histogramme (fonction hist).
2. A l’aide de l’argument main de la fonction hist, ajouter le titre Histogramme des ages à
l’histogramme précédent.
3. Représenter l’histogramme des densités avec les classes [20 ;40], ]40 ;55], ]55,80].
4. On peut également visualiser une variable continue à l’aide d’une boîte à moustaches (fonction
boxplot).
5. L’instruction par(mfrow=c(n,p)) partitionne la fenêtre graphique en np sous-figures sur n
lignes et p colonnes. Représenter côte à côte l’histogramme et le boxplot précédents.
15
16
Chapitre 3. Représentation graphique des données
3.1.2
Variable quantitative discrète, variable qualitative
Les diagrammes en barres peuvent représenter aussi bien des variables qualitatives que quantitatives discrètes.
1. Représenter la variable SEXE (fonction plot).
2. Représenter la variable ALCOOL (transformée en variable qualitative via la fonction as.factor).
3.2
Représentation de deux variables
Les représentations diffèrent bien entendu suivant les types de variables.
1. Représenter le poids en fonction de la taille.
2. Un boxplot peut être utilisé pour comparer une variable quantitative suivant les modalités
d’une variable qualitative (fonction boxplot). Représenter ainsi les boîtes à moustaches de la
variable AGE en fonction de la variable RONFLE. Conclusion ?
3.3
Améliorer la présentation d’un graphe
Certains arguments permettant d’améliorer le graphe peuvent être utilisés directement dans la
fonction plot.
1. Dans la représentation du poids en fonction de la taille, utiliser les arguments xlim et ylim
pour obtenir un graphique de limites [150, 210] et [40, 120].
2. Ajouter les légendes pour les axes par les arguments xlab et ylab.
3. Il est possible d’insérer des lignes sur un graphe. Grâce à la fonction abline, ajouter une
droite verticale au niveau de la médiane des tailles et une droite horizontale au niveau de la
médiane des poids.
4. Calculer le centre de gravité du nuage de points, le représenter par une croix rouge (arguments
pch et col de la fonction points) et écrire “G”, toujours en rouge, juste en dessous via la
fonction text.
3.4
Graphiques en trois dimensions
Les fonctions classiques de représentation 3D sur une grille de points sont les fonctions persp
(3D avec effet de perspective), contour (lignes de niveau) et image (lignes de niveau avec effet de
couleur). Le classique “chapeau mexicain”, proposé dans l’aide de persp, est le graphe de la fonction
¡p
¢ p
f : (x, y) 7→ z = f (x, y) = 10 sin x2 + y 2 / x2 + y 2 .
1. Programmer la fonction f .
2. Définir ensuite une grille régulière carrée comprenant 200 valeurs différentes comprises entre
-10 et 10, sur x et sur y.
3. Il suffit alors d’évaluer la fonction en chaque point de la grille, c’est-à-dire que pour chaque
couple (x[i], y[j]), nous calculons f(x[i],y[j]). Afin d’éviter une (double) boucle, utiliser
la fonction outer, qui permet ce type d’évaluation directement.
4. Tracer cette fonction en 3D à l’aide de la fonction persp.
5. Faire pivoter la figure précédente grâce aux arguments theta et phi.
6. Noter qu’on peut également obtenir les courbes de niveaux en utilisant contour(x,y,z) ou
image(x,y,z). On peut aussi utiliser le package rgl pour construire la surface précédente :
Arnaud Guyader & Laurent Rouvière
Introduction à R
3.5. Exercices
17
> library(rgl)
> rgl.surface(x,y,z)
Ce package est à conseiller pour tous les problèmes de visualisation 3D. En effet, il permet par
exemple d’opérer des rotations des graphiques avec la souris ainsi que d’utiliser des symboles
avec effet d’éclairage.
3.5
Exercices
3.5.1
Graphes de fonctions
1. Tracer la fonction sinus en rouge (arguments type et col) sur l’intervalle [0, 4π].
2. Superposer sur ce graphe la fonction cosinus (fonction lines).
3. Ajouter sur le même graphe les droites d’équations y = 1 et y = −1 en vert (fonction abline).
4. Ajouter la droite d’équation y = x en tirets bleus (argument lty).
3.5.2
Comparaisons de variables
On souhaite comparer la distribution des variables de taille et de poids suivant les modalités de la
variable de ronflement.
1. Comparer la distribution de la variable de taille suivant les modalités de la variable RONFLE
à l’aide d’un boxplot.
2. Même question pour la variable de poids.
3. Représenter les figures des questions précédentes sur une même fenêtre graphique.
4. Sauvegarder le graphique au format pdf.
3.6
Corrigés
Exercice 3.1 (Variable quantitative continue)
1. Voyons ce que donne la fonction hist.
> age=donnees$AGE
> hist(age)
Notons que ce sont les effectifs qui apparaissent : il faut ajouter l’argument prob=T ou freq=F
pour obtenir effectivement un estimateur de la densité.
> hist(age,prob=T) # la somme des surfaces fait bien 1
2. Aucune difficulté ici :
> hist(age,prob=T,main="Histogramme des ages")
3. C’est l’argument breaks qui permet de préciser les classes voulues.
> hist(age,prob=T,breaks=c(20,40,55,80),main="Histogramme des ages")
Remarque : lorsque les classes ne sont pas de même longueur, c’est automatiquement l’histogramme classique qui est donné (i.e. celui des densités). En d’autres termes, l’argument
prob=T est ici superflu puisque la commande suivante donne le même résultat :
> hist(age,breaks=c(20,40,55,80),main="Histogramme des ages")
4. La boîte correspond aux quartiles (premier et troisième avec la médiane à l’intérieur) et, en
général, les moustaches vont du minimum au maximum.
Introduction à R
Arnaud Guyader & Laurent Rouvière
18
Chapitre 3. Représentation graphique des données
> boxplot(age)
5. Nous commençons donc par partitionner la fenêtre en deux sous-fenêtres.
> par(mfrow=c(1,2))
> boxplot(age)
> hist(age,breaks=c(20,40,55,80),main="Histogramme des ages")
Remarque : pour revenir à un seul graphe par fenêtre, taper
> par(mfrow=c(1,1))
ou tuer tout bonnement la fenêtre en question...
Exercice 3.2 (Variable quantitative discrète, variable qualitative)
1. On a affaire à une variable qualitative.
> plot(donnees$SEXE)
2. La variable ALCOOL est, elle, quantitative. Pour tenir compte du fait qu’elle est discrète et la
résumer par un diagramme en barres, on commence par la transformer en variable qualitative.
> alcool=as.factor(donnees$ALCOOL)
> summary(alcool)
> plot(alcool)
Exercice 3.3 (Représentation de deux variables)
1. On représente donc une variable quantitative en fonction d’une autre variable quantitative.
Le nuage de points s’obtient tout simplement par :
> plot(donnees$POIDS~donnees$TAILLE)
Ou, plus élégant, notamment pour les légendes des axes :
> plot(POIDS~TAILLE,data=donnees)
2. Par rapport à ce qui précède, il suffit de remplacer plot par boxplot :
> boxplot(AGE~RONFLE,data=donnees)
Les ronfleurs sont en moyenne plus âgés.
Exercice 3.4 (Améliorer la présentation d’un graphe)
1. Les intervalles sont déclarés comme des vecteurs :
> plot(POIDS~TAILLE,data=donnees,xlim=c(150,210),ylim=c(40,120))
2. Tout se passe comme lorsqu’on ajoute un titre :
> plot(POIDS~TAILLE,data=donnees,xlab="taille",ylab="poids")
3. Les arguments v et h signifient respectivement (et sans grande surprise) “vertical” et “horizontal” :
> abline(v=median(donnees$TAILLE))
> abline(h=median(donnees$POIDS))
4. L’argument pch, pour “plotting character”, précise le type de point voulu (3 pour une croix) :
> points(mean(donnees$TAILLE),mean(donnees$POIDS),pch=3,col="red")
> text(mean(donnees$TAILLE),mean(donnees$POIDS)-5,"G",col="red")
Exercice 3.5 (Graphiques en trois dimensions)
1. La fonction se programme sans problème :
Arnaud Guyader & Laurent Rouvière
Introduction à R
3.6. Corrigés
19
> f=function(x,y){10*sin(sqrt(x^2+y^2))/sqrt(x^2+y^2)}
2. On déclare des séquences régulières sur les deux axes :
> x=seq(-10,10,length=200)
> y=x
3. La fonction outer calcule en chaque couple (x, y) de la grille la valeur de f correspondante :
> z=outer(x,y,f)
4. Et la surface s’obtient alors directement :
> persp(x,y,z)
5. Les arguments theta et phi correspondent à ceux des coordonnées sphériques :
> persp(x,y,z,theta=30,phi =30)
6. Autres méthodes de visualisation :
>
>
>
>
contour(x,y,z)
image(x,y,z)
library(rgl)
rgl.surface(x,y,z)
Exercice 3.6 (Graphes de fonctions)
1. L’argument type précise le type de graphe voulu (points, traits, etc.) :
> x=seq(0,4*pi,by=0.01)
> plot(x,sin(x),type="l",col="red")
Et si on ne veut pas de légende en ordonnées :
> plot(x,sin(x),type="l",col="red",ylab="")
2. Ou bien on fait appel à la fonction lines :
> lines(x,cos(x))
Ou bien on commence par préciser qu’on veut rester sur la même fenêtre graphique :
> par(new=T)
> plot(x,cos(x),type="l",ylab="")
3. On peut ajouter les deux droites à la fois :
> abline(h=c(-1,1),col="green")
4. La commande abline(a,b) trace la droite y=a+bx, l’argument lty permettant d’obtenir des
tirets :
> abline(0,1,lty=3,col="blue")
Exercice 3.7 (Comparaisons de variables)
1. Le fait de ronfler ou non semble indépendant de la taille :
> boxplot(TAILLE~RONFLE,data=donnees)
2. Même question, même réponse :
boxplot(POIDS~RONFLE,data=donnees)
3. On commence par partitionner la fenêtre graphique :
Introduction à R
Arnaud Guyader & Laurent Rouvière
20
Chapitre 3. Représentation graphique des données
> par(mfrow=c(1,2))
> boxplot(TAILLE~RONFLE,data=donnees)
> boxplot(POIDS~RONFLE,data=donnees)
4. Ou bien directement via le menu (Export pour RStudio), ou bien "à la commande" :
>
>
>
>
>
pdf("boxplots.pdf")
par(mfrow=c(1,2))
boxplot(TAILLE~RONFLE,data=donnees)
boxplot(POIDS~RONFLE,data=donnees)
dev.off()
Arnaud Guyader & Laurent Rouvière
Introduction à R
Chapitre 4
Probabilités avec R
Introduction
L’objectif de ce chapitre est de se familiariser avec la manipulation des lois de probabilité classiques
ainsi qu’avec leur simulation sous R.
4.1
Loi, fonction de répartition, quantiles
les fonctions usuelles pour les lois de probabilité sont composées de deux parties :
– un préfixe : d pour la densité, p pour la fonction de répartition et q pour la fonction quantile ;
– un suffixe spécifiant la loi à laquelle on s’intéresse : binom pour la loi binomiale, norm pour la
loi normale, und so weiter.
Les paramètres des lois sont spécifiés à l’intérieur de la fonction :
– size et prob pour la loi binomiale ;
– mean et sd pour la loi normale.
Le tableau suivant récapitule les suffixes ainsi que les paramètres des lois les plus utilisées en
statistique :
suffixe
normale
binomiale
uniforme
χ2
paramètre
moyenne
argument
mean
écart-type
nb essais
sd
size
proba succès
borne inf
prob
min
borne sup
ddl
ddl
ddl1
max
df
df
df1
ddl2
df2
norm
binom
unif
Student
chisq
t
Fisher
f
Table 4.1 – Quelques lois de probabilités sur R.
21
22
Chapitre 4. Probabilités avec R
4.1.1
La loi binomiale
On jette dix fois de suite une pièce équilibrée et on s’intéresse à la variable aléatoire X correspondant au nombre de Pile obtenus sur les 10 lancers.
1. Quelle est la loi de X ?
2. Déterminer
P(X = 7).
3. Représenter la loi de la variable X (argument type="h" de la fonction plot).
4. Soit Y le nombre de Pile obtenus après 10 lancers lorsque la pièce est truquée avec probabilité
d’obtenir Pile égale à p = 0.75. Représenter sur deux graphiques différents mais dans une
même fenêtre graphique les lois des variables X et Y . Discuter.
5. Calculer la valeur de la fonction de répartition de la variable Y au point 7.
6. Représenter la fonction de répartition de Y (plot avec l’argument type="s").
7. Lire sur le graphique la médiane de Y .
8. Retrouver la valeur de cette médiane ainsi que les valeurs des quartiles.
4.1.2
La loi normale
Nous étudions les représentations des lois continues à travers l’exemple de la loi normale.
1. Représenter sur une même fenêtre graphique la densité et la fonction de répartition de la loi
normale centrée réduite (on représentera ces fonctions sur l’intervalle [−4; 4]).
2. Déterminer le quantile d’ordre 0.95.
3. Fermer cette fenêtre graphique, représenter à nouveau la densité de la loi N (0, 1) et ajouter
l’axe des abcisses.
0.0
0.1
0.2
0.3
0.4
4. Grâce à la fonction segments, ajouter un segment vertical joignant l’axe des abcisses à la
fonction de densité au niveau du quantile d’ordre 0.95 (voir Figure 4.1).
−4
−2
0
2
4
x
Figure 4.1 – Représentation du quantile d’ordre 0.95.
5. Que représentent les aires sous la courbe se trouvant à gauche et à droite du segment ?
6. Reprendre les questions précédentes pour une loi normale de moyenne 2 et de variance 4.
Arnaud Guyader & Laurent Rouvière
Introduction à R
4.2. Simulations
4.2
23
Simulations
La simulation de données consiste typiquement à tirer un échantillon (X1 , . . . , Xn ) de variables
indépendantes et identiquement distribuées (en abrégé i.i.d.) suivant la même loi qu’une variable
aléatoire X. Les fonctions utilisées sur R pour simuler des données suivant une loi s’écrivent de la
même manière que pour la densité, la fonction de répartition ou le quantile, mais cette fois avec le
préfixe r. Par exemple, la fonction
> rnorm(5,mean=0,sd=1)
[1] 2.53277665 0.07021567 0.52068595 1.35287718 2.29180078
simule un échantillon de taille 5 suivant une loi normale centrée réduite. En tapant la commande
précédente, on s’aperçoit que l’échantillon simulé n’est jamais le même. Pour que cet échantillon
ne “varie” plus, il faut fixer la graine du générateur grâce à la fonction set.seed :
> set.seed(1234)
> rnorm(5,mean=0,sd=1)
[1] -1.2070657 0.2774292
> set.seed(1234)
> rnorm(5,mean=0,sd=1)
[1] -1.2070657 0.2774292
1.0844412 -2.3456977
0.4291247
1.0844412 -2.3456977
0.4291247
Exemple :
1. Simuler un échantillon de taille 20 suivant une loi normale centrée réduite. Stocker cet échantillon dans un vecteur ech.
2. Tracer l’histogramme (de la densité) pour l’échantillon ech.
3. Superposer sur le même graphe la loi normale centrée réduite.
4. Refaire les questions précédentes pour des échantillons de taille 100, 1000 et 10000. On
présentera les 3 figures dans une même fenêtre graphique. Interpréter.
4.3
4.3.1
Exercices
Loi de Student
1. Tracer la courbe de la loi normale centrée réduite entre -4 et 4.
2. Tracer sur le même graphe les lois de Student à 5 et 30 degrés de liberté avec une couleur
différente pour chaque courbe.
3. Ajouter une légende en haut à gauche pour spécifier chaque distribution (fonction legend).
4.3.2
Loi des grands nombres
1. Rappeler la loi des grands nombres.
2. Simuler un échantillon (x1 , ..., x1000 ) de longueur 1000 provenant d’une loi de Bernoulli de
paramètre p = 0.6.
P
3. Calculer les moyennes successives Mℓ = Sℓ /ℓ où Sℓ = ℓi=1 Xi (utiliser la fonction cumsum).
Tracer Mℓ en fonction de ℓ puis ajouter la droite horizontale d’équation y = 0.6.
Introduction à R
Arnaud Guyader & Laurent Rouvière
24
Chapitre 4. Probabilités avec R
4.3.3
Théorème central limite
1. Soit X1 , X2 , ... XN i.i.d. suivant une loi de Bernoulli de paramètre p. Rappeler la loi suivie
par SN = X1 + . . . + XN . Donner sa moyenne et son écart-type.
2. Dans ce cadre, que dit le théorème central limite ?
3. On fixe p = 0.5. Pour N = 10, simuler n = 1000 réalisations S1 , . . . , S1000 d’une p
loi binomiale
de paramètres N et p. Ranger dans un vecteur U10 les quantités (Si − N p)/ N p(1 − p).
Faire de même avec N = 30 et N = 1000 pour obtenir deux nouveaux vecteurs U30 et U1000.
4. Représenter sur une même fenêtre les histogrammes de U10, U30 et U1000 en superposant
à chaque fois la densité de la loi normale centrée réduite.
4.3.4
Loi du χ2
Nous illustrons dans cet exercice la définition P
suivante : si X1 , . . . , Xd sont i.i.d. suivant la loi
normale centrée réduite, alors la variable Y = dj=1 Xj2 suit une loi du χ2 à d degrés de liberté,
noté Y ∼ χ2d .
1. Simuler n = 500 échantillons de taille d = 20 suivant une loi N (0, 1). On pourra mettre les
résultats dans une matrice echs de dimension n × d.
2. Mettre dans un vecteur ech de taille n la somme des carrés des lignes de la matrice echs (on
a ainsi simulé un échantillon de taille n de la variable Y ).
3. Représenter à l’aide d’un histogramme la distribution de l’échantillon ech. On pourra utiliser
des classes de longueur 3 réparties uniformément sur l’intervalle [0,51].
4. Comparer cette représentation avec la densité de la loi du χ2 à 20 degrés de liberté (superposer
la densité avec l’histogramme).
4.3.5
Loi de Fisher
On rappelle que si U ∼ χ2 (k), V ∼ χ2 (ℓ) avec U et V indépendantes, alors par définition la
quantité
U/k
V /ℓ
suit une loi de Fisher à k et ℓ degrés de liberté. Par la même méthode qu’à l’exercice précédent,
illustrer la loi de Fisher à 8 et 16 degrés de liberté.
4.4
Corrigés
Exercice 4.1 (La loi binomiale)
1. La variable X suit une loi binomiale B(10, 0.5).
2. Le préfixe d permet d’obtenir la valeur de la distribution au point d’intérêt :
> dbinom(7,size=10,prob=0.5) # ou directement :
> dbinom(7,10,0.5)
3. On précise l’ensemble des valeurs prises par X, puis les probabilités correspondantes :
> k=0:10
> p=dbinom(k,10,0.5)
> plot(k,p,type="h")
4. On procède comme en question précédente :
Arnaud Guyader & Laurent Rouvière
Introduction à R
4.4. Corrigés
>
>
>
>
>
>
25
k=0:10
px=dbinom(k,10,0.5)
py=dbinom(k,10,0.75)
par(mfrow=c(1,2))
plot(k,px,type="h",ylab="Loi de X")
plot(k,py,type="h",ylab="Loi de Y")
X est stochastiquement inférieure à Y .
5. Le préfixe p est d’actualité :
> pbinom(7,10,0.75)
6. L’argument s, pour “step”, permet de représenter une fonction en escalier :
>
>
>
>
k=0:10
F=pbinom(k,10,0.75)
par(mfrow=c(1,1))
plot(k,F,type="s",ylab="cdf de Y")
7. La commande
> abline(h=0.5)
montre graphiquement que la médiane vaut 8.
8. Pour retrouver cette médiane ainsi que les autres quartiles :
> qbinom(0.5,10,0.75)
> qbinom(c(0.25,0.5,0.75),10,0.75)
Exercice 4.2 (La loi normale)
1. Par défaut, les arguments de la loi normale sont m=0 et sd=1.
> x=seq(-4,4,by=0.1)
> plot(x,dnorm(x),type="l",ylab="",ylim=c(0,1))
> lines(x,pnorm(x))
2. La valeur 1.645 est classique pour les intervalles de confiance à 90%.
> qnorm(0.95)
3. Rien de plus simple :
> x=seq(-4,4,by=0.1)
> plot(x,dnorm(x),type="l",ylab="")
> abline(h=0)
4. Les arguments de la fonction segments sont, dans cet ordre, x0 , y0 , x1 , y1 , ce qui donne ici :
> q=qnorm(0.95)
> segments(q,0,q,dnorm(q))
5. 95% à gauche et 5% à droite.
6. Attention : le second paramètre d’une gaussienne sous R est l’écart-type, non la variance !
Exercice 4.3 (Simulations)
1. On stocke :
> ech=rnorm(20)
2. Pour l’histogramme :
> hist(ech,prob=T)
Introduction à R
Arnaud Guyader & Laurent Rouvière
26
Chapitre 4. Probabilités avec R
On peut aussi obtenir un estimateur à noyau par :
> plot(density(ech),main="Estimateur a noyau de la densite")
3. On utilise à nouveau la fonction lines.
> x=seq(-4,4,by=0.1)
> lines(x,dnorm(x),col="red")
4. L’histogramme colle de plus en plus à la densité théorique :
> par(mfrow=c(1,3))
> for (i in c(100,1000,10000)) {
+
ech=rnorm(i)
+
hist(ech,prob=T)
+
lines(x,dnorm(x),col="red")
}
Exercice 4.4 (Loi de Student)
1. Déjà vu :
> x=seq(-4,4,by=0.1)
> plot(x,dnorm(x),type="l",col="red")
2. Allons-y pour un subtil dégradé de couleurs :
> lines(x,dt(x,5),col="yellow")
> lines(x,dt(x,30),col="orange")
Si d est grand, une loi de Student Td est à peu de choses près une loi normale centrée réduite.
3. Ne pas oublier l’argument lty=1 pour des courbes en trait plein comme ici.
> legend("topleft",legend=c("N(0,1)","T5","T30"),
col=c("red","yellow","orange"),lty=1)
Exercice 4.5 (Loi des grands nombres)
1. Loi Forte des Grands Nombres : si X1 , X2 , ... sont i.i.d. et admettent une espérance m, alors
(X1 + · · · + Xn ) tend presque sûrement vers m (convergence en proba pour la loi faible).
2. La loi de Bernoulli est un cas particulier de la binomiale (simple, mais il fallait y penser) :
> x=rbinom(1000,1,0.6)
3. La fonction cumsum permet d’aller très vite pour obtenir le vecteur des sommes cumulées,
d’où se déduisent immédiatement les moyennes successives. La preuve par l’exemple :
> S=cumsum(x)
> M=S/1:1000
> plot(1:1000,M,type="l",xlab="n",ylab="Moyenne des Xi",
main="Loi des grands nombres")
> abline(h=0.6,col="red")
Exercice 4.6 (Théorème central limite)
1. S suit une loi binomiale B(N, p), donc E[S] = N p et Vect(S) = N p(1 − p).
p
2. Le théorème central limite dit que (S − N p)/ N p(1 − p) tend en loi vers une gaussienne
centrée réduite.
3. Ordre et méthode sont de rigueur.
Arnaud Guyader & Laurent Rouvière
Introduction à R
4.4. Corrigés
>
>
>
>
>
>
>
>
>
>
27
N=10
p=0.5
S10=rbinom(1000,N,p)
U10=(S10-N*p)/sqrt(N*p*(1-p))
N=30
S30=rbinom(1000,N,p)
U30=(S30-N*p)/sqrt(N*p*(1-p))
N=1000
S1000=rbinom(1000,N,p)
U1000=(S1000-N*p)/sqrt(N*p*(1-p))
4. Ceci correspond à une illustration graphique du TCL.
>
>
>
>
>
>
>
>
x=seq(-4,4,by=0.01)
par(mfrow=c(1,3))
hist(U10,prob=T)
lines(x,dnorm(x),col="red")
hist(U30,prob=T)
lines(x,dnorm(x),col="red")
hist(U1000,prob=T)
lines(x,dnorm(x),col="red")
Exercice 4.7 (Loi du χ2 )
1. Surtout ne pas faire de boucle.
> d=20
> n=500
> echs=matrix(rnorm(n*d),nrow=n)
2. On éleve chaque coefficient au carré, puis on somme chaque ligne.
> echs2=echs*echs
> ech=apply(echs2,1,sum)
Pd
2
et la loi de Y à
3. Puisque Y =
j=1 Xj avec d = 20, le TCL commence à fonctionner
√
ressembler à une gaussienne de moyenne 20 et d’écart-type 40, de sorte que Y tombe
presque tout le temps entre 0 et 40 (moyenne plus ou moins 3 fois l’écart-type). En prenant
51 comme borne à droite, on met donc de la marge.
> par(mfrow=c(1,1))
> hist(ech,prob=T,breaks=seq(0,51,by=3))
4. On commence à connaître :
> x=seq(0,51,by=0.1)
> lines(x,dchisq(x,20),col="red")
Remarque : pour superposer l’estimateur à noyau et le khi-deux :
> plot(density(ech),main="Estimateur a noyau de la densite")
> x=seq(0,51,by=0.1)
> lines(x,dchisq(x,20),col="red")
Exercice 4.8 (Loi de Fisher)
Tout se passe paisiblement :
Introduction à R
Arnaud Guyader & Laurent Rouvière
28
Chapitre 4. Probabilités avec R
>
>
>
>
>
>
U=rchisq(500,8)
V=rchisq(500,16)
F=2*U/V
hist(F,prob=T)
x=seq(0,max(F),by=0.01)
lines(x,df(x,8,16),col="red")
Arnaud Guyader & Laurent Rouvière
Introduction à R
Chapitre 5
Intervalles de confiance
5.1
Illustration sur des données simulées
On dispose d’un n-échantillon X1 , . . . , Xn i.i.d. tel que Xi suit une loi normale N (µ, σ 2 ). L’objectif
est d’estimer µ.
1. Supposons dans un premier temps la variance σ 2 connue. Un estimateur ponctuel de la
moyenne µ est donné par la moyenne empirique :
n
1X
X̄ =
Xi .
n
i=1
A partir de la loi de X̄, il est possible de calculer un intervalle de confiance de niveau 1 − α.
(a) Rappeler la loi de X̄.
(b) En déduire un intervalle aléatoire [A, B] tel que :
P(µ ∈ [A, B]) = 1 − α.
(c) Simuler un échantillon de taille 100 d’une loi N (5, 1). Calculer l’intervalle de confiance
de niveau 0.95 pour µ à partir de cet échantillon. La vraie moyenne, c’est-à-dire 5,
appartient-elle à cet intervalle de confiance ?
(d) Créer une fonction qui admette en entrée un échantillon ainsi qu’un niveau α et fournisse
en sortie un intervalle de confiance pour la moyenne µ de niveau 1 − α dans le cas
gaussien.
(e) Refaire la question précédente 1000 fois. Combien de fois 5 est-il dans l’intervalle de
confiance ?
2. On reste dans le cas gaussien, mais on suppose désormais que la variance σ 2 n’est pas connue
non plus, le but étant toujours d’estimer µ.
(a) Donner un estimateur non biaisé σ̂ 2 de σ 2 .
(b) Quelle est la loi de la variable aléatoire (n − 1)σ̂ 2 /σ 2 ?
(c) Donner la loi de la variable aléatoire
T =
√
n
X̄ − µ
.
σ̂
(d) En déduire un intervalle aléatoire [A, B] tel que :
P(µ ∈ [A, B]) = 1 − α.
29
30
Chapitre 5. Intervalles de confiance
5.2
Application sur des données réelles
En pratique, la variance est inconnue et les données ne sont pas forcément gaussiennes... Cependant,
lorsque n est grand (supérieur à 30 ou 50), le théorème central limite nous permet de considérer
que la loi de X̄ est “proche” d’une loi gaussienne et celle de (n − 1)σ̂ 2 /σ 2 “proche” d’un khi-deux.
On obtient ainsi l’intervalle de confiance suivant pour µ :
·
¸
σ̂
σ̂
X̄ − tn−1 (1 − α/2) √ ; X̄ + tn−1 (1 − α/2) √ .
n
n
Le fichier poulpeF.csv contient le poids de 240 poulpes femelles. On souhaite connaître, pour la
population mère, un intervalle de confiance de niveau 95% du poids moyen.
1. Importer le fichier de données.
2. Représenter les données.
3. Calculer “à la main” l’intervalle de confiance cherché.
4. Retrouver le résultat à l’aide de la fonction t.test.
5. On souhaite maintenant obtenir un intervalle de confiance de niveau 90%.
(a) Avant tout calcul, pouvez-vous dire si cet intervalle de confiance sera plus grand ou plus
petit que celui de niveau 95% ?
(b) Calculer cet intervalle de confiance.
5.3
Corrigés
Exercice 5.1 ()
√
1. (a) X̄ suit une loi normale N (µ, σ 2 /n), donc n(X̄ − µ)/σ suit une N (0, 1).
(b) Soit q le quantile d’ordre 1 − α/2 d’une gaussienne centrée réduite, alors
¶
µ
√ X̄ − µ
P −q < n
<q =1−α
σ
donc
(c) >
>
>
>
>
µ
P X̄ − q
σ
σ
< µ < X̄ + q
sqrtn
sqrtn
¶
= 1 − α.
n=100
X=rnorm(n,5,1)
Xbar=mean(X)
q=qnorm(0.975)
IC=c(Xbar-q/sqrt(n),Xbar+q/sqrt(n))
(d) > intconf=function(donnees,alpha){
+
Xbar=mean(donnees)
+
q=qnorm(1-alpha/2)
+
IC=c(Xbar-q/sqrt(n),Xbar+q/sqrt(n))
+
return(IC)
+ }
(e) > B=1000
> reponse=rep(0,B)
> for (i in 1:B){
+
X =rnorm(n,5,1)
+
IC=intconf(X,0.05)
Arnaud Guyader & Laurent Rouvière
Introduction à R
5.3. Corrigés
31
+
reponse[i]=(5>=IC[1] & 5<=IC[2])
+ }
> sum(reponse/B) # environ 950 fois
2. (a) L’estimateur non biaisé de la variance est
σ̂ 2 =
(X1 − X̄)2 + · · · + (Xn − X̄)2 )
.
n−1
(b) Cet estimateur suit une loi du khi-deux à (n − 1) ddl (corollaire de Cochran).
(c) T suit une loi de Student à (n − 1) ddl (Cochran again).
(d) Soit q le quantile d’ordre 1 − α/2 d’une Tn−1 , alors
¶
µ
√ X̄ − µ
P −q < n
<q =1−α
σ̂
donc
µ
P X̄ − q
σ̂
σ̂
< µ < X̄ + q
sqrtn
sqrtn
¶
= 1 − α.
Exercice 5.2 ()
1. > poulpe=read.table("poulpeF.csv",header=TRUE)
> summary(poulpe)
> X=poulpe$Poids
2. > hist(X,prob=T) # cet echantillon ne semble en effet pas gaussien
3. > mean(X)-qt(0.975,239)*sd(X)/sqrt(240) # 582.9
> mean(X)+qt(0.975,df=239)*sd(X)/sqrt(240) # 693.3
4. > t.test(X) # 95 percent confidence interval: 582.9252 696.3248
5. (a) Il sera plus petit.
(b) > t.test(X,conf.level=0.90) # 90 percent confidence interval: 592.0978 687.1522
Introduction à R
Arnaud Guyader & Laurent Rouvière
Chapitre 6
Comparaisons de moyennes
Introduction
Nous étudions dans cette fiche différentes manières d’effectuer un test d’hypothèse sous R. Nous
commençons par quelques rappels. Un test d’hypothèse consiste d’abord à formuler deux hypothèses H0 et H1 . Nous illustrons au passage plusieurs concepts liés aux tests tels que les risques
de première et deuxième espèces ou le calcul de probabilité critique.
6.1
6.1.1
Illustrations des risques de première et deuxième espèces
Risque de première espèce
1. Simuler un échantillon de taille n = 100 suivant une loi normale N (5, 1).
2. Soit α = 5% le risque de première espèce. A partir de cet échantillon, effectuer le test
d’hypothèse : H0 : µ = 5 contre H1 : µ 6= 5, en rappelant la définition du risque de première
espèce (ou niveau de risque du test).
3. Effectuer la procédure de test décrite à la question précédente pour B = 1000 échantillons
différents et proposer une stratégie permettant d’estimer le risque de première espèce.
6.1.2
Risque de deuxième espèce
On dispose de deux populations indépendantes P1 et P2 sur lesquelles on cherche à comparer
deux moyennes µ1 et µ2 . On suppose que sur ces deux populations, la variable d’intérêt suit une
loi normale N (µi , σ 2 ). Pour simplifier, on prendra σ = 1. On effectue un test d’hypothèse en
prélevant deux échantillons de tailles respectives n1 et n2 dans les deux populations. On cherche
à effectuer le test d’hypothèse H0 : µ1 = µ2 contre H1 : µ1 6= µ2 .
1. On note X̄ la moyenne empirique du premier échantillon, Ȳ celle du second. Rappeler les
lois de X̄, de Ȳ et de D = Ȳ − X̄. Que devient cette dernière sous H0 ?
2. Pour un niveau de risque α = 5% fixé, en déduire le test de comparaison de moyennes.
3. Considérons désormais µ1 = 5 et µ2 = 5.2 et n1 = n2 = 500. Tracer sur un même graphique
la loi de la statistique de test et la loi de la statistique de test sous H0 .
4. Représenter sur le graphique le risque de deuxième espèce (par exemple par un segment
vertical).
5. Calculer ce risque de deuxième espèce ainsi que la puissance du test.
6. Construire une fonction puissance qui admet en entrée le risque α et les tailles d’échantillons
n1 et n2 , et fournit en sortie la puissance du test.
33
34
Chapitre 6. Comparaisons de moyennes
7. A l’aide de cette fonction, calculer la puissance du test pour chaque valeur de α contenue
dans le vecteur seq(0.01,0.99,by=0.01).
8. Représenter sur un graphique la puissance du test en fonction du risque de première espèce.
Interpréter.
9. On revient maintenant à la valeur α = 0.05. Toujours à l’aide de la fonction de répartition,
calculer la puissance en faisant varier n1 = n2 dans seq(100,1000,by=1).
10. Représenter sur un graphique la puissance du test en fonction de n1 . Interpréter.
6.2
6.2.1
Applications sur des données réelles
Test d’une moyenne
Le fichier poulpeF.csv contient le poids de 240 poulpes femelles. On souhaite comparer le poids
moyen µ à la valeur 600.
1. Importer le fichier de données.
2. Rappeler les différentes étapes du test d’hypothèse H0 : µ = 600 contre H1 : µ 6= 600.
3. Effectuer ce test à l’aide de la fonction t.test et conclure.
4. Retrouver “à la main” la probabilité critique (ou p-value) du test précédent.
5. Tracer la loi de la statistique de test sous H0 et représenter sur le graphique la probabilité
critique (par exemple via deux segments verticaux).
6. Toujours à l’aide de la fonction t.test, effectuer le test d’hypothèse H0 : µ = 600 contre
H1 : µ > 600.
6.2.2
Comparaison de deux moyennes
L’objet de cet exercice est de tester l’égalité des moyennes de deux sous-populations. Formellement,
on teste l’hypothèse H0 : µ1 = µ2 contre l’hypothèse alternative H1 : µ1 6= µ2 . En l’occurrence,
nous allons comparer les poids de poulpes mâles et femelles au stade adulte. Nous disposons
pour cela des données de 15 poulpes mâles et de 13 poulpes femelles pêchés au large des côtes
mauritaniennes. Les données se trouvent dans le fichier poulpe.csv.
1. Importer et résumer le jeu de données.
2. A l’aide de boîtes à moustaches, comparer graphiquement les distributions des poids des
deux populations.
3. Rappeler les différentes étapes du test.
4. A l’aide de la fonction var.test, effectuer le test de comparaison des variances.
5. En utilisant le résultat de la question précédente, toujours à l’aide de la fonction t.test (et
de l’argument var.equal), effectuer le test de comparaison des moyennes.
6. Rappeler ce que signifie la probabilité critique.
6.3
Corrigés
Exercice 6.1 ()
1. > mu=5
> n=100
> X=rnorm(n,mu,1)
2. α est la proba de rejeter H0 alors qu’elle est vraie.
Arnaud Guyader & Laurent Rouvière
Introduction à R
6.3. Corrigés
35
> TX=sqrt(n)*(mean(X)-mu) # TX est la statistique de test
> abs(TX)<=qnorm(0.975) # si TRUE, on garde H0, si FALSE on rejette H0.
Ou bien :
> as.numeric(abs(TX)<=qnorm(0.975)) # si 1, on garde H0, si 0 on rejette H0.
3. Comparable à ce qui a été fait dans le chapitre précédent.
>
>
>
+
+
+
+
>
B=1000
decision=rep(0,B)
for (i in 1:B)
X=rnorm(n,mu,1)
TX=sqrt(n)*(mean(X)-mu)
decision[i]=as.numeric(abs(TX)<=qnorm(0.975))
1-sum(decision)/B # le resultat est proche de 5%
Exercice 6.2 ()
1. X̄ suit une loi normale N (µ1 , 1/n1 ), Ȳ une loi normale N (µ2 , 1/n2 ), D une loi normale
N (µ2 − µ1 , 1/n1 + 1/n2 ). Sous H0 , D suit une loi normale N (0, 1/n1 + 1/n2 ) = N (0, (n1 +
n2 )/(n1 n2 )).
2. En notant q le quantile d’ordre 0.975 d’une gaussienne centrée réduite, la statistique de test
est cette fois
r
n1 n2
×D
TD =
n1 + n2
qui, sous H0 , suit une loi normale centrée réduite, donc il suffit de comparer sa valeur absolue
à q.
p
3. Puisque µ1 = 5 et µ2 = 5.2, TD suit une loi N ( n1n2/(n1 + n2) × (µ2 − µ1 ), 1) tandis que,
sous H0 , TD suit une loi normale centrée réduite.
>
>
>
>
>
>
>
>
>
n1=500
n2=500
mu1=5
mu2=5.2
x=seq(-4,sqrt(n1*n2/(n1+n2))*(mu2-mu1)+4,by=0.01)
TD=dnorm(x,sqrt(n1*n2/(n1+n2))*(mu2-mu1),1) # statistique de test
TD0=dnorm(x,0,1) # statistique de test sous H0
plot(x,TD0,col="red",type="l",ylab="")
lines(x,TD)
4. Le risque de 2ème espèce β correspond à la probabilité de décider H0 alors que H1 est vraie.
> q=qnorm(0.975)
> segments(q,0,q,dnorm(q,sqrt(n1*n2/(n1+n2))*(mu2-mu1),1),col="blue")
β est l’aire sous la courbe noire à gauche du segment.
5. > beta=pnorm(q,sqrt(n1*n2/(n1+n2))*(mu2-mu1),1)
> eta=1-beta # puissance du test
6. > puissance=function(alpha,n1,n2){
+
q=qnorm(1-alpha/2)
+
eta=1-pnorm(q,sqrt(n1*n2/(n1+n2))*(mu2-mu1),1)
+
return(eta)
+ }
Introduction à R
Arnaud Guyader & Laurent Rouvière
36
Chapitre 6. Comparaisons de moyennes
7. >
>
>
+
+
alpha=seq(0.01,0.99,by=0.01)
eta=rep(0,length(alpha)) # initialisation du vecteur des puissances
for (i in 1:length(alpha)){
eta[i]=puissance(alpha[i],n1,n2)
}
8. > plot(alpha,eta,type="l")
Les 2 risques vont dans le sens contraire l’un de l’autre.
9. >
>
>
>
+
+
alpha=0.05
n=100:1000
eta=rep(0,length(n))
for (i in 1:length(n))
eta[i]=puissance(alpha,n[i],n[i])
10. > plot(n,eta,type="l")
La puissance augmente avec la taille de l’échantillon.
Exercice 6.3 ()
1. > poulpe=read.table("poulpeF.csv",header=TRUE)
> summary(poulpe)
> X=poulpe$Poids
2. La statistique de test est
√ X̄ − 600
n
,
σ̂
sous H0 , donc comparaison de |TX | à qt (0.975, 239).
TX =
avec σ̂ = sd(X), ce qui donne TX ) T239
3. > t.test(X,mu=600,conf.level=0.95) # on accepte H0
4. La proba critique est la proba d’observer, sous H0, une valeur de la statistique de test au
moins aussi élevée en valeur absolue.
> TX=sqrt(240)*(mean(X)-600)/sd(X)
> Pc=2*(1-pt(TX,239))
5. > x=seq(-4,4,by=0.01)
> plot(x,dt(x,239),type="l",ylab="")
> segments(TX,0,TX,dt(TX,239),col="blue")
> segments(-TX,0,-TX,dt(-TX,239),col="blue")
La p-value est l’aire sous la courbe en dehors des segments.
6. > t.test(X,mu=600,alternative="greater",conf.level=0.95)
On conserve H0 , en notant que la nouvelle p-value est, logiquement, deux fois moins grande
que la précédente.
Exercice 6.4 ()
1. > donnees=read.table("poulpe.csv",header=T,sep=";") # preciser que le separateur est un poi
summary(donnees)
2. > boxplot(Poids~Sexe,ylab="Poids",xlab="Sexe",data=donnees)
3. Si les variances sont "égales", le test est celui de la Section 1.2, question 2. Il faut donc
commencer par vérifier ce point par un test d’égalité de variances.
4. > var.test(Poids~Sexe,conf.level=0.95,data=donnees)
La proba critique vaut 0.037, on considère donc les variances différentes et on utilise le test
de Welch.
Arnaud Guyader & Laurent Rouvière
Introduction à R
6.3. Corrigés
37
5. On précise dans l’appel à t.test que les variances sont différentes.
> t.test(Poids~Sexe,alternative=’two.sided’,conf.level=0.95,var.equal=FALSE,
data=donnees)
6. Sous H0 (moyennes égales), on aurait environ une chance sur mille d’observer une statistique
de test aussi grande (en valeur absolue). On rejette donc H0 et on considère les moyennes
des poids des femelles et des mâles comme différents, ce qui était clair sur les boxplots.
Introduction à R
Arnaud Guyader & Laurent Rouvière
Chapitre 7
Tests du χ2
Test du χ2 d’indépendance
7.1
Le but est ici de tester l’indépendance entre deux variables qualitatives. On considère que les
données sont contenues dans un tableau de contingence.
7.1.1
Principe
Pour tester l’indépendance de deux variables qualitatives, on teste l’hypothèse nulle H0 : “les deux
variables sont indépendantes” contre l’hypothèse alternative H1 : “les deux variables ne sont pas
indépendantes”. Pour cela, on construit la statistique de test suivante :
χ2obs
J
I X
X
(nij − Tij )2
=
Tij
(7.1)
i=1 j=1
où nij est l’effectif observé pour la modalité i de la première variable et la modalité j de la seconde,
Tij correspond à l’effectif sous l’hypothèse d’indépendance, I et J étant les nombres de modalités
de chacune des variables. Ainsi, n représentant l’effectif total, nous avons
P
P
nij
j nij
Tij = np̂i• p̂•j
avec
p̂i• =
et
p̂•j = i
.
n
n
Sous l’hypothèse H0 , on peut montrer que χ2obs suit asymptotiquement une loi du χ2 à (I − 1) ×
(J − 1) degrés de liberté.
7.1.2
Not even God could sink this ship
Le Titanic a emporté à son bord 325 passagers en première classe, 285 en deuxième classe, 706
passagers en troisième classe et 885 membres d’équipage. Parmi les survivants, on comptait 203
passagers en première classe, 118 en deuxième classe, 178 en troisième classe et 212 membres
d’équipage. Y a-t-il un lien entre le fait d’avoir survécu et la classe ?
1. Rappeler les différentes étapes du test permettant de répondre à cette question.
2. Créer sur R la matrice :
C1 C2 C3
E
survie 203 118 178 212
mort
122 167 528 673
3. Effectuer le test en question à l’aide de la fonction chisq.test.
39
Chapitre 7. Tests du χ2
40
7.2
Test d’ajustement à une loi multinomiale
L’objectif est cette fois de tester l’adéquation d’un échantillon (N1 , . . . , Nr ) de taille totale n =
N1 + · · · + Nr à une loi multinomiale M(n, p1 , . . . , pm ) où les pi sont connus.
7.2.1
Principe
Pour ce faire, on construit la statistique de test suivante :
χ2obs
=
m
X
(Ni − npi )2
i=1
npi
.
Sous l’hypothèse H0 , χ2obs suit asymptotiquement une loi du χ2 à (m − 1) degrés de liberté.
7.2.2
Winter is coming
On a relevé les dates de naissance d’un échantillon de personnes puis regroupé ces naissances par
saison, ce qui donne le tableau suivant :
Nombre de naissances
Automne
380
Hiver
435
Printemps
483
Eté
410
Peut-on considérer que les naissances sont uniformément réparties sur les saisons de l’année ?
1. Donner les différentes étapes du test permettant de répondre à cette question.
2. Visualiser les données, par exemple via la fonction barplot.
3. Effectuer le test en question à l’aide de la fonction chisq.test.
7.3
Corrigés
Exercice 7.1 (Titanic)
1. Sous l’hypothèse H0 d’indépendance entre la survie et la classe, la statistique (??) suit (grosso
modo) une loi du χ2 à 3 degrés de liberté. Il suffit donc de déterminer la probabilité critique
associée à cette statistique de test ou de la comparer au quantile d’ordre 0.95.
2. Création de la matrice de contingence :
> tab=matrix(c(203,118,178,212,122,167,528,673),ncol=4,byrow=T)
> rownames(tab)=c("survie","mort")
> colnames(tab)=c("C1","C2","C3","E")
Commençons par faire le test à la main :
>
>
>
>
tab1
tab2
tab3
khi2
=
=
=
=
matrix(rep(apply(tab,1,sum),4),ncol=4)
matrix(rep(apply(tab,2,sum),2),ncol=4,byrow=T)
tab1*tab2/2201
sum((tab-tab3)^2/tab3)
On trouve 190.4 pour un khi-deux à 3 ddl (sous H0 ), c’est beaucoup, et rien d’étonnant vu
les données... A titre de comparaison, le quangtile d’ordre 0.95 du khi-deux à 3 ddl
> qchisq(0.95,df=3) # 7.814728. L’affaire est donc entendue...
3. Le test du chi-deux est bien sûr implémenté en R et il ne servait à rien de le refaire à la
main :
> chisq.test(tab)
Arnaud Guyader & Laurent Rouvière
Introduction à R
7.3. Corrigés
41
La proba critique est inférieure à 2.2 × 10−16 : les variables ne sont clairement pas indépendantes. En d’autres termes, il valait mieux être riche pour avoir une chance de survivre...
Exercice 7.2 (Naissances)
1. Le principe est de tester si N = (380, 435, 483, 410) est le résultat d’un tirage multinomial
M(1708, 1/4, 1/4, 1/4, 1/4).
2. > N=c(380,435,483,410)
> colnames(N)=c("Automne","Hiver","Printemps","Ete")
> barplot(N,col=c("brown","black","green4","gold"))
3. A nouveau, le test du khi-deux se fait très simplement :
> chisq.test(N,p=c(1/4,1/4,1/4,1/4))
La proba critique est 4×10−3 donc on rejette l’hypothèse selon laquelle les naissances seraient
uniformes sur les saisons.
Introduction à R
Arnaud Guyader & Laurent Rouvière
Chapitre 8
Test d’une proportion
Introduction
L’objet de cette fiche est de tester la position d’une proportion par rapport à une valeur donnée.
Le test proposé permet également de tester l’égalité de deux proportions.
8.1
Exemple
Au cours d’un sondage électoral, Alice a reçu 554 opinions favorables, tandis que Bob n’en a reçu
que 446. Au vu de ces résultats, peut-on considérer que Alice va remporter l’élection ?
Implicitement nous supposons que l’échantillon est représentatif, qu’il est tiré avec remise et que
les électeurs voteront le jour du vote en respectant l’intention exprimée. Bien sûr, les sondages
aléatoires simples utilisent des échantillons tirés sans remise, mais la procédure détaillée ci-dessous
constitue une approximation raisonnable dans le cadre d’une taille de population très grande par
rapport à la taille de l’échantillon, autrement dit quand le taux de sondage est faible.
On peut répondre à la question via un test d’hypothèse :
H0 : p = 0.5
contre
H1 : p > 0.5
1. Effectuer ce test “à la main”.
2. Effectuer ce test sur R via la fonction prop.test.
8.2
To be or not to be independent ?
Appliquons ce test au référendum du 18 septembre en Ecosse. Les sondages sont tous effectués sur
environ mille personnes.
1. A sept jours de celui-ci, selon un sondage ICM pour The Guardian, 52% sont contre l’indépendance tandis que 48% sont pour celle-ci.
2. A six jours de celui-ci, selon une enquête YouGov pour The Times et The Sun, 51% sont
contre l’indépendance tandis que 49% sont pour celle-ci.
3. A cinq jours de celui-ci, selon un sondage réalisé par Survation et commandée par le camp
en faveur du non, 54% sont contre l’indépendance tandis que 46% sont pour celle-ci.
43
44
Chapitre 8. Test d’une proportion
8.3
Corrigés
Exercice 8.1 (Alice et Bob)
1. Notons n = 1000, p = 1/2 et p̂ le résultat du sondage. Sous H0 , le nombre de votants
pour Alice, c’est-à-dire np̂, suit une loi binomiale B(n, p). Pour un test unilatéral de niveau
de confiance 95%, on rejette donc H0 si np̂ est supérieur au quantile d’ordre 0.95 d’une
binomiale B(n, p). Ici ceci conduit à
> qbinom(0.95,1000,0.5)
Et on trouve 526, qui est inférieur à 554, donc on rejette H0 et on accepte p > 0.5.
2. Le test peut également se faire directement comme suit :
> prop.test(554,1000,p=0.5,alternative="greater")
l’intervalle de confiance à 95% pour p est [0.527, 1], ce qui est cohérent avec le résultat
précédent.
Exercice 8.2 (Indépendance de l’Ecosse)
On applique le test précédent aux différents sondages.
1. > prop.test(520,1000,p=0.5,alternative="greater")
et l’intervalle de confiance à 95% pour p est [0.49, 1].
2. > prop.test(510,1000,p=0.5,alternative="greater")
et l’intervalle de confiance à 95% pour p est [0.48, 1].
3. > prop.test(540,1000,p=0.5,alternative="greater")
et l’intervalle de confiance à 95% pour p est [0.51, 1]. Au final, ce fut 55.3% contre l’indépendance.
Arnaud Guyader & Laurent Rouvière
Introduction à R
Chapitre 9
Régression linéaire simple
9.1
Introduction
La régression linéaire simple est une méthode statistique permettant de modéliser la relation linéaire entre deux variables quantitatives dans un objectif explicatif et/ou prévisionnel. Nous disposons d’une variable explicative (notée X) et une variable à expliquer (notée Y ), liées par le modèle
suivant :
Y
= β0 + β1 X + ε,
où ε est la variable de bruit ou erreur de mesure. Les paramètres β0 et β1 sont inconnus et l’objectif
est de les estimer à partir d’un échantillon de n couples (x1 , y1 ), . . . , (xn , yn ). Le modèle devient
sous forme indicée :
yi = β 0 + β 1 x i + ε i ,
les variables εi étant typiquement supposées i.i.d. suivant une loi gaussienne centrée. Le coefficient
β0 correspond à l’ordonnée à l’origine (intercept). Pour estimer les paramètres, on minimise la
somme des carrés des écarts entre la variable à expliquer et la droite de régression (critère des
moindres carrés ordinaires). On minimise donc la quantité suivante :
min
β0 ,β1
n
X
i=1
(yi − β0 − β1 xi )2 .
(9.1)
Une fois les paramètres estimés (notés β̂0 et β̂1 ), on obtient la droite de régression :
f (x) = β̂0 + β̂1 x,
ce qui permet éventuellement d’effectuer des prévisions. Les valeurs ajustées ou lissées sont définies
par :
ŷi = β̂0 + β̂1 xi ,
et les résidus sont alors estimés par :
ε̂i = yi − ŷi .
45
46
Chapitre 9. Régression linéaire simple
9.2
Exemple
La pollution de l’air constitue une des préoccupations majeures de santé publique. De nombreuses
études épidémiologiques ont permis de mettre en évidence l’influence sur la santé de certains
composés chimiques comme le dioxyde de souffre (SO2 ), le dioxyde d’azote (NO2 ), l’ozone (O3 ) ou
des particules sous forme de poussières contenues dans l’air.
Des associations de surveillance de la qualité de l’air existent sur tout le territoire français et mesurent la concentration des polluants. Elles enregistrent également les conditions météorologiques
comme la température, la nébulosité, le vent, etc.
Nous souhaitons analyser ici la relation entre le maximum journalier de la concentration en ozone
(en µg/m3 ) et la température. Nous désignerons donc par :
– X la variable explicative : température à midi T12 ;
– Y la variable à expliquer : maximum de la concentration en ozone maxO3 (en µg/m3 ).
Nous disposons de 112 données relevées durant l’été 2001 à Rennes. Ces données se trouvent dans
le fichier ozone.txt.
1. Importer les données et représenter le nuage de points.
2. Selon vous, un ajustement linéaire paraît-il justifié ?
3. Il existe une solution explicite au problème de minimisation (??), notée (β̂0 , β̂1 ). Sur R, la
fonction lm permet de calculer la valeur de ces estimateurs. Après avoir consulté l’aide de
cette fonction, donner les valeurs de (β̂0 , β̂1 ).
4. A l’aide de la fonction names, lister toutes les sorties du modèle issu de la fonction lm.
5. En déduire un moyen simple d’affecter les coefficients à un vecteur β et de calculer le critère
des moindres carrés pour le modèle que vous avez construit.
6. La droite y = β̂0 + β̂1 x est appelée droite des moindres carrés (ou droite de régression).
Représenter la droite de régression et le nuage de points sur une même fenêtre graphique.
7. Représenter les résidus et calculer la valeur du critère des moindres carrés.
8. La température prévue pour demain est égale à 25 degrés. Comment le modèle construit
peut-il être utilisé pour prévoir la concentration en ozone ?
9. Calculer “à la main” la valeur prédite.
10. Retrouver cette valeur à l’aide de la fonction predict.
9.3
Exercice
Simuler 1000 échantillons (Xi , Yi )1≤i≤100 suivant le modèle
Yi = 1 + 4Xi + εi ,
εi ∼ N (0, 1),
avec les Xi répartis régulièrement sur l’intervalle [0, 1].
1. Pour les 1000 échantillons simulés, calculer les estimateurs des moindres carrés β̂0 et β̂1 .
2. Etudier la distribution de ces estimateurs : on comparera notamment les variances obtenues
numériquement à celles vues en cours (ou pas... auquel cas cf. Wikipedia).
9.4
Corrigés
Exercice 9.1 (Ozone)
1. > ozone=read.table("ozone.txt",header=T)
> summary(ozone)
Ce sont donc les première et troisième colonnes que l’on va garder :
Arnaud Guyader & Laurent Rouvière
Introduction à R
9.4. Corrigés
47
2. > ozone=ozone[,c(1,3)] # ou bien : ozone = ozone[,c("maxO3","T12")]
> summary(ozone)
> plot(maxO3~T12,data=ozone,pch=15,cex=.5)
3. Vue la forme du nuage de points, un ajustement linéaire ne semble pas farfelu.
4. > reg=lm(maxO3~T12,data=ozone)
> summary(reg)
On a donc β̂0 = −27.42 et β̂1 = 5.47.
5. > names(reg)
6. > beta=reg$coefficients # ou plus court : beta=reg$coef
> SCR=sum((ozone$maxO3-(beta[1]+beta[2]*ozone$T12))^2)
La Somme des Carrés Résiduelle vaut donc 33947.85.
7. > abline(beta[1],beta[2],col="red")
8. > plot(reg$residuals,ylab="residus")
Noter qu’il vaut mieux regarder les résidus studentisés, cf. chapitre suivant.
> SCR=sum(reg$residuals^2)
Noter que σ̂ 2 = SCR/(n − 2) avec n = 112, ce qui donne σ̂ = 17.57 qui apparaît bien dans
summary(reg) en Residual standard error.
9. On regarde la valeur correspondant à T12=25 sur la droite de régression.
10. > maxO3p=beta[1]+beta[2]*25
La prévision du maximum d’ozone pour demain est donc 109.3 µg/m3 .
11. Il faut construire un data-frame avec le même nom de variable.
> demain=data.frame(25)
> colnames(demain)="T12"
> predict(reg,newdata=demain)
Et si on veut en plus un intervalle de prevision a 95%, il suffit de taper :
> predict(reg,newdata=demain,interval="pred")
Exercice 9.2 (Distribution des estimateurs)
1. > n=100
> B=1000
> X=seq(0,1,length=n) # les Xi sont ainsi regulierement repartis
> matY=matrix(0,ncol=n,nrow=B)
> beta=matrix(nrow=B,ncol=2)
> for (i in 1:B)
+
matY[i,]=1+4*X+rnorm(n)
+
beta[i,]=coef(lm(matY[i,]~X))
+
2. > summary(beta)
> hist(beta[,1],freq=FALSE) # une brave tete de gaussienne
> hist(beta[,2],freq=FALSE) # idem
> var(beta[,1])
Résultat à comparer à la formule théorique
P 2
Xi
2
V (β̂0 ) = σ P
,
n (Xi − X̄)2
avec dans notre cas σ 2 = 1.
Introduction à R
Arnaud Guyader & Laurent Rouvière
48
Chapitre 9. Régression linéaire simple
> Vth0=sum(X^2)/(n*sum((X-mean(X))^2))
Tout va bien, ça coïncide.
> var(beta[,2])
Résultat à comparer à la formule théorique
avec toujours σ 2 = 1.
V (β̂1 ) = P
σ2
,
(Xi − X̄)2
> Vth1=1/sum((X-mean(X))^2) # I love it when a plan comes together
Arnaud Guyader & Laurent Rouvière
Introduction à R
Chapitre 10
Régression linéaire multiple
10.1
Introduction
La régression linéaire multiple consiste à expliquer et/ou prédire une variable quantitative Y à partir de p variables quantitatives X1 , · · · , Xp . Le modèle de régression multiple est une généralisation
du modèle de régression simple vu en fiche 9. Nous supposons donc que les n données collectées
suivent le modèle suivant :
yi = β0 + β1 xi1 + β2 xi2 + · · · + βp xip + εi ,
i = 1, · · · , n
(10.1)
où les xij sont des nombres connus mesurant les variables explicatives et que l’on range dans une
matrice X appelée matrice du plan d’expérience (la première colonne de X étant le vecteur uniquement constitué de 1). Les paramètres βj du modèle sont inconnus et à estimer. Le paramètre β0
correspond à la constante du modèle. Les εi sont des variables aléatoires inconnues et représentent
les erreurs de mesure. Comme en régression linéaire simple, elles sont supposées i.i.d. suivant une
loi gaussienne centrée.
En écrivant le modèle (??) sous forme matricielle, nous obtenons :
Yn×1 = Xn×(p+1) β(p+1)×1 + εn×1 .
A partir des observations, nous estimons les paramètres inconnus du modèle en minimisant le
critère des moindres carrés :

2
p
n
X
X
 yi − β 0 −
β̂ = argmin
βj xij  = argmin(Y − Xβ)′ (Y − Xβ).
β0 ,··· ,βp i=1
Rp+1
β∈
j=1
Si la matrice X est de plein rang, c’est-à-dire si les variables explicatives ne sont pas colinéaires,
l’estimateur des moindres carrés de β est :
β̂ = (X ′ X)−1 X ′ Y.
Une fois les paramètres βj estimés, on peut calculer les valeurs lissées (ou ajustées) :
ŷi = β̂0 + β̂1 xi1 + · · · + β̂p xip ,
ou prévoir de nouvelles valeurs. La différence entre la valeur observée et la valeur lissée est par
définition le résidu estimé :
ε̂i = yi − ŷi .
L’analyse des résidus est primordiale car elle permet de vérifier l’ajustement individuel du modèle
(point aberrant) et l’ajustement global en vérifiant, par exemple, qu’il n’y a pas de structure.
49
50
Chapitre 10. Régression linéaire multiple
10.2
Exemple
Nous reprenons le jeu de données sur l’ozone de la fiche 9. Nous souhaitons analyser ici la relation
entre le maximum journalier de la concentration en ozone (en µg/m3 ) et la température à différentes
heures de la journée, la nébulosité à différentes heures de la journée, la projection du vent sur l’axe
Est-Ouest à différentes heures de la journée et la concentration maximale en ozone de la veille du
jour considéré. Nous disposons de 112 données relevées durant l’été 2001.
1. Importer les données. Créer un data-frame comportant uniquement les colonnes relatives
à la variable à expliquer et aux variables explicatives mentionnées ci-dessus (c’est-à-dire
quantitatives).
2. Résumer ce data-frame pour vérifier que l’importation s’est bien passée.
3. Estimer les paramètres grâce à la fonction lm, l’instruction Y~. signifiant qu’on veut expliquer
Y par toutes les autres variables du data-frame (ce qui est moins fastidieux que d’énumérer
les 10 variables explicatives en question).
4. Analyser les sorties du modèle construit. Comment interpréter les probabilités critiques obtenues dans le tableau des coefficients ?
5. Il est possible de faire un choix descendant (pas à pas) de variables à la main. On enlèverait
la moins significative, soit T9, puis on recalculerait les estimations et ainsi de suite. Il existe
dans R un package qui traite du choix de variables : le package leaps. La fonction regsubsets
retourne, pour différents critères (bic, R2 ajusté, Cp de Mallows, etc.), le meilleur modèle (si
nbest=1) à 1 variable explicative, à 2 variables explicatives, ..., à nvmax variables explicatives.
La représentation graphique permet d’analyser ces résultats.
> library(leaps)
> choix = regsubsets(maxO3~.,data=ozone.m,nbest=1,nvmax=11)
> plot(choix,scale="bic")
Au vu du graphique obtenu, choisir les variables à conserver dans le modèle.
6. Reprendre la régression multiple des questions précédentes avec ce modèle.
7. Obtenir les résidus studentisés par la fonction rstudent. Les représenter, ainsi que les droites
horizontales correspondant à l’intervalle de confiance à 95%.
10.3
Exercice
1. Simuler un échantillon (Xi , Yi )1≤i=1≤1000 où Xi = (Xi1 , Xi2 , . . . , Xi5 ) suivant le modèle
Yi = 1 + 4Xi1 + 5Xi2 + 2Xi3 + 6Xi4 + 5Xi5 + εi ,
εi ∼ N (0, 1)
et où les Xij seront toutes simulées suivant des lois uniformes sur [0; 10].
2. Simuler 1000 réalisations de 5 variables X6 , . . . , X10 suivant des lois normales centrées réduites.
3. Construire le modèle de régression linéaire permettant d’expliquer la variable Y par les 10
variables X1 , . . . , X10 .
4. A l’aide de la procédure de choix de variables détaillée ci-dessus, sélectionner un modèle
linéaire.
Arnaud Guyader & Laurent Rouvière
Introduction à R
10.4. Corrigés
10.4
51
Corrigés
Exercice 10.1 (Ozone)
1. > ozone = read.table("ozone.txt",header=T)
> summary(ozone)
> ozone=ozone[,1:11]
Nous avons ainsi sélectionné la variable à expliquer et les variables explicatives.
2. > summary(ozone) # OK
3. > reg=lm(maxO3~.,data=ozone)
4. > summary(reg)
Testées une à une, les seules variables significatives sont maxO3v et Ne9, mais la régression
étant multiple et les variables explicatives non orthogonales, il est délicat d’utiliser ces tests.
En effet, le test sur un coefficient revient à tester la significativité d’une variable alors que les
autres sont dans le modèle. Autrement dit, cela revient à tester que la variable n’apporte pas
d’information supplémentaire sachant que toutes les autres variables sont dans le modèle,
ce qui est bien généralement le cas. Il est donc important et plus pertinent d’appliquer des
procédures de choix de modèle comme ci-dessous.
5. > library(leaps)
> choix=regsubsets(maxO3~.,data=ozone,nbest=1,nvmax=11)
> plot(choix,scale="bic")
Le critère est optimum pour la ligne en haut du graphique. Nous conservons, pour le critère
BIC, le modèle à 4 variables : T12, Ne9, Vx9 et maxO3v. Nous définissons ainsi un nouveau
modèle avec ces variables.
6. > regbis=lm(maxO3~T12+Ne9+Vx9+maxO3v,data=ozone)
> summary(regbis)
7. > res=rstudent(regbis)
> summary(res)
On peut montrer que si notre modèle est correct, i.e. si
maxO3=beta0+beta1*T12+beta2*Ne9+beta3*Vx9+beta4*maxO3v+eps
avec les epsilons gaussiens indépendants et homoscédastiques, alors ces résidus suivent une
loi de Student à 106 ddl, i.e. en gros une loi N(0,1). Donc 95% d’entre eux doivent être entre
-2 et +2.
> plot(res,ylab="residus")
> abline(h=-2,col="red")
> abline(h=2,col="red")
A première vue, il n’y a pas d’incohérence.
Exercice 10.2 (Sélection de variables)
1. > n=1000
> X15=matrix(10*runif(5*n),ncol=5)
> Y=1+4*X15[,1]+5*X15[,2]+2*X15[,3]+6*X15[,4]+5*X15[,5]+rnorm(n)
2. > X610=matrix(rnorm(5*n),ncol=5)
3. On commence par tout mettre dans un date-frame.
> donnees=data.frame(cbind(Y,X15,X610))
> modele=lm(Y~.,data=donnees)
> summary(modele)
Introduction à R
Arnaud Guyader & Laurent Rouvière
52
Chapitre 10. Régression linéaire multiple
4. > library(leaps)
> choix=regsubsets(Y~.,data=donnees,nbest=1,nvmax=10)
> plot(choix,scale="bic")
La sélection ne conserve bien que les variables pertinentes.
5.
Arnaud Guyader & Laurent Rouvière
Introduction à R
Chapitre 11
Analyse discriminante linéaire
11.1
Introduction
L’analyse discriminante linéaire a pour objectif d’expliquer et de prédire les valeurs d’une variable
qualitative Y à partir de variables explicatives quantitatives et/ou qualitatives X = (X1 , . . . , Xp ).
Nous supposons que la variable Y est binaire. L’analyse discriminante linéaire peut être présentée
selon deux aspects différents mais équivalents.
Un premier point de vue consiste à modéliser la probabilité d’appartenance à un groupe à l’aide du
théorème de Bayes. Pour simplifier, on désigne par 0 et 1 les modalités de la variable à expliquer
Y . La règle bayésienne donne une estimation de la probabilité a posteriori d’affectation :
P(Y = 1|X = x) =
π1 P(X = x|Y = 1)
,
π0 P(X = x|Y = 0) + π1 P(X = x|Y = 1)
(11.1)
où π0 = P(Y = 0) et π1 = P(Y = 1) désignent les probabilités a priori d’appartenance aux classes
0 et 1. Ces deux probabilités doivent être fixées par l’utilisateur. Afin de calculer les probabilités
a posteriori d’affectation P(Y = 0|X = x) et P(Y = 1|X = x), l’analyse discriminante modélise
les lois de X sachant Y = j par des lois normales. Plus précisément, on fait l’hypothèse que :
L(X|Y = 0) = N (µ0 , Σ)
tandis que
L(X|Y = 1) = N (µ1 , Σ).
(11.2)
Les paramètres des lois normales (i.e. µ0 , µ1 et Σ) sont estimés par la méthode du maximum de
vraisemblance. Pour un nouvel individu, on déduit ainsi de (11.1) les probabilités a posteriori et
on affecte ce nouvel individu au groupe pour lequel la probabilité a posteriori est la plus grande.
L’analyse discriminante linéaire peut également être envisagée comme une méthode de réduction
de la dimension. Dans ce cas, le principe consiste, comme dans le cas de l’Analyse en Composantes
Principales, à calculer une nouvelle variable, appelée variable canonique discriminante, w′ X =
w1 X1 + . . . + wp Xp comme combinaison linéaire des variables initiales. Elle est calculée de sorte
que le rapport de la variance intergroupe à la variance intragroupe soit maximale (pour plus de
détails voir par exemple Saporta (2006), chapitre 18). Pour un individu x = (x1 , . . . , xp ), la variable
canonique définit une fonction de score S(x) = w1 x1 + . . . + wp xp . L’affectation de l’individu x à
un groupe s’effectue alors en comparant la valeur du score S(x) à une valeur seuil s.
Les deux manières de présenter l’analyse discriminante linéaire ne permettent pas a priori de traiter
le cas de variables explicatives qualitatives. Néanmoins, un codage disjonctif complet des variables
qualitatives permet de réaliser une analyse discriminante linéaire en présence de telles variables.
Chaque modalité de la variable est alors traitée comme une variable quantitative prenant comme
valeurs 0 ou 1. Ceci étant, lorsqu’une analyse discriminante est réalisée avec une ou plusieurs
variables explicatives qualitatives, l’hypothèse de normalité effectuée n’est clairement pas vérifiée :
il faut par conséquent être prudent dans l’interprétation des probabilités a posteriori.
53
54
Chapitre 11. Analyse discriminante linéaire
11.2
Exemple
Nous reprenons le jeu de données ronfle.txt et nous essayons d’expliquer le fait de ronfler (ou non)
par un certain nombre de variables quantitatives et qualitatives. Nous appliquons pour ceci une
analyse discriminante linéaire.
1. Importer et résumer le jeu de données.
2. Construire le modèle avec la fonction lda (pour linear discriminant analysis) du package MASS,
comme vous l’avez fait avec la fonction lm dans les fiches 9 et 10. Expliquer les sorties du
modèle par rapport à ce qui a été dit en introduction, à savoir : Prior probabilities of
groups ? Group means ? Coefficients of linear discriminants ?
3. La sortie ne fournit pas de test statistique permettant de tester la significativité des coefficients de la variable canonique. Néanmoins, au vu des résultats précédents, deux variables
semblent avoir des influences négligeables, lesquelles ? Supprimer ces deux variables du modèle et refaire les questions précédentes. La différence vous semble-t-elle importante ?
4. La fonction lda permet d’estimer le taux de mauvais classement par validation croisée. Il
suffit pour cela d’ajouter l’argument CV=TRUE lors de l’appel à la fonction. On obtient les
labels prédits par le modèle avec la commande :
> prev = lda(RONFLE~.,data=donnees,CV=TRUE)$class
La commande table permet d’obtenir un tableau de contingence. Commenter le tableau
suivant :
> table(prev,donnees$RONFLE)
En déduire le taux de mauvais classement. Y a-t-il une grande différence entre les deux
modèles discutés en question 3 du point de vue de l’erreur de classement ?
5. Les modèles construits précédemment peuvent être utilisés dans un contexte de prévision.
On considère les valeurs suivantes pour un nouveau patient :
age
42
poids
55
taille
169
alcool
0
sexe
F
taba
N
Pour prédire le label de ce nouvel individu, tout se passe comme en régression linéaire, c’està-dire que vous devez commencer par récolter les nouvelles données dans un data-frame qui
possède la même structure que le tableau de données initial (notamment les mêmes noms
de variables), auquel vous pouvez ensuite appliquer la fonction predict. Ceci fait, quel lien
voyez-vous entre les variables class et posterior ?
11.3
Exercice
Supposons X quantitative et unidimensionnelle. Notons x′ = (x′1 , . . . , x′n0 ) et x′′ = (x′′1 , . . . , x′′n1 )
les données selon que la variable réponse Y vaut 0 ou 1, de sorte que n0 + n1 = n.
1. Préciser π0 et π1 lorsque les probabilités a priori sont fixées par les fréquences empiriques.
2. Déterminer les estimateurs au maximum de vraisemblance de µ0 , µ1 et σ 2 = Σ. Déduire de
(11.1) l’expression de log(P(Y = 1|X = x)/P(Y = 0|X = x)) en fonction de n0 , n1 , µ̂0 , µ̂1
et σ̂ 2 . Préciser la règle de décision pour un nouvel individu xn+1 .
3. Appliquer ces résultats sur le jeu de données précédent lorsque X est la variable ALCOOL.
4. Retrouver les sorties de la fonction predict dans ce cas pour un nouvel individu buvant 3
verres de vin par jour.
Arnaud Guyader & Laurent Rouvière
Introduction à R
11.4. Corrigés
11.4
55
Corrigés
Exercice 11.1 (Exemple)
1. > donnees=read.table("ronfle.txt",header=T)
> summary(donnees)
2. On commence par importer le package MASS.
> library(MASS)
> modele=lda(RONFLE~.,data=donnees)
> modele
Prior probabilities of groups : il y a 65 non-ronfleurs pour 35 ronfleurs, donc p̂i0 = 0.35
et p̂i1 = 0.65. Group means : ce sont les estimateurs des moyennes µ̂0 et µ̂1 de chaque
groupe, i.e. µ̂0 correspond aux caractéristiques moyennes d’un non-ronfleur et µ̂1 à celles
d’un non-ronfleur. Coefficients of linear discriminants : c’est l’estimateur du vecteur
ŵ = [ŵ1 , ..., ŵp ] servant à definir la fonction score.
3. On enlève les variables poids et taille, qui ont des coefficients wj très faibles et des moyennes
quasi-identiques d’un groupe à l’autre.
> modelebis=lda(RONFLE~AGE+ALCOOL+SEXE+TABA,data=donnees)
On constate que les coefficients de w ont très peu changé.
4. > prevbis=lda(RONFLE~AGE+ALCOOL+SEXE+TABA,data=donnees,CV=T)$class
> table(prevbis,donnees$RONFLE)
Dans ce tableau de contingence, la verité est en colonnes, la prévision en lignes, le taux de
mauvais classement est donc la somme des coefficients hors diagonale, i.e. (23+13)/100=36%.
Pour le modèle avec toutes les variables, on obtient :
> table(prev,donnees$RONFLE)
ce qui donne 34% d’erreur de classement, donc comparable.
5. Revenons au modèle complet. Puisqu’il y a des variables qualitatives et quantitatives, on
commence par faire deux matrices qu’on regroupe ensuite.
>
>
>
>
>
new1=matrix(c(42,55,169,0),nrow=1)
new2=matrix(c("F","N"),nrow=1)
new=data.frame(new1,new2)
names(new)=names(donnees)[-6]
predict(modele,newdata=new)
class correspond au seuillage de posterior : le modèle prédit une proba de non-ronflement à
près de 80%, donc que cette personne est non-ronfleuse.
Exercice 11.2 (Etude en dimension 1)
1.
2.
3.
4.
5.
Introduction à R
Arnaud Guyader & Laurent Rouvière
Chapitre 12
Régression logistique
12.1
Introduction
La régression logistique a pour objectif d’expliquer et de prédire les valeurs d’une variable qualitative Y , le plus souvent binaire, à partir de variables explicatives X = (X1 , . . . , Xp ) qualitatives
et quantitatives. Si on note 0 et 1 les modalités de Y , le modèle logistique s’écrit :
µ
¶
p(x)
log
= β 0 + β 1 x1 + . . . + β p xp ,
1 − p(x)
où p(x) désigne la probabilité P(Y = 1|X = x) et x = (x1 , . . . , xp ) est une réalisation de X =
(X1 , . . . , Xp ). Les coefficients β1 , . . . , βp sont estimés par la méthode du maximum de vraisemblance
à partir de n observations.
12.2
Exemple
Le traitement du cancer de la prostate change si le cancer a atteint ou non les nœuds lymphatiques
entourant la prostate. Pour éviter une investigation lourde (ouverture de la cavité abdominale) un
certain nombre de variables sont considérées comme explicatives de la variable binaire Y : si Y = 0
le cancer n’a pas atteint le réseau lymphatique, si Y = 1 le cancer a atteint le réseau lymphatique.
Le but de cette étude est donc d’expliquer et de prédire Y par les variables suivantes : l’âge du
patient au moment du diagnostic (age) ; le niveau d’acide phosphatase sérique (acide) ; le résultat
d’une analyse par rayon X, 0= négatif, 1=positif (rayonx) ; la taille de la tumeur, 0=petite,
1=grande, (taille) ; l’état de la tumeur déterminé par biopsie, 0=moyen, 1=grave (grade) ; le
logarithme népérien du niveau d’acidité (log.acid).
1. Importer les données contenues dans le fichier cancerprostate.txt avec l’argument sep
pour préciser qu’elles sont séparées par un point-virgule.
2. Faire un résumé du jeu de données. Quel problème voyez-vous sur les variables qualitatives ?
Le résoudre grâce à la fonction factor, qui permet de les spécifier en tant que telles.
3. Considérons d’abord le modèle logistique permettant d’expliquer la variable Y par la variable
log.acid. Notons X la variable log.acid et x une réalisation de cette variable. Le modèle
logistique s’écrit alors :
µ
¶
p(x)
log
= β0 + β1 x,
1 − p(x)
où p(x) désigne la probabilité P(Y = 1|X = x). La régression logistique appartient à la
famille des modèles linéaires généralisés. Un ajustement de ces modèles sur R est réalisé
57
58
Chapitre 12. Régression logistique
par la fonction glm. L’utilisation de cette fonction est similaire à celle de la fonction lm,
c’est-à-dire qu’il faut écrire un modèle avec une formule du style :
Y
˜ X1 + X2 .
Il faut également spécifier une famille de lois de probabilité. Dans le cadre de la régression
logistique, il s’agit de la famille binomiale.
(a) Obtenir ce modèle sous R.
(b) Au vu du résultat, peut-on considérer que le niveau d’acidité est une variable significative ?
(c) Déterminer p(x) comme une fonction de x.
(d) Tracer cette fonction sur [−2, 2] et ajouter la droite horizontale au niveau 1/2.
(e) A partir de quelle valeur de x = x0 considère-t-on que le cancer a atteint le réseau
lymphatique ? Ajouter au graphique précédent la droite x = x0 .
4. Obtenir maintenant le modèle tenant compte de toutes les variables, noté modele.
5. Nous voulons désormais sélectionner un modèle. La fonction step permet de le faire à l’aide
d’une procédure pas à pas basée sur la minimisation du critère AIC :
> modele_selectionne = step(modele,direction="backward")
Par rapport à la question précédente, quelles variables ont-été supprimées du modèle ?
6. Les modèles logistiques peuvent être utilisés dans un contexte de prévision. Le tableau suivant
contient les six variables explicatives mesurées sur un nouveau patient :
age
61
acide
0.60
rayonx
1
taille
0
grade
1
log.acid.
-0.51
Comme dans les fiches précédentes, pour obtenir la probabilité p(x) prédite par le modele
modele_selectionne pour ce nouvel individu, on collecte d’abord ses données dans un dataframe ayant la même structure que le tableau de données initial (i.e. avec les mêmes noms
de variables et en tenant compte des variables qualitatives) auquel on applique ensuite la
fonction predict avec l’argument type="response".
7. La fonction predict peut aussi être utilisée pour estimer le taux de mal classés du modèle
(proportion d’erreurs commises par le modèle lorsqu’on l’applique sur l’échantillon dont on
dispose).
(a) Calculer les probabilités prédites pour chaque individu de l’échantillon via le modèle
modele_selectionne.
(b) Dresser le tableau de contingence entre les labels prédits et les vrais labels grâce à la
fonction table.
(c) En déduire le taux de mal classés du modèle.
8. Le taux obtenu de cette manière est généralement optimiste puisque le même échantillon est
utilisé pour construire le modèle et pour estimer le taux de mal classés. On peut obtenir une
estimation plus précise grâce à des techniques de type validation croisée. Pour cela on utilise
la fonction cv.glm. Il faut au préalable charger le package boot et créer une fonction de coût
admettant en entrée les valeurs observées de Y ainsi que les probabilités prédites :
> library(boot)
> cout = function(Y_obs,prevision_prob)
return(mean(abs(Y_obs-prevision_prob)>0.5))
> cv.glm(donnees,modele_selectionne,cout)$delta[1]
Arnaud Guyader & Laurent Rouvière
Introduction à R
12.3. Corrigé
12.3
59
Corrigé
1. > donnees=read.table("cancerprostate.txt",header=T,sep=";")
2. > summary(donnees)
Il y a clairement un problème sur les 4 variables qualitatives, vues comme quantitatives.
> for (i in 3:6)donnees[,i]=factor(donnees[,i])
> summary(donnees)
Cette fois c’est bon.
3. (a) > modele0=glm(Y~log.acid,data=donnees,family=binomial)
> summary(modele0)
(b) La probabilité critique associée au test H0 : β1 = 0 contre H1 : β1 6= 0, vaut 0.03, donc
on rejette H0 et on considère la variable log.acid comme significative.
(c) Le modèle donne
log
dont on déduit que
p(x)
= 0.404 + 2.245x,
1 − p(x)
p(x) =
exp(0.404 + 2.245x
.
1 + exp(0.404 + 2.245x)
Noter qu’en toute rigueur il faudrait noter p̂(x) et non p(x).
(d) >
>
>
>
>
beta=coefficients(modele0)
x=seq(-2,2,by=0.01)
p=exp(beta[1]+beta[2]*x)/(1+exp(beta[1]+beta[2]*x))
plot(x,p,type="l",xlab="log.acid",ylab="p(x)")
abline(h=1/2,lty=3)
(e) L’équation p(x0 ) = 1/2 donne x0 = −β1 /β2 . Pour x > x0, on considère donc que le
cancer a atteint les nœuds lymphatiques et on prédit Ŷ = 1, et inversement si x < x0 .
> abline(v=-beta[1]/beta[2],lty=3)
4. > modele=glm(Y~.,data=donnees,family=binomial)
> summary(modele)
5. > modele_selectionne=step(modele,direction="backward")
> summary(modele_selectionne)
Les variables age et grade ont été supprimées.
6. On ne rentre que les variables du modèle sélectionné (on pourrait les rentrer toutes, ce qui
ne changerait rien dès lors qu’on donne les bons noms aux variables)
> new=matrix(c(0.60,1,0,-0.51),nrow=1)
> new=data.frame(new)
> names(new)=names(donnees)[c(2,3,4,7)]
Voilà pour les noms. il reste à transformer les variables qualitatives comme au debut :
> for (i in 2:3)new[,i]=factor(new[,i])
> summary(new) # ouf !
> prev=predict(modele_selectionne,newdata=new,type="response")
On trouve une probabilité de 0.48, donc on prédit que le cancer n’a pas atteint les nœuds
lymphatiques. Cependant, le résultat étant proche de 1/2, la prudence est de mise...
7. (a) > prevglobale=predict(modele_selectionne,newdata=donnees,type="response")
On dispose donc d’un vecteur de 53 probabilités.
Introduction à R
Arnaud Guyader & Laurent Rouvière
60
Chapitre 12. Régression logistique
(b) >
>
>
Il
prevglobaleY=prevglobale>0.5 # on seuille par rapport a 1/2
prevglobaleY # on obtient un vecteur de booleens qu’on transforme en 0 et 1
prevglobaleY=as.numeric(prevglobaleY)
ne reste plus qu’à dresser la table...
> table(donnees$Y,prevglobaleY)
(c) Le taux de mal classés est à nouveau la somme des termes hors diagonale, qui peut se
calculer comme suit
> MC=sum(donnees$Y!=prevglobaleY)/length(prevglobaleY)
ce qui donne environ 20% de mal classés.
8. > library(boot)
> cout=function(Y_obs,prevision_prob){mean(abs(Y_obs-prevision_prob)>0.5)}
> cv.glm(donnees,modele_selectionne,cout)$delta[1]
Donc environ 28% de mal classes, c’est dejà moins bon : etonnov, niet ?
Arnaud Guyader & Laurent Rouvière
Introduction à R
Chapitre 13
Analyse de la variance
13.1
Introduction
L’analyse de la variance (ou ANOVA) à 1 facteur est une méthode statistique permettant de
modéliser la relation entre une variable explicative qualitative à I modalités (notée A) et une
variable à expliquer quantitative (notée Y ). L’objectif principal de l’analyse de variance à 1 facteur
est de comparer les moyennes empiriques de Y pour les I modalités de A. En ce sens, elle peut
être considérée comme une extension du test de comparaison de deux moyennes.
L’analyse de variance à 1 facteur revient donc à étudier l’effet d’un facteur A sur la variable
quantitative Y . Dans cet objectif, on peut construire le modèle suivant :
yij
= µi + εij ,
i = 1, ..., I
j = 1, ..., ni
avec ni l’effectif de la modalité i, yij la j-ème valeur observée pour la sous-population i, µi la
moyenne de la sous-population i et εij le résidu du modèle. Un individu statistique est ainsi défini
par le couple (i, j). L’analyse de variance revient alors à tester l’égalité des µi .
Le modèle peut aussi s’écrire sous la forme classique :
(13.1)
yij = µ + αi + εij ,
avec µ l’effet moyen et αi l’effet propre à la modalité i. Dans cette dernière écriture, nous avons
I + 1 paramètres à estimer dont seulement I sont identifiables. Il faut alors imposer une contrainte
linéaire. Différentes contraintes existent, les plus classiques sont :
– un des αi est fixé à zéro, ce qui revient à considérer la modalité i comme le niveau de référence ;
– la somme des αi est nulle, ce qui revient à prendre la moyenne comme référence.
Les estimations des paramètres, obtenues par moindres carrés, dépendent bien évidemment de la
contrainte choisie. Cependant, quelle que soit cette contrainte, il est toujours possible de tester
la significativité globale du facteur. Ce test, indépendant de la contrainte, est un test de Fisher.
Il consiste à comparer la variabilité expliquée par le facteur A à la variabilité résiduelle. Les
hypothèses de ce test sont donc :
∀i αi = 0
H0 :
contre
H1 : ∃i αi 6= 0.
Ces hypothèses reviennent à tester le sous-modèle contre le modèle complet :
modèle sous H0
yij
= µ + εij ,
yij
= µ + αi + εij ,
modèle sous H1
Enfin, comme après toute modélisation, l’analyse des résidus est primordiale car elle permet de
vérifier l’ajustement individuel du modèle (point aberrant) et l’ajustement global.
61
62
Chapitre 13. Analyse de la variance
13.2
Exemple
Nous reprenons le jeu de données sur l’ozone. Nous souhaitons analyser ici la relation entre le
maximum journalier de la concentration en ozone (en µg/m3 ) et la direction du vent classée en
secteurs (Nord, Sud, Est, Ouest). La variable vent a I = 4 modalités. Nous disposons de 112
données relevées durant l’été 2001.
1. Importer les données. Ne conserver que les variables maxO3 et vent.
2. Quel est le vent dominant durant la période considérée ?
3. Avant une analyse de variance, il est d’usage de construire des boîtes à moustaches par
modalité de la variable qualitative. Représenter ainsi la dispersion du maxO3 en fonction de
la direction du vent.
4. Au vu de ce graphique, diriez-vous que la direction du vent a un effet sur l’ozone ?
5. Pour analyser la significativité du facteur vent, on utilise à nouveau la fonction lm dans un
premier temps, puis la fonction anova.
(a) Ceci fait, que déduire de la probabilité critique trouvée ?
(b) Quelle est l’hypothèse faite sur les εij ?
6. Pour analyser les résidus studentisés, comme en régression linéaire, on fait appel à la fonction
rstudent.
(a) Représenter ces résidus studentisés.
(b) Sur une même fenêtre graphique, mais sur quatre graphes distincts, représenter ces
résidus en fonction des modalités de la variable vent.
(c) Revenir à un seul graphe par fenêtre et représenter les résidus en fonction du vent par
des boîtes à moustaches.
7. On revient aux résultats de la fonction lm.
(a) Quelle modalité du vent est prise en référence ? Pour quelle raison ?
(b) En déduire l’écriture du modèle sous la forme (13.1).
(c) Au vu des probabilités critiques, quelle orientation est comparable à celle prise en référence ?
8. Commenter la ligne de commande suivante :
> modele2 = lm(maxO3~C(vent,base=2),data=ozone)
9. A partir des coefficients de ce modèle, retrouver le précédent.
10. Retrouver le résultat du test de Fisher avec ce modèle.
13.3
Corrigé
1. On importe le jeu de données et on sélectionne les variables d’intérêt.
> ozone = read.table("ozone.txt",header=T)
> summary(ozone)
> ozone=ozone[,c("maxO3","vent")]
2. Résumons le jeu de données.
> summary(ozone)
Le vent d’ouest est donc dominant.
3. > boxplot(maxO3~vent,data=ozone)
Arnaud Guyader & Laurent Rouvière
Introduction à R
13.3. Corrigé
63
4. Il semble en effet y avoir un effet vent.
5. > modele=lm(maxO3~vent,data=ozone)
> anova(modele)
6. (a) La probabilité critique associée au test de Fisher est Pr(>F)=0.02074, donc on rejette
H0 et on en conclut qu’il existe au moins une modalité de la variable vent (i.e. une
direction du vent) qui est significative pour expliquer le max de l’ozone.
(b) Comme d’habitude, on a supposé que les εi,j sont gaussiens indépendants centrés et de
même variance.
7. (a) > res=rstudent(modele)
> plot(res)
> sum(abs(res)>2)length(res)
9% des résidus sont en dehors de [−2, 2], ce qui est encore acceptable pour un IC à 95%.
(b) > par(mfrow=c(2,2))
> plot(res[ozone[,"vent"]=="Est"],xlab="Est",ylab="Residus",ylim=c(min(res),max(res)),p
> plot(res[ozone[,"vent"]=="Nord"],xlab="Nord",ylab="",ylim=c(min(res),max(res)),pch="+
> plot(res[ozone[,"vent"]=="Ouest"],xlab="Ouest",ylab="Residus",ylim=c(min(res),max(res
> plot(res[ozone[,"vent"]=="Sud"],xlab="Sud",ylab="",ylim=c(min(res),max(res)),pch="+")
Remarque : on peut faire plus élégant via le package lattice.
(c) On commence par revenir à un seul graphe pour la fenêtre graphique :
> par(mfrow=c(1,1))
> boxplot(res~vent,data=ozone,ylab="Residus")
8. (a) > summary(modele)
C’est le vent d’est qui est pris comme référence car c’est le premier par ordre alphabétique.
(b) Pour l’est :
yi,j = 105.6 + εi,j .
Pour le vent de nord,
yi,j = 105.6 − 19.471 + εi,j = 86.129 + εi,j .
Et ainsi de suite.
(c) Avec une p-value de 0.77, le vent de sud est comparable au vent d’est du point de vue
de l’effet sur l’ozone. Ceci se voyait sur le boxplot initial
> boxplot(maxO3~vent,data=ozone)
9. > modele2=lm(maxO3~C(vent,base=2),data=ozone)
> summary(modele2)
Cette fois, c’est la deuxième modalité (par ordre alphabétique) qui est prise comme référence,
c’est-à-dire le vent du nord.
10. On a en effet pour le vent du nord
yi,j = 86.129 + εi,j
et pour retrouver par exemple le vent d’est :
yi,j = 86.129 + 19.471 + εi,j = 105.6 + εi,j
qui correspond bien aux coefficients ci-dessus. Etc.
11. Les tests sur les coefficients ont changé (cf. les p-values) : on voit par exemple que c’est le
vent d’ouest qui ressemble au vent du nord, c’est-à-dire des vents de mer. Néanmoins, le
résultat du test de Fisher de significativité globale est exactement le même, ce qui est bien
logique.
Introduction à R
Arnaud Guyader & Laurent Rouvière
Chapitre 14
Modes de convergence stochastique
Introduction
Le but de cette fiche est d’illustrer différents modes de convergence stochastique grâce au package
ConvergenceConcepts du logiciel R. Tant l’utilisation de ce package que la plupart des exemples
ci-après sont détaillés dans l’article de Pierre Lafaye de Micheaux et Benoit Liquet : Understanding
Convergence Concepts : a Visual-Minded and Graphical Simulation-Based Approach, The American
Statistician, Vol. 63, 173-178, 2009.
14.1
Méthode Monte-Carlo pour le calcul d’intégrales
Etant donnée une fonction réelle f : [a, b] → R, on propose dans cette partie d’utiliser la loi des
grands nombres pour trouver une valeur approchée de
Z
b
(14.1)
f (x) dx.
a
Exercice 1
1. Rappeler la loi forte des grands nombres.
2. Montrer que l’intégrale (??) peut s’écrire comme l’espérance d’une variable aléatoire particulière que l’on précisera.
3. Déduire des deux questions précédentes un algorithme permettant d’approcher (??).
4. Appliquer l’algorithme de la question précédente pour approcher les intégrales
Z
1
sin(x) dx et
0
Z
2π
0
sin(x)
√
dx.
1+x
5. Retrouver une valeur approchée de ces intégrales par le calcul ou via le site
http://www.wolframalpha.com.
14.2
Visualisation des modes de convergence
Etant donnée une suite de variables aléatoires réelles (Xn )n∈N et une variable aléatoire réelle X,
il existe différentes manières de caractériser la convergence de (Xn )n∈N vers X : convergence en
probabilité, presque sûre, en moyenne d’ordre r, en loi, etc.
65
66
Chapitre 14. Modes de convergence stochastique
14.2.1
Convergence en probabilité
On rappelle que la suite (Xn )n∈N converge en probabilité vers X si
∀ε > 0
pn = P(|Xn − X| > ε) = P({ω ∈ Ω : |Xn (ω) − X(ω)| > ε}) −−−→ 0.
n→∞
Intuitivement, pour ε > 0 (petit) fixé, on peut visualiser cette notion de convergence pour n en
deux étapes :
(a) on génère un grand nombre M de réalisations de Xn − X ;
(b) on compte la proportion p̂n de ces réalisations qui vérifient |Xn − X| > ε.
Si cette proportion p̂n est faible (notamment si elle tend vers 0 avec n), on pourra penser que Xn
converge vers X en probabilité. Le package ConvergenceConcepts permet justement de visualiser
l’évolution de cette proportion avec n.
Exercice 2
Partant d’une suite de variables
P (Yi ) i.i.d. gaussiennes centrées réduites, on étudie ici la convergence
en probabilité de Xn = n1 ni=1 Yi vers la variable X = 0. Nous choisissons comme paramètre
ε = 0.05, M = 500 et n = 5000. Exécuter sur R les commandes suivantes (on s’intéresse pour
l’instant à p̂n , non à ân ) :
> library(ConvergenceConcepts)
> gen1 = function(n){cumsum(rnorm(n))/(1:n)}
> check.convergence(nmax=5000,M=500,genXn=gen1,mode="p")
1. Etudier les deux graphiques proposés en sortie de la fonction check.convergence (on pourra
par exemple zoomer la fenêtre de gauche pour des valeurs de n variant de 1000 à 2000, etc.).
2. Comment visualise-t-on la convergence en probabilité de (Xn )n∈N vers 0 ?
3. Quel résultat théorique permet de prouver cette convergence ?
14.2.2
Convergence presque sûre
Concernant la convergence presque sûre, on rappelle que (Xn )n∈N converge presque sûrement vers
X si
³n
o´
P ω ∈ Ω : lim Xn (ω) = X(ω) = 1
n→∞
ou encore, par le critère de la limite sup, si
∀ε > 0
an = lim
n→∞
P ({ω ∈ Ω, ∃k ≥ n : |Xk (ω) − X(ω)| > ε}) −n→∞
−−→ 0.
C’est ce dernier critère que nous utilisons pour visualiser la convergence presque sûre. La probabilité
an est estimée selon la même principe que la probabilité pn :
(a) on génère un grand nombre M de trajectoires (Xn0 − X)n0 >n ;
(b) on compte la proportion ân des trajectoires qui sortent au moins une fois de ] − ε, ε[ sur
l’intervalle [n, n0 ].
Reprenons l’exemple précédent :
> check.convergence(nmax=5000,M=500,genXn=gen1,mode="as")
Par rapport aux représentations obtenues précédemment, il suffit en fait de cliquer sur Almost
Sure dans la fenêtre graphique.
Exercice 3
Arnaud Guyader & Laurent Rouvière
Introduction à R
14.2. Visualisation des modes de convergence
67
1. Etudier les deux graphiques proposés en sortie de la fonction check.convergence (on pourra
par exemple zoomer la fenêtre de gauche pour des valeurs de n variant de 1000 à 2000, etc.).
2. Comment visualise-t-on la convergence presque sûre de (Xn )n∈N vers 0 ?
3. A travers les sorties graphiques, comment expliquer que la convergence presque sûre est un
mode de convergence plus fort que la convergence en probabilité ?
4. Quel résultat théorique permet de montrer cette convergence ?
14.2.3
Convergence en moyenne d’ordre r
Soit r > 0 fixé. On rappelle que (Xn )n∈N converge en moyenne d’ordre r vers X si
E[|Xn − X|r ] −−−→ 0.
n→∞
Ce mode de convergence est plus simple à visualiser que les précédents. On peut en effet le voir de
la même manière que des convergences de suites réelles : il suffit de poser un = E[|Xn − X|r ] et de
montrer que (un ) tend vers zéro.
La seule difficulté peut provenir du calcul de l’espérance. Néanmoins, cette espérance peut être
approchée à l’aide d’une méthode Monte-Carlo : on génère un grand nombre M de réalisations de
(Xn − X) et on note (xin − xi ) la i-ème réalisation. La loi des grands nombres assure alors que
E[|Xn − X|r ] ≈
M
1 X i
|xn − xi |r .
M
i=1
Exercice 4
On s’intéresse à la convergence en moyenne d’ordre r (pour r = 1, 2, 3) d’une suite (Xn )n∈N vers
X = 0, où les Xn sont i.i.d. de loi
P(Xn = n0.4 ) =
1
n
et
1
n
P(Xn = 0) = 1 − .
La fonction suivante permet une trajectoire X1 (ω), . . . , Xn (ω) :
> gen2 = function{rbinom(n,1,1/(1:n))*(1:n)^0.4}
1. A l’aide de la fonction check.convergence (avec l’argument mode="r",r=1), que peut-on dire
a priori sur les convergences en moyenne d’ordre 1, 2 et 3 de (Xn )n∈N ?
2. Calculer E[|Xn |r ] et conclure.
Exercice 5
On considère la suite de variables aléatoires (Xn )n∈N définie par :
Xn = 1[m.2−k ;(m+1).2−k [ (Z)
où Z suit une loi uniforme sur [0, 1], n = 2k + m pour k ≥ 0 et 0 ≤ m < 2k .
1. Ecrire X1 , . . . , X5 en fonction de Z et expliquer la manière dont on peut générer une trajectoire X1 (ω), . . . , Xn (ω) (on pourra utiliser un graphique).
2. La fonction suivante permet de générer une trajectoire X1 (ω), . . . , Xn (ω) :
>
+
+
+
gen3 = function(n){
K = round(log(n)/log(2))-1
test_max = c(1)
test_min = c(0)
Introduction à R
Arnaud Guyader & Laurent Rouvière
68
Chapitre 14. Modes de convergence stochastique
+
+
+
+
+
+
+
for (i in 1:K){
test_max = c(test_max,seq(1/(2^i),1,by=1/(2^i)))
test_min = c(test_min,seq(0,1-1/(2^i),by=1/(2^i)))
}
Z = runif(1)
return(as.numeric((Z<test_max & Z>=test_min))[1:n])
}
A l’aide de la fonction check.convergence, que peut-on dire sur la convergence de (Xn )n∈N
(en probabilité, presque sûrement et en moyenne d’ordre 2) ?
3. Etudier mathématiquement la convergence de (Xn )n∈N pour les 3 modes proposés à la question précédente.
14.2.4
Convergence en loi
On dit que (Xn )n∈N converge en loi vers X si
lim FXn (t) = FX (t)
n→∞
en tout point t de continuité de FX . Ainsi, pour visualiser ce mode de convergence, il suffit de
visualiser la convergence de la suite de fonctions FXn (t) vers FX (t) (sur les points de continuité
de FX ). Ceci correspond à la notion de convergence simple d’une suite de fonctions vue en cours
d’analyse en Licence.
Une fois de plus, la principale difficulté consiste à approcher la fonction FXn (t). Néanmoins, si on
dispose d’un générateur aléatoire d’observations de Xn , on peut approcher FXn (t) par la méthode
Monte-Carlo, à savoir
M
1 X
FXn (t) ≈ F̂Xn (t) =
1{xin ≤t}
M
i=1
où x1n , . . . , xM
n désignent M réalisations de Xn .
Exercice 6
On considère une suite i.i.d. (Xn )n∈N de variables aléatoires distribuées suivant une loi exponentielle
de paramètre 1.
1. A l’aide du théorème central limite, trouver une fonction Yn de X1 , . . . , Xn qui converge en
loi vers une loi normale N (0, 1).
2. Pour n = 300, simuler M = 500 réalisations de Yn . Représenter l’histogramme de ces 500
réalisations et le comparer à la densité de la loi N (0, 1).
3. Utiliser la fonction check.convergence (argument mode="L") pour visualiser cette convergence.
4. Vérifier cette convergence en loi à l’aide d’un test de Kolmogorov-Smirnov sous R.
Arnaud Guyader & Laurent Rouvière
Introduction à R
Chapitre 15
Fonctions utiles en R
15.1
Les fonctions génériques
Il existe dans R des fonctions génériques, c’est-à-dire des fonctions qui peuvent être appelées par
un même ordre mais qui donnent des résultats différents suivant la classe de l’objet sur lequel elles
sont appliquées. Les principales fonctions génériques sont les suivantes :
Fonction
print
plot
summary
Description
écrit les résultats (l’ensemble ou un extrait)
construit un graphique
résume les résultats de fonctions de modélisation
Il existe beaucoup de fonctions qui commencent par print (ou plot ou summary), par exemple
print.lm, print.PCA, print.rpart, etc. Elles peuvent toutes être appelées par l’instruction générique
print plutôt que par print.lm, print.PCA, print.rpart, etc. Cependant pour avoir par exemple une
aide sur la fonction qui écrit un objet rpart, il faut faire help("print.rpart").
15.2
Les fonctions numériques
Fonction
abs(x)
sqrt(x)
ceiling(x)
Description
valeur absolue
racine carrée
donne l’entier naturel supérieur ou égal : ceiling(5.24)= 6, ceiling(5)= 5, ceiling(-5.24)= −5
floor(x)
donne l’entier naturel inférieur ou égal :
floor(5.24)= 5, floor(5)= 5, floor(-5.24)= −5
trunc(x)
tronque la valeur de x vers 0 : trunc(-5.24)= −5
round(x,digits=n) arrondit avec n chiffres après la virgule :
round(5.236,digits=2)= 5.24
signif(x,digits=n) arrondit avec n chiffres en tout : signif(5.236,digits=2)= 5.2
cos(x),
sin(x), fonctions trigonométriques
tan(x), acos(x),
cosh(x), etc.
log(x)
logarithme népérien
log10(x)
logarithme en base 10
exp(x)
exponentielle
69
70
Chapitre 15. Fonctions utiles en R
15.3
Les fonctions de gestion de données
Fonction
c
cbind
Description
concatène dans un vecteur
concatène des tableaux l’un à côté de l’autre (juxtaposition en colonnes)
cbind.data.frame
juxtapose des data-frames en colonnes
rbind
juxtapose des tableaux en lignes (attention, colle les
lignes l’une en dessous de l’autre sans s’occuper des
noms de colonnes)
rbind.data.frame
juxtapose des data-frames en lignes ; les noms de colonnes des data-frames doivent être identiques (les
colonnes sont triées dans le même ordre pour tous
les tableaux afin de mettre les variables en correspondance avant la concaténation)
merge
permet de fusionner deux tableaux selon une clef
sort
trie un vecteur par ordre croissant (décroissant si
decreasing = TRUE)
order
trie un tableau en fonction d’une ou plusieurs colonnes (ou lignes) : x[order(x[,3],-x[,6]), ] trie
le tableau x en fonction (croissante) de la troisième
colonne de x puis, en cas d’égalité dans la troisième
colonne de x, en fonction (décroissante) de la sixième
colonne de x
by(data,IND,FUN) applique la fonction FUN à chaque modalité du vecteur IND sur le tableau data
dimnames
donne les noms des dimensions d’un objet (liste, matrice, data-frame, etc.)
rownames
donne les noms des lignes d’une matrice
row.names
donne les noms des lignes d’un data-frame
colnames
donne les noms des colonnes d’une matrice
col.names
donne les noms des colonnes d’un data-frame
names
donne les noms d’un objet (liste, matrice, dataframe, etc.)
dim
donne les dimensions d’un objet
nrow ou NROW
donne le nombre de lignes d’un tableau (en majuscules, permet d’avoir une réponse même si l’objet est
un vecteur)
ncol ou NCOL
donne le nombre de colonnes d’un tableau (en majuscules, permet d’avoir une réponse même si l’objet
est un vecteur)
factor
définit un vecteur comme un facteur (si
ordered=TRUE les niveaux des facteurs sont
supposés ordonnés)
levels
donne les niveaux d’un facteur
nlevels
donne le nombre de niveaux d’un facteur
as.data.frame(x)
transforme x en data-frame
as.matrix(x)
transforme x en matrice
as.list(x)
transforme x en liste
as.vector(x)
transforme x en vecteur
Arnaud Guyader & Laurent Rouvière
Introduction à R
15.4. Les distributions de probabilité
Fonction
is.data.frame(x)
is.matrix(x)
is.vector(x)
is.list(x)
class(x)
mode(x)
as.character(x)
as.numeric(x)
as.integer(x)
as.logical(x)
is.character(x)
is.numeric(x)
is.integer(x)
is.logical(x)
which
which.min
which.max
is.na
is.null
length
any
split(x,fac)
15.4
71
Description
teste si x est un data-frame
teste si x est une matrice
teste si x est un vecteur
teste si x est une liste
donne le type de l’objet x (matrix, data-frame, etc.)
donne le mode de l’objet x (liste, numérique, logique)
transforme x en caractère
transforme x en numérique
transforme x en entier
transforme x en booléen
teste si x est une chaîne de caractères
teste si x est numérique
teste si x est un entier
teste si x est un booléen
donne les positions des valeurs vraies d’un vecteur ou
d’un tableau logique : le paramètre arr.ind=TRUE
permet de retourner les numéros de lignes et
de colonnes du tableau : which(c(1,4,3,2,5,3)
== 3) retourne 3 6 ; which(matrix(1:12,nrow=4)
==3,arr.ind=TRUE) retourne (ligne 3,colonne 1)
donne l’indice du minimum d’un vecteur
donne l’indice du maximum d’un vecteur
teste si la donnée est manquante
teste si la donnée est nulle
donne la longueur d’une liste ou d’un vecteur
teste si au moins une valeur d’un vecteur logique
est vraie : any(is.na(x)) retourne TRUE s’il y a au
moins une donnée manquante dans x
sépare le tableau x en fonction des modalités de fac
Les distributions de probabilité
De nombreuses distributions de probabilité sont implémentées dans R. Toutes les fonctions commencent par les lettres d, p, q ou r et se terminent par le nom de la distribution.
La lettre d signifie que la fonction calcule la distribution, la lettre p signifie que la fonction calcule
une probabilité, la lettre q signifie que la fonction calcule un quantile et la lettre r signifie que la
fonction génère un nombre aléatoire.
Lorsqu’on génère une série de nombres au hasard, il peut être intéressant de générer à nouveau
la même série de nombres ultérieurement. Dans ce cas on doit indiquer la “graine du générateur
aléatoire” qui permet d’initialiser la série avec la commande set.seed(1234) (on peut changer de
graine en mettant un autre entier que 1234).
Fonction
pnorm(q)
qnorm(p)
Introduction à R
Description
donne la probabilité P(X ≤ q) pour X ∼ N (0, 1) :
pnorm(1.96) = 0.975. Pour calculer P(X > q) on
utilise l’argument lower.tail = FALSE
donne le quantile d’ordre p d’une loi N (0, 1) :
qnorm(0.975) = 1.96
Arnaud Guyader & Laurent Rouvière
72
Chapitre 15. Fonctions utiles en R
Fonction
pbinom(q,n,p)
Description
donne la probabilité P(X ≤ q) pour la loi binomiale
B(n,p) : pbinom(5,10,.5) = 0.623
ppois(q,lamda)
donne la probabilité P(X ≤ q) pour X suivant une
loi de Poisson de paramètre lambda
punif(q,min,max) donne la probabilité P(X ≤ q) pour X suivant une
loi uniforme sur [min, max]
pchisq(q,df)
donne la probabilité P(X ≤ q) quand X suit une loi
du χ2 à df degrés de liberté
pt(q,df)
donne la probabilité P(X ≤ q) quand X suit une loi
de Student à df degrés de liberté
pf(q,df1,df2)
donne la probabilité P(X ≤ q) quand X suit une loi
de Fisher à df1 et df2 degrés de liberté
sample(x,n,
fonction permettant de choisir au hasard n éléreplace =
ments du vecteur x sans remise (avec remise si
FALSE)
replace=TRUE)
set.seed(n)
permet de choisir une graine pour le générateur de
nombres au hasard ; n doit être un entier
15.5
Les fonctions de statistique de base
Les fonctions statistiques suivantes permettent de décrire une variable quantitative x. Pour l’ensemble de ces fonctions, le paramètre na.rm=T permet d’éliminer les données manquantes avant
le calcul. Si na.rm=F et s’il y a des données manquantes, alors la fonction retourne un message
d’erreur.
Fonction
mean(x,na.rm=T)
sd(x)
var(x)
Description
moyenne de x calculée sur les données présentes
écart-type de x
variance de x si x est un vecteur ou matrice de
variance-covariance si x est une matrice
cor(x)
matrice des corrélations de x
median(x)
médiane de x
quantile(x,probs) quantiles de x d’ordre probs
range(x)
étendue de x
sum(x)
somme des éléments de x
min(x)
minimum de x
max(x)
maximum de x
sign(x)
donne le signe de x
scale(x,center=T,scale=T)
centre (center=T) et réduit (scale=T) x
colMeans(x)
calcule la moyenne de chaque colonne du tableau x
rowMeans(x)
calcule la moyenne de chaque ligne du tableau x
apply(x,MARGIN, applique la fonction FUN aux lignes ou aux colonnes
FUN)
du tableau x : apply(x,2,mean) calcule les moyennes
de chaque colonne de x ; apply(x,1,sum) calcule les
sommes de chaque ligne de x
aggregate(x,by,
applique la fonction FUN à x en fonction de la
FUN)
liste de facteurs proposée dans by : aggregate(x,by
=list(vec),mean) calcule les moyennes de x pour
chaque modalité de vec
Arnaud Guyader & Laurent Rouvière
Introduction à R
15.6. Les fonctions de statistique avancée
15.6
73
Les fonctions de statistique avancée
Fonction
t.test
var.test
chisq.test
prop.test
lm(formula)
anova
aov(formula)
glm
dist(x)
PCA
CA
MCA
dimdesc
catdes
agnes
Introduction à R
Description
permet de construire un intervalle de confiance d’une
moyenne, de tester l’égalité d’une moyenne à une
valeur donnée ou de construire un test de comparaison de moyennes dans deux sous-populations ;
t.test(x) construit un intervalle de confiance de la
moyenne de x et teste l’égalité de la moyenne de
x dans la population à la valeur de mu (par défaut mu=0) ; t.test(x~fac) construit le teste d’égalité des moyennes dans deux sous-populations définies par le facteur fac (qui a nécessairement deux
modalités) : par défaut, le test est construit avec variances inégales var.equal = FALSE ; par défaut le
test est bilatéral, on peut construire un test unilatéral avec alternative = "less" ou alternative =
"greater"
permet de construire un test de comparaison de variances
permet de construire un test du χ2
permet de construire un test d’égalité de proportions
construit un modèle linéaire, i.e. une régression multiple, une analyse de variance ou une analyse de covariance selon la nature des variables explicatives
donne le tableau d’analyse de la variance
construit le modèle d’analyse de variance défini par formula ; si formula =y~x1 + x2 + x1:x2,
construit un modèle avec les effets principaux x1 et
x2 et avec l’interaction de x1 avec x2
construit un modèle linéaire généralisé
construit une matrice de distances entre les lignes de
la matrice x
fonction du package FactoMineR qui construit une
analyse en composantes principales avec possibilité
d’avoir des individus supplémentaires, des variables
quantitatives et qualitatives supplémentaires
fonction du package FactoMineR qui construit une
analyse factorielle des correspondances
fonction du package FactoMineR qui construit une
analyse des correspondances multiples avec possibilité d’avoir des individus supplémentaires, des variables quantitatives et qualitatives supplémentaires
fonction du package FactoMineR qui décrit les axes
factoriels
fonction du package FactoMineR qui décrit une variable qualitative en fonction de variables quantitatives et/ou qualitatives
fonction du package cluster qui construit une classification ascendante hiérarchique
Arnaud Guyader & Laurent Rouvière
74
Chapitre 15. Fonctions utiles en R
Fonction
kmeans(x,
centers)
lda
rpart
15.7
Description
construit une classification selon la méthode des Kmeans à partir du tableau de données x ; centers
correspond au nombre de classes ou aux centres des
classes utilisés pour initialiser l’algorithme
fonction du package MASS qui permet de faire de
l’analyse discriminante linéaire
fonction du package rpart qui construit un arbre de
régression (ou de segmentation)
Les fonctions graphiques
Fonction
barplot
hist
boxplot
pie
points
lines
curve
abline(a,b)
legend
scatterplot(y~x)
pairs
persp
image
locator
identify
colors()
x11()
pdf, postscript,
jpeg, png, bmp
Description
donne le diagramme en barres (ou tuyaux d’orgues)
donne un histogramme
donne une boîte à moustaches ; boxplot(y~fac)
donne un graphe avec une boîte à moustaches pour
chaque modalité du facteur fac
donne un diagramme circulaire (camembert)
dessine des points sur un graphe déjà existant
dessine des lignes sur un graphe déjà existant
trace la courbe d’une fonction
dessine la droite de pente b et d’ordonnée à l’origine
a sur un graphe déjà existant
ajoute une légende sur un graphe déjà existant :
legend("topleft",legend = ... ) écrit la légende
en haut à gauche
construit un nuage de points de y en fonction de x ;
par défaut une droite de régression (reg.line=TRUE)
une courbe d’ajustement non paramétrique (par défaut smooth=TRUE) sont tracées. De plus des boîtes
à moustaches sont également fournies pour x et
y (par défaut boxplots="xy"). scatterplot(y~x|z)
construit un nuage de points par modalité de z
construit des scatterplots pour chaque couple de variables d’un tableau
trace des graphes en perspective ou des surfaces de
réponses
construit des surfaces de réponses en trois dimensions
lit la position de la souris sur le graphique
recherche l’individu ayant les coordonnées les plus
proches du point pointé par la souris
fournit la liste des 657 couleurs définies par défaut
dans R
crée une nouvelle fenêtre graphique vide
permet de sauver un graphique au format pdf, postscript, jpeg, png, bmp ; toutes les fonctions s’utilisent
de la même façon : pdf("mongraphe.pdf") ; ordre
graphique ; dev.off()
Arnaud Guyader & Laurent Rouvière
Introduction à R
15.10. Autres fonctions utiles
15.8
Les fonctions d’importation et d’exportation
Fonction
read.table
read.csv
scan
write
write.table
write.infile
save
load
history
savehistory
loadhistory
15.9
75
Description
lit un fichier ayant un format de tableau et crée un
data-frame
lit un fichier ayant une extension csv et contenant un
tableau et crée un data-frame
lit les données provenant d’un vecteur ou d’une liste
à partir de la console ou d’un fichier
écrit les données dans un fichier
écrit un tableau dans un fichier
fonction du package FactoMineR qui écrit tous les
éléments d’une liste dans un fichier
sauve des objets R dans un fichier .Rdata
récupère les objets sauvegardés avec la fonction save
récupère les dernières lignes de commandes exécutées
enregistre les lignes de commandes exécutées dans
un fichier .Rhistory
lit les lignes de commandes enregistrées dans un fichier .Rhistory
La gestion de texte
Fonction
Description
substr(x,start=n1, extrait ou remplace une sous-chaîne de caractères :
stop=n2)
substr("abcdef",2,4) retourne "bcd"
grep(pattern,x,
donne les indices des éléments de la liste x pour lesignore.case=F,
quels la sous-chaîne pattern est présente. Si fixed
fixed=F)
=F alors pattern est une expression, si fixed=T alors
pattern est une chaîne de caractères
sub(pattern,
trouve dans la chaîne x la sous-chaîne
replacement,x,
pattern et la remplace par replacement :
ignore.case=F,
sub("ii","ici","Bonjour ii") retourne "Bonjour
fixed=F)
ici". Le remplacement n’a lieu qu’une fois. Voir aussi
gsub pour le remplacement multiple.
strsplit(x,split) coupe une chaîne de caractères en plusieurs souschaînes en fonction du caractère split : strsplit("abedtedr","e") retourne "ab" "dt" "dr"
paste(...,sep="") concatène plusieurs chaînes de caractères en les séparant par sep
toupper(x)
écrit x en caractères majuscules
tolower(X)
écrit X en caractères minuscules
apropos(what)
donne les objets dont le nom contient la chaîne de
caractères what
15.10
Autres fonctions utiles
Introduction à R
Arnaud Guyader & Laurent Rouvière
76
Chapitre 15. Fonctions utiles en R
Fonction
seq(from,to,by)
rep(x,ntimes)
cut(x,n)
solve
eigen
svd
Description
génère une séquence : seq(1,9,2) donne 1 3 5 7 9
répète plusieurs fois la séquence x : rep(4:6,2)
donne 4 5 6 4 5 6. Il est aussi possible de répéter
chaque terme de l’objet : rep(4:6,each=2) donne 4
45566
divise une variable continue en une variable qualitative à n niveaux
inverse une matrice ou résout un système linéaire
donne les valeurs propres et vecteurs propres d’une
matrice
donne la décomposition en valeurs singulières d’une
matrice
Arnaud Guyader & Laurent Rouvière
Introduction à R
Bibliographie
[1] Pierre-André Cornillon, Arnaud Guyader, François Husson, Nicolas Jégou, Julie Josse, Maela
Kloareg, Eric Matzner-Løber et Laurent Rouvière. Statistiques avec R. Presses Universitaires
de Rennes, troisième édition, 2012.
77
Téléchargement