Introduction à R - Laboratoire de Statistique Théorique et Appliquée
Transcription
Introduction à R - Laboratoire de Statistique Théorique et Appliquée
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