Une introduction `a R

Transcription

Une introduction `a R
Une introduction à R
Notes sur R: Un Environnement de programmation pour l’Analyse des Données
Version 1.5.0 (2002-04-29)
W. N. Venables, D. M. Smith
et le R Development Core Team
Copyright
Copyright
Copyright
Copyright
Copyright
c
c
c
c
c
1990 W. N. Venables
1992 W. N. Venables & D. M. Smith
1997 R. Gentleman & R. Ihaka
1997, 1998 M. Maechler
1999–2002 R Development Core Team
c 2002, M. Ros pour la traduction française
Copyright Copier et distribuer des copies de ce manuel est autorisé à condition que cette permission
et le copyright soient distribués sur toutes les copies.
Copier et distribuer des versions modifiées de ce manuel est autorisé à condition que la
totalité du travail résultant soit distribuée avec une permission identique à celle-ci.
Copier et distribuer des traductions de ce manuel est autorisé aux conditions données cidessus pour les versions modifiées avec, de plus, l’approbation du R Development Core
Team pour la traduction de la présente permission.
ISBN 3-901167-55-2
i
Table des matières
Préface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1
Introduction et préliminaires . . . . . . . . . . . . . . . 2
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
L’environnement R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Logiciels apparentés à R et documentation . . . . . . . . . . . . . . . .
R et les statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
R et le gestionnaire de fenêtres . . . . . . . . . . . . . . . . . . . . . . . . . . .
Utiliser R de façon interactive . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Une session d’introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accèder à l’aide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Les commandes de R; la casse etc. . . . . . . . . . . . . . . . . . . . . . . . .
Rappel et correction de commandes . . . . . . . . . . . . . . . . . . . . . . .
Exécuter des commandes depuis un fichier; Rediriger des
sorties vers un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.11 Durée de vie des données; Effacer de objets. . . . . . . . . . . . . . .
2
2
2
2
3
3
4
4
4
5
5
5
Manipulations de base; nombres et vecteurs
......................................... 7
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Vecteurs et affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Opérations sur les vecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Générer des séquences de nombres . . . . . . . . . . . . . . . . . . . . . . . . 9
Vecteurs logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Valeurs manquantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Vecteurs de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Vecteurs indices; sélectionner et modifier des parties d’un jeu
de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.8 Autres types d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3
Objets; leurs modes et attributs . . . . . . . . . . . 14
3.1
3.2
3.3
3.4
4
Attributs intrinsèques : mode et longueur . . . . . . . . . . . . . . . .
Changer la longueur d’un objet . . . . . . . . . . . . . . . . . . . . . . . . . .
Obtenir et modifier des attributs . . . . . . . . . . . . . . . . . . . . . . . .
La classe d’un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
15
15
16
Facteurs ordonnés et non-ordonnés . . . . . . . . 17
4.1
4.2
4.3
Exemple spécifique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
La fonction tapply et les tableaux irréguliers . . . . . . . . . . . . . 17
Facteurs ordonnés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
ii
5
Listes et data frames . . . . . . . . . . . . . . . . . . . . . . 19
5.1
5.2
Listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Construire et modifier des listes . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.1 Concatèner des listes . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3 Data frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.1 Construire des data frames . . . . . . . . . . . . . . . . . . . . .
5.3.2 attach() et detach() . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.3 Travailler avec les data frames . . . . . . . . . . . . . . . . . .
5.3.4 Attacher des listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.5 Gérer le search path . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
Lire des données dans des fichiers . . . . . . . . . . 23
6.1
6.2
6.3
La fonction read.table() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
La fonction scan() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accèder aux jeux de données de base . . . . . . . . . . . . . . . . . . . .
6.3.1 charger des données d’autres packages . . . . . . . . . . .
6.4 Editer des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.5 Importer des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
23
24
25
25
25
26
Complément sur le langage. Boucles et
exécution conditionnelle. . . . . . . . . . . . . . . . . . 27
7.1
7.2
8
19
20
20
20
20
21
22
22
22
Expressions groupées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Les instructions de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
7.2.1 Exécution conditionnelle : l’instruction if. . . . . . . 27
7.2.2 éxecution repetitive : les boucles for, repeat et while.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Ecrire des fonctions . . . . . . . . . . . . . . . . . . . . . . . 29
8.1
8.2
8.3
8.4
8.5
Exemples simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Définir de nouveaux opérateurs binaires . . . . . . . . . . . . . . . . . .
Arguments nommés et arguments par défaut . . . . . . . . . . . . .
L’argument ‘...’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Affectations dans les fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
29
29
29
29
iii
9
Procèdures graphiques . . . . . . . . . . . . . . . . . . . . 30
9.1
9.2
9.3
9.4
9.5
9.6
Commandes graphiques de haut niveau . . . . . . . . . . . . . . . . . . 30
9.1.1 La fonction plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
9.1.1.1 graphes de données multivariées . . . . . . . . 31
9.1.2 Graphiques spéciaux . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
9.1.3 Arguments des fonctions graphiques de haut niveau
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Fonctions graphiques de bas niveau . . . . . . . . . . . . . . . . . . . . . . 33
9.2.1 Annotation mathématique . . . . . . . . . . . . . . . . . . . . . . 35
9.2.2 Polices Hershey vectorielles . . . . . . . . . . . . . . . . . . . . . 35
Interragir avec les graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Paramètres graphiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
9.4.1 Changements permanents : la fonction par() . . . . . 37
9.4.2 Changements temporaires : arguments des fonctions
graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Liste des paramètres graphiques . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.5.1 Eléments graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.5.2 Axes et marques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
9.5.3 Marges des figures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
9.5.4 Matrices de graphiques . . . . . . . . . . . . . . . . . . . . . . . . . 41
9.5.5 Pilotes de périphériques . . . . . . . . . . . . . . . . . . . . . . . . 41
9.5.6 Diagrammes postscript . . . . . . . . . . . . . . . . . . . . . . . . . 41
Graphiques dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Annexe A
Une session d’introduction à R . . . . 42
Annexe B
Index des variables et fonctions . . . 46
Annexe C
Index des concepts . . . . . . . . . . . . . . . 48
Annexe D
Références . . . . . . . . . . . . . . . . . . . . . . . 49
Préface
1
Préface
Ce document est la traduction française de An introduction to R.
Cette traduction est actuellement en cours néanmoins, si vous prenez le temps de lire
ces pages et de m’envoyer un commentaire ([email protected]), je vous en serais très
reconnaissant.
Les tournures et les choix pour la traduction du vocabulaire spécifique à R sont sujets à
discussion : toutes les propositions ou remarques sont les bienvenues.
J’essaie d’ores et déjà de structurer le document, ne vous étonnez donc pas de trouver
vides certains chapitres et sous-chapitres.
Mathieu Ros
Juin, 2002.
Chapitre 1: Introduction et préliminaires
2
1 Introduction et préliminaires
1.1 L’environnement R
R est un système logiciel pour la manipulation de données, les calculs et la représentation
graphique. Entre autres choses, il offre
•
•
•
•
•
la possibilité de stocker et manipuler des données de façon fiable et efficace.
une grande varièté de fonctions pour l’analyse des données.
une suite d’opérateurs pour les calculs sur les tableaux et matrices.
la possibilité de faire des représentations graphiques pour l’analyse statistique.
un langage de programmation (S) développé, simple et efficace qui inclut conditions,
boucles, fonctions récursives, entrées sorties. La plupart des fonctions sont d’ailleurs
elles-même écrites en S.
On définit R comme un "environnement" car, tout en restant cohérent, il est avant tout
extensible et modifiable. R n’est pas une collection figée d’outils, comme c’est le cas de
beaucoup de logiciels statistiques.
R doit plutôt être vu comme un outil pour développer de nouvelles méthodes d’analyse
de données. De ce fait, il est dynamique et les nouvelles versions ne sont pas toujours
complètement compatibles avec les anciennes. Certains utilisateurs accueillent favorablement ces changements à cause du gain en nouvelles méthodes et techniques apportées par
les nouvelles versions. D’autres sont plus inquiets du fait que certains codes sont à revoir.
Bien que R soit (aussi) un langage de programmation, on doit considèrer la plupart des
programmes que l’on écrit comme éphémères.
1.2 Logiciels apparentés à R et documentation
On peut voir en R une implémentation du langage S qui a été développé à AT&T par
Rick Becker, John Chambers et Allan Wilks, et qui forme également la base du système
S-Plus.
L’évolution du langage S est caractèrisée par quatre livres de John Chambers et coauteurs. La Référence de base pour R est The New S Language: A Programming Environment
for Data Analysis and Graphics par Richard A. Becker, John M. Chambers and Allan R.
Wilks. Les nouveautés apparues avec la version de S de 1991 (Sversion 3) sont traitées dans
Statistical Models in S edité par John M. Chambers et Trevor J. Hastie. Voir Annexe D
[References], page 49, pour des références plus précises.
De plus, on peut utiliser la documentation de S/S-Plus pour R, en gardant à l’esprit
qu’il y a différentes implémentations de S.
1.3 R et les statistiques
On n’a pas encore parlé de statistiques dans cette introduction à R, alors que de nombreuses personnes l’utilisent comme un logiciel statistique. Nous préfèrons voir en R un environnement dans lequel de nombreuses techniques statistiques, classiques et modernes, ont
Chapitre 1: Introduction et préliminaires
3
été implémentées. Certaines sont intègrées à l’environnement R de base mais beaucoup sont
disponibles sous forme de packages (la distinction est plus historique qu’autre chose). Il y a
8 packages (ou bibliothèques) fournis avec R (et appelés packages "standards") et beaucoup
d’autres sont disponibles sur l’un des sites du CRAN (via http://www.r-project.org). la
plupart des statistiques classiques et des dernières techniques sont disponibles dans R mais
les utilisateurs seront parfois amenés à faire quelques efforts pour les trouver.
Il y a une importante différence de philosophie entre S (et donc R) et les principaux
autres systèmes statistiques. En S une analyse statistique se fait en une série d’étapes avec
stockage des résultats intermédiaires dans des objets. SAS et SPSS donneront de copieuses
sorties pour une régression ou une analyse discriminante alors que R donnera un minimum
de sorties et stockera les résultats dans un objet pour consultation ultérieure par d’autres
fonctions.
1.4 R et le gestionnaire de fenêtres
La façon la plus agréable d’utiliser R est sur une machine avec gestionnaire de fenêtres.
On se référera en particulier à l’usage de R sur un système X window, même si la plupart
de ce qui est dit s’applique à toutes les implémentations de l’environnement R. Les utilisateurs peuvent, de temps en temps, vouloir interagir directement depuis R avec le système
d’exploitation. Dans ce manuel, on se regardera principalement les interactions avec le
système UNIX. Si vous faites tourner R sous MS-Windows, vous devrez faire quelques
ajustements.
1.5 Utiliser R de façon interactive
R affiche une invite lorsqu’il attend des commandes. L’invite par défaut est ‘>’, ce qui
peut-être la même chose que votre invite shell sous UNIX . Cependant, comme nous le
verrons plus loin, il est facile de changer d’invite si cela vous gène. On considèrera par la
suite que l’invite shell est ‘$’. Quand on est sous UNIX, la procèdure à suivre lors de la
première utilisation est la suivante :
1. Créez un sous répertoire de travail pour stocker les fichiers relatifs à un problème que
vous souhaitez traiter avec R :
$ mkdir travail
$ cd travail
2. Démarrez R avec
$ R
3. Vous pouvez maintenant taper des commandes R.
4. Pour quitter, tapez
> q()
Il vous est alors demandé si vous souhaitez ou non sauver les données de la session.
Vous pouvez alors choisir de répondre yes, no ou cancel (la première lettre suffit) pour
sauver les données avant de quitter, quitter sans sauver ou revenir à la session R.
Les sessions qui suivent sont sur le même modèle :
1. Se placer dansle répertoire de travail et démarrer le programme comme précedemment
Chapitre 1: Introduction et préliminaires
4
$ cd travail
$ R
2. Utiliser R en terminant par q() à la fin de la session.
Sous MS-Windows, la procèdure est grosso modo la même. Vous devez créer un répertoire
de travail et mettre son chemin dans le champ ‘start in’ (des propriètés) du raccourci.
Lancez alors R en double-cliquant sur l’icone.
1.6 Une session d’introduction
Si vous souhaitez tester un peu les possibilités de R avant de continuer, vous pouvez vous
reporter à la session d’introduction, voir Annexe A [Une session introductive], page 42.
1.7 Accèder à l’aide
R possède un système d’aide interne similaire au man d’UNIX. pour obtenir des informations sur une fonction, par exemple solve, la commande est :
> help(solve)
ou
> ?solve
Pour une fonctionnalité définie par des caractères spéciaux, l’argument doit être entouré
de guillemets, afin d’en faire une chaîne de caractères.
> help("[[")
Les deux formes de guillemets (simples et doubles) peuvent être utilisés ici; on préfèrera
les doubles, mais ce n’est qu’une convention.
Sur la plupart des versions, l’aide est disponible au format HTML et
> help.start()
lancera un butineur (netscape sous UNIX) qui permet de naviguer à travers les pages
d’aide grâce à des liens.
1.8 Les commandes de R; la casse etc.
Techniquement, R est un langage de commandes (interprèté) avec une syntaxe assez
simple. Il est sensible à la casse comme de nombreux programmes basés sur UNIX. Ainsi
A et a sont des symboles différents et ils identifient des variables différentes.
Les commandes de base consistent soit en expressions soit en affectations. Si une expression est tapée comme commande, elle est évaluée, affichée, et la valeur retournée est perdue.
Une affectation évalue également une expression mais passe sa valeur à une variable sans
automatiquement afficher le résultat.
Les commandes sont séparées soit par des points virgules (‘;’), soit par des sauts de ligne.
Les commentaires peuvent être mis a peu près n’importe où1 , en les précédant d’une dièse
(‘#’) : tout ce qui suivra jusqu’à la fin de la ligne sera un commentaire. Si une commande
n’est pas complète à la fin de la ligne, R affichera une invite différente, par défaut
1
pas dans des chaînes ni dans la définition de la liste des arguments d’une fonction
Chapitre 1: Introduction et préliminaires
5
+
sur la seconde ligne et les suivantes. Il continuera à lire les entrées jusqu’à ce que la
commande soit syntaxiquement complète. Cette invite peut être modifiée par l’utilisateur.
On l’omettra généralement par la suite, signalant la continuation d’une commande par
l’indentation de ses lignes.
1.9 Rappel et correction de commandes
Sous la plupart des versions UNIX et MS-Windows, R fournit un mécanisme de rappel et
de re-exécution des commandes. Les flèches verticales du clavier permettent de parcourir un
historique des commandes. Quand une commande est ainsi rappellée, on peut y faire circuler
le curseur avec les flèches horizontales afin d’effacer (avec la touche hDELi) ou d’ajouter des
caractères. Plus de détails sont donnés par la suite, voir hundefinedi [L’editeur en ligne de
commande], page hundefinedi.
Les possibilités de rappel et d’édition sont hautement personnalisables sous UNIX. Pour
apprendre comment procèder, consultez la page man de la bibliothèque readline.
D’autre part, l’éditeur de texte emacs propose des possibilités très interressantes pour
travailler interactivement avec R (via “ESS”, Emacs Speaks Statistics). Voir section “R and
Emacs” dans The R statistical system FAQ.
1.10 Exécuter des commandes depuis un fichier; Rediriger
des sorties vers un fichier
On peut exécuter des commandes stockées dans un fichier ‘commands.R’ placé dans le
répertoire de travail ‘travail’ à tout moment pendant la session R :
> source("commandes.R")
Pour MS-Windows, source est disponible dans le menu File. La fonction sink,
> sink("sauve.lis")
enverra les sorties qui suivent non plus sur la console mais dans un fichier, ‘sauve.lis’. La
commande
> sink()
termine ce mode et permet que les sorties soient de nouveau envoyées vers la console.
1.11 Durée de vie des données; Effacer de objets
On appelle objets les entités créees et manipulées avec R. Ceux-ci peuvent être des
variables, des tableaux de nombres, des chaînes de caractères, des fonctions ou, plus
généralement des structures construites à partir de ces composants.
Pendant une session R, les objets sont crées et rangés par nom (on reparlera de ce
mécanisme dans le prochain chapitre). La commande
> objects()
(ou ls) sert à afficher les noms des objets stockés dans R sur le moment. La collection
d’objets stockés couramment est appelée espace de travail.
Pour effacer des objets on utilise la fonction rm :
Chapitre 1: Introduction et préliminaires
6
> rm(x, y, z, ink, junk, temp, foo, bar)
Tous les objets crées pendant une session R peuvent être sauvés dans un fichier pour
une réutilisation dans une session ultérieure. A la fin de chaque session, R vous demande si
vous désirez sauver tous les objets courants. Si vous choisissez de le faire, les objets seront
écrits dans un fichier appelé ‘.RData’2 du répertoire courant.
Quand on démarrera R plus tard, il rechargera l’espace de travail contenu dans ce fichier
ainsi que l’historique des commandes correspondant.
Il est recommandé d’utiliser des répertoires différents pour les différentes analyses faites
avec R. Il est en effet assez fréquent que des objets nommés x ou y soient crées durant une
analyse. De tels noms peuvent avoir un sens pour un problème particulier, mais il peut
être difficile de s’y retrouver quand plusieurs problèmes sont menés à bien dans le même
répertoire.
2
le "point" rends le fichier invisible lors d’un listing normal sous UNIX
Chapitre 2: Manipulations de base; nombres et vecteurs
7
2 Manipulations de base; nombres et vecteurs
2.1 Vecteurs et affectation
R opère sur des structures de données. La structure de données la plus simple est
le vecteur numérique, qui est une entité constituée d’une collection ordonnée de chiffres.
Pour construire un vecteur x constitué des 5 chiffres 10.4, 5.6, 3.1, 6.4 et 21.7 on utilise la
commande :
> x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
c’est une affectation utilisant ici la fonction c(). Dans ce contexte, la fonction c()
prends un nombre arbitraire d’arguments. Elle retourne un vecteur en concaténant ses
arguments1 (en les mettant bout à bout). Voir hundefinedi [...], page hundefinedi
Un chiffre apparaissant seul dans une expression est interprèté comme un vecteur de
longueur 1.
On note que l’opérateur d’affectation (‘<-’) n’est pas l’usuel opérateur ‘=’ qui est réservé
pour d’autres usages. Il est constitué de deux caractères, ‘<’ et ‘-’ placés strictement cote
à cote et qui ’pointent’ vers l’objet recevant la valeur de l’expression2 .
On peut également utiliser la fonction assign(). Avec celle-ci, une façon équivalente de
faire l’affectation précédente serait :
> assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7))
L’opérateur usuel, <-, peut être vu comme un raccourci de cette opération.
Les affectations peuvent également être faites dans l’autre sens, en utilisant le changement trivial de l’opérateur. Cette même affectation peut donc s’écrire comme suit
> c(10.4, 5.6, 3.1, 6.4, 21.7) -> x
Si une expression est utilisée comme une commande complète, la valeur est imprimée à
l’écran et perdue 3 .
Si on utilisait la commande
> 1/x
les inverses des 5 valeurs seraient imprimées (et la valeur de x, bien sûr, resterait inchangée).
L’affectation suivante
> y <- c(x, 0, x)
crée un vecteur y avec 11 éléments : 2 copies de x avec un zéro au milieu.
1
2
3
Avec d’autres types d’arguments que des vecteurs, comme des arguments de mode liste, l’action de c()
est sensiblement différente...
Le caractère underscore ‘_’ est un synonyme de ‘<-’ mais il rend le code moins lisible.On décourage donc
son usage.
elle reste cependant disponible dans .Last.value avant qu’une autre action soit exécutée
Chapitre 2: Manipulations de base; nombres et vecteurs
8
2.2 Opérations sur les vecteurs
Les vecteurs peuvent être utilisés dans des expressions arithmétiques. Dans ce cas, les
opérations sont effectuées élément par élément.
Les vecteurs utilisés dans une même expression doivent tous être de même longueur. Si
ce n’est pas le cas, la valeur de l’expression est un vecteur de même longueur que le plus
grand vecteur utilisé dans l’expression.
Les vecteurs plus courts sont alors recyclés autant de fois que c’est nécessaire (avec une
éventuelle troncature) pour qu’ils aient la même taille que le plus grand. En particulier,
une constante est simplement répétée.
Avec la commande d’affectation suivante
> v <- 2*x + y + 1
On génère un nouveau vecteur v de longueur 11 construit en additionnant 2*x répèté
2,2 fois avec y répété 1 fois et 1 répété 11 fois.
Les opérateurs arithmètiques élémentaires sont +, -, *, / et ^ pour élever à une puissance.
De plus toutes les fonctions arithmétiques usuelles sont disponibles. log, exp, sin, cos, tan,
sqrt (racine carrée) etc. ont leur sens usuel. max et min renvoient respectivement le plus
grand et le plus petit élément d’un vecteur. range est une fonction retournant un vecteur
de longueur équivalent à c(min(x),max(x)). length(x) renvoies le nombre d’éléments de
x, sum(x) donnes la somme des éléments de x et prod(x) leur produit.
Deux fonction statisiques de base : mean(x) calcule la moyenne d’un échantillon, c’est
à dire la même chose que sum(x)/length(x), et var(x) calcule
sum((x-mean(x))^2)/(length(x)-1)
soit la variance de l’échantillon.
Si l’argument de var() est une matrice n-par-p, la valeur retournée est une matrice ppar-p de covariance obtenue en considèrant les lignes comme des p-variables indépendantes
(individus de l’échantillon).
sort(x) est une fonction de tri qui renvoies un vecteur de la même taille que x avec
ses éléments rangés par ordre croissant. Il existe d’autres fonctions adaptées à différentes
sortes de tris (voir order() et sort.list()).
max() (resp. min()) séléctionne le plus grand (resp. petit) élément de son ou ses
arguments (même si ce sont plusieurs vecteurs).
pmax() (resp. pmin()) est la fonction parallèle de maximum (resp. minimum).Elle
renvoie un vecteur de longueur égale à celle de son plus grand argument, qui contient le
plus grand (resp. petit) élément pour cette position parmi tous les vecteurs donnés en
argument.
La plupart du temps l’utilisateur n’aura pas à se soucier du fait que les nombres qui
composent un vecteur numérique sont des entiers, des réels ou même des complexes : les
calculs internes sont de toute façon faits en double précision.
Pour travailler avec des nombres complexes il suffit d’ajouter explicitement la partie
imaginaire. Ainsi
sqrt(-17)
donnera une erreur alors que
Chapitre 2: Manipulations de base; nombres et vecteurs
9
sqrt(-17+0i)
exécutera les calculs.
2.3 Générer des séquences de nombres
R permet de générer facilement les séquences de nombres les plus utiles. 1:30, par
exemple, correspond au vecteur c(1,2,3,...,29,30). L’opérateur : a la plus haute priorité
dans une expression. Ainsi 2*1:15 est le vecteur c(2,4,6,...,28,30). On peut s’amuser
pour s’en convaincre à comparer, avec n<-10, les suites 1:n-1 et 1:(n-1).
La construction 30:1 peut être utilisée pour générer une séquence en sens inverse.
On dispose également de la fonction seq() qui est une façon plus générale de produire
des séquences. Elle admet 5 arguments qui ne peuvent être utilisés tous en même temps.
Les 2 premiers arguments, s’ils sont spécifiés, donnent le début et la fin de la séquence. Si
ces 2 arguments sont les seuls à être donnés en entrée, le résultat est le même que pour
l’opérateur :. Ainsi seq(2,10) est équivalent à 2:10.
Les paramètres de seq, de même que ceux de nombreuses autres fonctions R, peuvent
être passés en argument avec leur nom. Dans ce cas, l’ordre dans lequel ils sont donnés n’a
pas d’importance. Les deux premiers arguments de seq() peuvent être passés sous la forme
from=valeur et to=valeur; Ainsi seq(1,30), seq(from=1,to=30) et seq(to=30,from=1)
sont tous équivalents à 1:30. Deux des autres arguments de seq sont by=valeur et
length=valeur. ils spécifient respectivement la taille du pas et la longueur de la séquence.
Si aucun des deux n’est donné, la valeur par défaut by=1 est utilisée.
Par exemple
> seq(-5, 5, by=.2) -> s3
affecte à s3 le vecteur c(-5.0,-4.8,-4.6,...,4.6,4.8,5.0).
De la même façon,
> s4 <- seq(length=51, from=-5, by=.2)
affecte le même vecteur à s4.
Le 5ème argument est along=vecteur, qui doit être utilisé seul. Il crée une séquence
1,2,...,length(vecteur) ou une suite vide si le vecteur est vide (il peut donc l’être...).
rep() est une fonction assez voisine de la précédente qui est utilisée pour répéter un objet.
La forme la plus simple de cette fonction (qui peut faire des choses plutôt complexes) est
> s5 <- rep(x, times=5)
cela mettra 5 copies de x bout à bout dans s5.
2.4 Vecteurs logiques
Comme pour les vecteurs numériques, R permet de faire des calculs avec des quantités logiques. Les éléments des vecteurs logiques peuvent prendre uniquement 2 valeurs,
représentées par FALSE et TRUE (abbréviés respectivement en F et T).
Les vecteurs logiques sont générés par des conditions. Par exemple
Chapitre 2: Manipulations de base; nombres et vecteurs
10
> temp <- x > 13
initialise temp à un vecteur de même longueur que x et dont les éléments ont la valeur FALSE
pour les éléments de x ne satisfaisant pas la condition, et TRUE pour les autres.
Les opérateurs logiques sont <, <=, >, >=, == pour l’égalité logique et != pour l’inégalité.
De plus, si c1 et c2 sont des expressions logiques, alors c1 & c2 est leur intersection (“et”),
c1 | c2 est leur union (“ou”) et !c1 est la négation de c1.
Les vecteurs logiques peuvent être utiliss comme des vecteurs arithmétiques pour des
calculs. Dans ce cas ils sont forcés en vecteurs numériques pour lesquels FALSE devient 0
et TRUE 1.
Il existe cependant des situations dans lesquelles les vecteurs logiques et leur pendant
numérique ne sont pas équivalents (voir le sous-chapitre suivant pour un exemple).
2.5 Valeurs manquantes
Dans certains cas, les composants d’un vecteur peuvent ne pas tous être connus. Quand
un élément ou une valeur n’est “pas disponible” ou “valeur manquante” au sens statistique
du terme, une place dans le vecteur peut lui être réservée en employant la valeur particulière
NA (Not Available). En général, toute opération sur un NA donne un NA. La raison pour
laquelle cette règle a été mise en place est que si l’on ne connait pas tous les éléments d’une
opération, le résultat ne peut pas être connu et donc n’est pas disponible.
La fonction is.na(x) donne un vecteur logique de la même taille que x avec la valeur
TRUE si et seulement si l’élément correspondant de x est un NA.
> z <- c(1:3,NA); ind <- is.na(z)
A noter que l’expression logique x==NA donne un résultat complètement différent de
is.na(x) puique NA n’est pas vraiment une valeur mais un identificateur pour une quantité
qui n’est pas disponible. x==NA est donc un vecteur de même longueur que x dont tous les
éléments sont des NA puique l’expression logique est incomplète.
Il y a une deuxième sorte de valeur “manquante” qui est produite par les calculs
numériques : la valeur appelée Not A Number, NaN. Par exemple
> 0/0
ou
> Inf - Inf
donnent toutes deux NaN car le résultat n’est pas défini.
Enfin, is.na(xx) renvoie TRUE pour les NA et les NaN tandis que is.nan(xx) donne TRUE
seulement pour les NaN.
2.6 Vecteurs de caractères
Les quantités caractères et les vecteurs de caractères sont fréquemment utilisés dans R,
par exemple pour les labels des graphes. ils sont représentés par une séquence de caractères
délimitée par un double guillemet : "x-max", "résultats de l’itération".
Les vecteurs de caractères peuvent être constitués avec la fonction c().
La fonction paste() prend un nombre quelconque d’arguments et les concatène en une
seule chaîne de caractères. Tous les nombres donnés parmi les arguments sont transformés
Chapitre 2: Manipulations de base; nombres et vecteurs
11
en chaînes de caractères. Par défaut, les arguments sont séparés par un caractère espace.
Ceci peut être changé en utilisant le paramètre sep=chaine, qui échange le caractère espace
pour chaine (qui peut être vide).
Par exemple
> labs <- paste(c("X","Y"), 1:10, sep="")
mets dans labs le vecteur de caractères
c("X1", "Y2", "X3", "Y4", "X5", "Y6", "X7", "Y8", "X9", "Y10")
On remarque que le recyclage a aussi cours ici; ainsi c("X", "Y") est répété 5 fois pour
correspondre à la séquence 1:10.4
2.7 Vecteurs indices; sélectionner et modifier des parties
d’un jeu de données
Une partie des éléments d’un vecteur peut être sélectionnée en ajoutant après le nom du
vecteur un vecteur indice entre crochets. Plus généralement, quand une expression retourne
un vecteur, on peut en selectionner une partie en ajoutant un vecteur indice immediatement
après l’expression.
Les vecteurs indice peuvent être de 4 types distinct :
1. Un vecteur logique. Dans ce cas le vecteur indice doit être de même longueur que
le vecteur selectionné. Les valeurs correspondant à TRUE dans le vecteur logique sont
selectionnées et les valeurs correspondant à FALSE sont omises.
Par exemple
> y <- x[!is.na(x)]
crée (ou recrée) un objet y qui contiendra les valeurs autres que manquantes, dans le
même ordre qu’elles apparaissent dans x. Si x a des valeurs manquantes, y sera plus
court que x. Ainsi
> (x+1)[(!is.na(x)) & x>0] -> z
crée un objet z et place dedans les valeurs de x+1 pour lesquelles les valeurs correspondantes de x sont non manquantes et positives.
2. Un vecteur d’entiers positifs. Dans ce cas les éléments de l’indice doivent appartenir à
l’ensemble {1, 2, . . . ,length(x)}. Les éléments correspondant du vecteur sont placés
suivant l’ordre donné par l’indice dans le vecteur résultat. Ce vecteur indice n’est
pas forcément de même longueur que le vecteur. Par exemple x[6] renvoie le sixième
composant de x et
> x[1:10]
sélectionne les 10 premiers éléments de x (si, bien sûr, length(x) est supérieur à 10).
De même
> c("x","y")[rep(c(1,2,2,1), times=4)]
produit un vecteur de caractères de longueur 16 constitué de "x", "y", "y", "x" répété
4 fois.
4
paste(..., collapse=ss) permet d’envoyer les arguments dans une chaîne de caractères en mettant ss
entre eux. Il y a beaucoup d’autres outils pour la manipulation des caractères. Voir l’aide pour sub et
substring.
Chapitre 2: Manipulations de base; nombres et vecteurs
12
3. Un vecteur d’entiers négatifs. Un vecteur d’indice de cette forme sert à spécifier les
valeurs à écarter plutôt que celles à sélectionner. Ainsi
> y <- x[-(1:5)]
mets dans y tous les éléments de x sauf les 5 premiers.
4. Un vecteur de caractères. Cette possibilité s’applique seulement dans le cas ou l’objet a
un attribut names pour identifier ses éléments. Dans ce cas un sous-vecteur du vecteur
des noms permet de sélectionner des éléments de x de la même façon que les vecteurs
d’entiers du cas 2.
> fruit <- c(5, 10, 1, 20)
> names(fruit) <- c("orange", "banana", "apple", "peach")
> lunch <- fruit[c("apple","orange")]
L’avantage des caractères (et de l’attribut names) sur les chiffres c’est qu’on s’en souvient plus facilement. Cette dernière solution est particulièrement utile quand on manipule des data frames comme nous le verrons plus tard.
Une expression indicée peut aussi apparaître du côté réception de la flèche. Dans ce cas
l’affectation se fait seulement pour ces éléments (sélectionnés) du vecteur. L’expression doit
être de la forme vecteur[vecteur indice] puisqu’avoir une expression à la place du nom du
vecteur n’aurait pas ici beaucoup de sens. Le vecteur affecté doit évidemment être de même
longueur que le vecteur indice.
> x[is.na(x)] <- 0
remplace toute valeur manquante de x par zéro et
> y[y < 0] <- -y[y < 0]
a le même effet que
> y <- abs(y)
2.8 Autres types d’objets
Les vecteur représentent le type d’objet le plus important de R mais il en est d’autres
que nous rencontrerons plus précisément dans les chapitres suivants
• Les matrices ou plus généralement les tableaux sont des généralisations multidimensionnelles des vecteurs. En fait ce sont des vecteurs qui peuvent être indicés par 2
(ou plus) indices et qui seront affichés à l’écran de façon spéciale. Voir hundefinedi
[Tableaux et matrices], page hundefinedi.
• Les facteurs permettent de manipuler les données qualitatives. Voir hundefinedi [Facteurs], page hundefinedi.
• Les listes sont une forme plus générale de vecteurs dans laquelle les éléments n’ont pas
besoin d’être tous du même type. Ces éléments sont souvent eux-même des vecteurs ou
des listes. Les listes fournissent un bon moyen pour renvoyer les résultats de fonctions
statistiques. Voir hundefinedi [Listes et data frames], page hundefinedi.
• Les data frames sont des structures semblables aux matrices, dans lesquelles les colonnes
peuvent être de types différents. Pensez aux data frames comme à des ’matrices de
données’ avec une ligne par observation et avec (si nécessaire) des variables numériques
et catégorielles. Les data frame sont adaptés pour traiter un grand nombre de données
Chapitre 2: Manipulations de base; nombres et vecteurs
13
expérimentales : les traitements sont catégoriels mais la réponse est numérique. Voir
hundefinedi [Listes et data frames], page hundefinedi.
• les fonctions sont aussi des objets en R et elles peuvent être stockées dans l’espace
de travail d’un projet. Ceci fournit un moyen pratique et simple d’étendre R. Voir
hundefinedi [Ecrire vos propres fonctions], page hundefinedi.
Chapitre 3: Objets; leurs modes et attributs
14
3 Objets; leurs modes et attributs
3.1 Attributs intrinsèques : mode et longueur
Les eléments sur lesquels agit R sont techniquement nommés objets. Les vecteurs de
réels ou de nombres complexes, les vecteurs de valeurs logiques ou de chaînes de caractères
en sont des exemples. Tous ces éléments sont des structures dites "atomiques" car leur
composants sont tous de même type ou mode, respectivement numeric 1 , complex, logical et
character.
Les éléments d’un vecteur doivent tous être du même mode. Ainsi tout vecteur doit sans
ambiguité être numeric, complex,logical ou character. La seule exception à cette règle est
pour les valeurs spéciales NA représentant des valeurs manquantes.
On notera qu’un vecteur vide peut aussi avoir un mode,. Par exemple, le vecteur de
chaîne de caractère vide est listé character(0) tandis que le vecteur numérique vide donne
numeric(0).
R agit aussi sur des objets appellés listes, qui sont de mode list. Ce sont des séquences ordonnées d’objets qui peuvent être de n’importe quel mode. Les listes sont dites "récursives",
plutôt qu’atomiques, car leurs composants peuvent eux-même être des listes.
Les structures de mode function et expression sont également récursives. Les fonctions
sont des objets qui forment la base de R, avec les fonctions utilisateur sur lesquelles nous
reviendrons plus en détail par la suite. Les expressions, en tant qu’objets, ont un rôle assez
complexe en R. Elles ne seront pas documentées dans ce guide, si ce n’est indirectement
dans la description des formules utilisées pour la modèlisation.
On nomme mode d’un objet le type de base de ses éléments fondamentaux. C’est l’une
des "propriètés" d’un objet. La longueur est une autre des propriètés que possède tout
objet. Les fonctions mode(objet) et length(objet) permettent d’accèder au mode et à la
longueur de toute structure.
D’autres propriètés d’un objet peuvent être extraites par attributes(object), voir Section 3.3 [Obtenir et modifier des attributs], page 15. Les mode et longueur sont appellés
"attributs intrinsèques" d’un objets car ils sont communs à tous les objets.
Par exemple, si z est un vecteur de complexes de longueur 100, alors, dans une expression,
mode(z) est la chaîne de caractères "complex" et length(z) est l’entier 100.
R s’occupe des changements de mode partout où il est sensé le faire. Par exemple avec
> z <- 0:9
On peut faire
> nombres <- as.character(z)
après quoi nombres sera le vecteur de caractères c("0", "1", "2",..., "9"). Un forçage
de plus, ou changement de mode, reconstruit le vecteur numérique :
> d <- as.integer(digits)
1
Le mode numeric est un amalgame de deux modes distincts, integer et double précision.
Chapitre 3: Objets; leurs modes et attributs
15
maintenant d et z sont les mêmes.2 . Il y a une grande diversité de fonctions de la forme
as.qqchose() soit pour le forçage d’un mode à l’autre, soit pour rajouter un attribut à
un objet. Le lecteur consultera les différents fichiers d’aide pour se familiariser avec ces
fonctions.
3.2 Changer la longueur d’un objet
Un objet peut être vide et avoir un mode. Par exemple
> e <- numeric()
fait de e une structure vectorielle de mode numérique. De la même faon, character()
est un vecteur -vide- de caractères et ainsi de suite. Une fois qu’un objet, quelle que soit sa
taille, a été crée, de nouveaux composants peuvent lui être ajoutés en l’indiçant avec une
valeur plus grande que son rang. Ainsi
> e[3] <- 17
fait de e un vecteur de longueur 3 (dont les deux premiers sont pour l’instant des NA).
Ceci s’applique à toute structure, en admettant que le mode des nouveaux arguments est
compatible avec celui des premiers objets de la structure.
Cet ajustement automatique de la longueur des objets est souvent utilisé, par exemple
pour les entrées de la fonction scan(). (Voir Section 6.2 [La fonction scan()], page 24.)
De même, tronquer la taille d’un objet ne necessite qu’une affectation. Ainsi si alpha
est un objet de longueur 10, alors
> alpha <- alpha[2 * 1:5]
en fait un objet de longueur 5 avec les composants sélectionnés, indices compris. Les anciens
indices ne sont bien sûr pas retenus.
3.3 Obtenir et modifier des attributs
La fonction attributes(objet) donne une liste de tous les attributs non-intrinsèques
définis pour cet objet. La fonction attr(objet, nom) peut être utilisée pour sélectionner un
attribut spécifique. Ces fonctions sont rarement utilisées, sauf dans des cas assez particuliers,
quand on crée un nouvel attribut dans un but précis (par exemple pour associer une date
de création ou un opérateur à un objet R). Le concept, cependant, est très important.
On devra donc faire attention, quand on ajoute ou supprime des attributs, car ils sont
partie intègrante du système d’objets utilisé en R.
utiliser la fonction attr du coté gauche d’une affectation sert soit à associer un nouvel
attribut à un objet, soit à en modifier un déjà existant. Par exemple
> attr(z,"dim") <- c(10,10)
permet de traiter z comme une matrice 10x10.
2
En général, le forçage de numeric à character ne sera pas tout à fait équivalent à cause des erreurs
d’arrondis dans la représentation des caractères
Chapitre 3: Objets; leurs modes et attributs
16
3.4 La classe d’un objet
Un attribut spécial, appellé classe d’un objet, est utilisé pour un style de programmation
R orientée objet.
Par exemple si un objet est de classe "data.frame", il sera affiché d’une certaine
façon, la fonction plot fera un graphique adaptée, et d’autres fonctions génériques, comme
summary(), le traiteront de la façon appropriée à sa classe.
Pour supprimer temporairement les effets dus à une classe, on utilise la fonction
unclass(). Par exemple si winter est de classe "data.frame" alors
> winter
l’affichera comme un data frame, ce qui ressemble à la façon dont sont affichées les matrices,
tandis que
> unclass(winter)
l’affichera comme une liste ordinaire. Ce n’est que dans des situations particulières que
l’on a besoin de cette fonctionnalité, et seulement quand on en vient à utiliser les fonctions
génériques
Ces dernières seront brièvement développées dans hundefinedi [Oriente objet], page hundefinedi.
Chapitre 4: Facteurs ordonnés et non-ordonnés
17
4 Facteurs ordonnés et non-ordonnés
Un facteur est un objet vectoriel utilisé pour identifier les composants d’autres vecteurs
de même longueur de faon discrète. R fournit des facteurs ordonnés et non-ordonnés. La
réelle application des facteurs est dans les formules décrivant des modèles (voir hundefinedi
[Contrasts], page hundefinedi, nous allons cependant regarder ici un
4.1 Exemple spécifique
Supposons par exemple que nous ayons un échantillon de 30 contribuables de tous les
territoires australiens1 et que leur territoire d’origine est donné par un vecteur de caractères
> etat <- c("tas", "sa", "qld", "nsw", "nsw", "nt", "wa", "wa",
"qld", "vic", "nsw", "vic", "qld", "qld", "sa", "tas",
"sa", "nt", "wa", "vic", "qld", "nsw", "nsw", "wa",
"sa", "act", "nsw", "vic", "vic", "act")
Remarque : dans le cas d’un vecteur de caractères, "trié" signifie "trié par ordre alphabètique".
Un facteur est crée grce à la fonction factor :
> etatf <- factor(state)
La fonction print traite les facteurs de faon spéciale :
> etatf
[1] tas sa qld nsw nsw nt wa wa qld vic nsw vic qld qld sa
[16] tas sa nt wa vic qld nsw nsw wa sa act nsw vic vic act
Levels: act nsw nt qld sa tas vic wa
On utilise la fonction levels() pour connaître les niveaux du facteur.
> levels(etatf)
[1] "act" "nsw" "nt" "qld" "sa" "tas" "vic" "wa"
4.2 La fonction tapply et les tableaux irréguliers
Pour continuer l’exemple précédent, supposons que nous ayons les revenus des mêmes
contribuables stockés dans un vecteur (en milliers d’euros par exemple).
> revenus <- c(60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56,
61, 61, 61, 58, 51, 48, 65, 49, 49, 41, 48, 52, 46,
59, 46, 58, 43)
Pour calculer la moyenne empirique des revenus dans chaque état, on peut ici utiliser la
fonction tapply() :
> moy.rev <- tapply(revenus,etatf,mean)
ce qui donne un vecteur contenant les moyennes identifiées par les niveaux
act
nsw
nt
qld
sa
tas
vic
wa
44.500 57.333 55.500 53.600 55.000 60.500 56.000 52.250
1
il y a 8 états et territoires en australie : Australian Capital Territory, New South Wales, the Northern
Territory, Queensland, South Australia, Tasmania, Victoria and Western Australia.
Chapitre 4: Facteurs ordonnés et non-ordonnés
18
La fonction tapply est utilisée pour appliquer une fonction, ici mean(), à chaque groupe
d’éléments du premier argument (ici revenus), définis par les niveaux du deux‘@‘eme argument (ici etatf) comme s’ils étaient des structures vectorielles séparées. Le résultat est
une structure de même longueur que l’attribut levels du facteur identifiant les groupes.
Le lecteur consultera l’aide associée @‘a tapply pour plus de détails.
Supposons qu’on veuille calculer les écarts-types des revenus par état. Pour ce faire, on
a besoin d’écrire une fonction R] qui calcule l’écart-type d’un vecteur quelconque. Comme
on dispose de la fonction var() qui calcule la variance empirique, elle va être facile à écrire
:
ec.type <- function(x) sqrt(var(x)/length(x))
(On reviendra plus loin sur l’écriture des fonction, hundefinedi [ecrire ses propres fonctions],
page hundefinedi) Après cette allocation, les écarts-types sont calculés par
> rev.ectype <- tapply(revenus, etatf, ec.type)
et les valeurs calculées sont alors
> rev.ectype
act
nsw nt
qld
sa tas
vic
wa
1.5 4.3102 4.5 4.1061 2.7386 0.5 5.244 2.6575
La fonction tapply() peut selectionner les éléments d’un vecteur de faon moins triviale,
entre autre sur des critères multiples. Par exemple, on peut vouloir séparer les contribuables
sur l’état et le sexe en même temps. Dans ce cas (une seule catégorie) la fonction voulue
est appliquée sur chacun des groupes correspondant aux différentes entrées de la catégorie;
le résultat retourné est un vecteur ayant pour longueur le nombre de catégories et dont les
éléments sont identifiés par l’attribut levels du facteur catégorie.
La combinaison d’un vecteur et d’un facteur de labels est un exemple de ce que l’on
nomme tableau irrégulier du fait que les tailles des classes définies par les labels peuvent
être différentes.
Quand les tailles de ces classes sont toutes les même, la sélection des éléments peut se
faire de faon plus simple et plus efficace, comme nous le verrons dans le chapitre suivant.
4.3 Facteurs ordonnés
Les niveaux de facteur sont rangés soit par ordre alphabètique, soit dans l’ordre dans
lequel ils ont été spécifiés à factor() s’ils ont été spécifiés explicitement.
Dans certains cas, les niveaux auront un ordre naturel que l’on souhaite conserver et
dont notre analyse doit tenir compte. La fonction ordered crée des facteurs ayant cette
fonctionnalité, étant d’autre part identique à factor().En général, la seule différence entre
facteurs ordonnés et non-ordonnés est que les premiers sont affichés de faon à montrer l’ordre
des niveaux; de plus les contrastes définis à partir de ceux-ci pour ajuster des modèles
linéaires sont différents.
Chapitre 5: Listes et data frames
19
5 Listes et data frames
5.1 Listes
Une liste R est un objet qui contient une collection ordonnée d’objets appellés ses composants.
Il n’est pas nécessaire que les composants soient du même type ou du même mode, et,
par exemple, une liste peut être composée d’un vecteur numérique, d’une valeur logique,
d’une matrice, d’un vecteur de complexes, d’un tableau de caractères, d’une fonction etc.
Voici un exemple de la manière de créer une liste :
> Lst <- list(nom="Fred", femme="Stella", nb.enfants=3,
ages.enfants=c(4,7,9))
Les composants sont toujours numérotés et peuvent donc être identifiés par leur numéro.
Ainsi, si Lst est le nom d’une liste de 4 composants, on peut accèder à ceux-ci par Lst[[1]],
Lst[[2]], Lst[[3]] et Lst[[4]]. Si, de plus, Lst[[4]] est un vecteur alors Lst[[4]][1]
est sa première valeur.
Si Lst est une liste, alors la fonction length(Lst) donne le nombre de ses composants
(de premier niveau).
Les composants d’une liste peuvent aussi être nommés, et dans ce cas on peut y accèder
soit en remplaçant le nombre entre crochets par le nom (sous forme de chaîne de caractères),
soit, de façon plus conventionnelle, en donnant une expression de la forme
> name$nom composant
Cette convention est très utile car on peut accèder au composant même si on a oublié
son numéro.
Dans l’exemple basique ci-dessus :
Lst$nom identifie la même chose que Lst[[1]] c’est à dire la chaîne "Fred",
Lst$femme identifie la même chose que Lst[[2]] c’est à dire la chaîne "Stella",
Lst$child.ages[1] identifie la même chose que Lst[[4]][1] c’est à dire le nombre 4.
De plus on peut utiliser les noms des composants entre double crochets, i.e.,
Lst[["nom"]] ce qui est la même chose que Lst$nom. Ceci est particulièrement utile
quand le nom du composant à extraire est stocké dans une variable; comme
> x <- "name"; Lst[[x]]
Il est très important de distinguer Lst[[1]] de Lst[1]. ‘[[. . . ]]’ est un opérateur
utilisé pour sélectionner un seul élément, tandis que ‘[. . . ]’ est un opérateur plus général
d’indiçage. Ainsi la première forme donne le premier objet de la liste Lst, et, si c’est une
liste nommée, le nom de l’objet n’est pas inclus. La deuxième forme extrait une sous-liste
de la liste Lst constituée de la première entrée seulement. Si c’est une liste nommée, les
noms sont inclus dans la sous-liste.
Les noms des composants peuvent être raccourcis au plus petit nombre de lettres
nécessaire pour les distinguer de manière unique. Ainsi Lst$coefficients peut être
spécifié au minimum par Lst$coe et Lst$covariance par Lst$cov. Le vecteur des noms
est en fait un simple attribut de la liste et peut donc être utilisé comme tel. D’autres
structures que les listes peuvent aussi avoir un attribut names.
Chapitre 5: Listes et data frames
20
5.2 Construire et modifier des listes
Les listes peuvent être construites à partir d’objets existants avec la fonction list().
Une affectation de la forme
> Lst <- list(nom 1=objet 1, . . . , nom m=objet m)
initialise une liste Lst de m composants avec objet 1, . . . , objet m pour composants dont
les noms sont respectivement nom 1,. . . , nom m. Si ces nom étaient omis, les composants
seraient repérés seulement par leurs numéros correspondant. Les composants utilisés sont
copiés pour former la liste, et les originaux restent inchangés.
Les listes, comme tous les objets indiçables, peuvent être étendues en leur ajoutant des
composants. Par exemple
> Lst[5] <- list(matrix=Mat)
5.2.1 Concatèner des listes
Quand les arguments de la fonction de concaténation c() sont des listes, le résultat est
aussi un objet de mode liste, dont les composants sont ceux des listes ajoutés bout à bout
> list.ABC <- c(list.A, list.B, list.C)
Rappellez-vous qu’avec des vecteurs en argument, la fonction de concaténation met de
façon similaire tous les arguments dans une seule structure vectorielle. Dans ce cas, les
autres attributs, comme les attributs dim, sont perdus.
5.3 Data frames
Un "data.frame" est une liste de classe "data.frame", mais il y a des restrictions sur
les listes pour devenir des data frames :
• Les composants doivent être des vecteurs (numériques, de caractères ou logiques), des
facteurs, des matrices numériques, des listes ou d’autres data frames.
• Les matrices, listes ou data frames fournissent autant de variables au nouveau data
frame qu’elles ont de colonnes, d’éléments ou de variables respectivement.
• Les vecteurs numériques et les facteurs sont inclus tels quels mais les vecteurs nonnumériques (caractères et logiques) sont forcés en facteurs dont les niveaux sont les
valeurs (uniques) apparaissant dans le vecteur.
• Les structures vectorielles variables du data frame doivent avoir la même longueur, et
les structures matricielles doivent avoir le même nombre de lignes.
Un data frame peut, dans de nombreux cas, être vu comme une matrice avec des colonnes
ayant des modes et attributs différents. Il peut être affiché comme une matrice et ses lignes
et colonnes extraites en utilisant les conventions d’indiçage des matrices.
5.3.1 Construire des data frames
Les objets satisfaisant les conditions sur les colonnes (composants) d’un data frame
peuvent être utilisés pour en construire un à l’aide de la fonction data.frame:
Chapitre 5: Listes et data frames
21
> accountants <- data.frame(home=statef, loot=income, shot=incomef)
Une liste dont les composants se conforment aux restrictions imposées aux data frame
peut être forcée en data frame en utilisant la fonction as.data.frame()
La façon la plus simple de construire un data frame à partir de rien est d’utiliser la
fonction read.table pour lire un data frame stocké dans un fichier. Ceci est expliqué plus
en détails dans la section Chapitre 6 [Lire des donnees dans des fichiers], page 23.
5.3.2 attach() et detach()
La notation $, comme dans accountants$statef, n’est pas toujours très pratique pour
accèder aux composants des listes. Il serait utile de les rendre temporairement visibles
comme si c’étaient des variables (sans avoir besoin d’y adjoindre constamment le nom de la
liste).
La fonction attach(), de même qu’elle peut avoir un nom de répertoire en argument,
peut aussi avoir un data frame. En supposant que Lentilles est un data frame avec 3
variables Lentilles$u, Lentilles$v, Lentilles$w l’attacher
> attach(Lentilles)
place le data frame en position 2 du path. S’il n’y a pas de variables u, v ou w en position 1,
u, v et w sont maintenat manipulables en tant que variables du data frame mais sous leurs
propres noms.
Ici une affectation comme
> u <- v+w
ne modifiera pas le composant u du data frame mais le masquera par une nouvelle valeur
u en position 1 du search path du répertoire de travail. Pour faire un changement dans le
data frame, la façon la plus simple est de se resservir de la notation $ :
> Lentilles$u <- v+w
Cependant la nouvelle valeur du composant u ne sera pas visible avant que le data frame
ne soit détaché.
Pour détacher un data frame on utilise la fonction
> detach()
Ceci, plus précisément, détache du search path ce qui se trouve en position 2. Ainsi,
dans ce contexte, les variables u, v et w ne seront plus visibles, excepté avec la notation de
liste $. Les entités aux positions supérieures à 2 dans le search path peuvent être détachées
en donnant leur numéro en argument de detach, mais il est toujours plus prudent d’utiliser
leur nom, par exemple par detach(Lentilles) ou detach("Lentilles")
NOTE: Dans la version actuelle de R, le search path ne peut contenir plus de
20 éléments. Evitez d’attacher le même data frame plus d’une fois. Détachez
toujours un data frame aussit que vous en avez fini avec ses variables.
NOTE: Dans la version actuelle, les data frames ne peuvent être attachés qu’en
position 2 ou après.
Chapitre 5: Listes et data frames
22
5.3.3 Travailler avec les data frames
Voici quelques règles qui vous permettront de travailler de front sur de nombreux
problèmes dans le même répertoire :
• rassemblez, pour chaque analyse, toutes les variables dans un data frame au nom explicite;
• quand vous travaillez sur une analyse, attachez le data frame correspondant en
position 2 et utilisez le répertoire de travail au niveau 1 pour stocker les variables
intermédiaires et temporaires;
• avant d’en terminer avec votre analyse, rajoutez toutes les variables de quelque interêt
à votre data frame en utilisant le $ et ensuite faites detach();
• finalement, effacez du répertoire de travail les variables indésirables et essayer de le
garder vierge de toute variable temporaire dans la mesure du possible.
De cette façon il est facile de travailler sur de nombreux problèmes dans le même
répertoire, même si on a dans plusieurs de ceux-ci des variables x, y et z par exemple.
5.3.4 Attacher des listes
attach() est une fonction générique qui permet d’attacher non seulement des répertoires
et des data frames au search path, mais aussi d’autres classes d’objets. En particulier, tout
objet de mode list peut être attaché :
> attach(une.vieille.liste)
Tout ce qui a été attaché peut ensuite être détaché par detach, avec le numéro de
position, ou, de préférence, avec le nom en argument.
5.3.5 Gérer le search path
La fonction search affiche le search path courant et est donc très utile pour garder la
trace des data frames et des listes (et aussi des packages) qui ont été attachés et détachés.
Au départ cela donne :
> search()
[1] ".GlobalEnv"
"Autoloads"
"package:base"
1
oú .GlobalEnv est le workspace.
Après que Lentilles ait été attaché on a
> search()
[1] ".GlobalEnv"
"Lentilles"
"Autoloads"
"package:base"
> ls(2)
[1] "u" "v" "w"
comme nous avons vu ls (ou objects) peut être utilisé pour examiner le contenu de chaque
position du search path.
Finalement, on détache le data frame et on vérifie qu’il a bien été détaché.
> detach("lentils")
> search()
[1] ".GlobalEnv"
"Autoloads"
"package:base"
1
Voir l’aide en ligne pour autoload pour la signification du deuxième terme.
Chapitre 6: Lire des données dans des fichiers
23
6 Lire des données dans des fichiers
Les gros jeux de données seront en général lus dans des fichiers externes plutôt qu’entrés
à la main durant une session R. Le mécanisme de lecture de R est assez simple mais il a des
exigences très strictes. Les constructeurs de R ont clairement présumé que l’on serait à même
de modifier les fichiers avec d’autres outils , comme des éditeurs de texte (emacs ou autre)
ou perl1 pour satisfaire aux exigences de R. En général c’est très simple. Il y a cependant
une fonction read.fwf() qui peut être utilisée pour lire des fichiers dans lesquels les champs
sont de longueur fixée et non-séparés.(ceci est réalisé par un script perl qui qui convertit
le fichier dans un format utilisable et le passe à read.table). Il y a aussi count.fields()
qui permet de compter le nombre de champs sur chaque ligne d’un tel fichier. En certaines
occasions, pour de très simples problèmes de conversion ou de vérification, elles pourront
faire l’affaire. Cependant il est préférable de faire le travail de débroussaillage des données
avant de débuter la session R. Pour lire un jeu de données entier, on utilisera la fonction
read.table().La fonction scan(), plus primitive, peut aussi être utilisée.
6.1 La fonction read.table()
Pour lire un jeu de données de faon directe, le fichier qui le contient devra normalement
avoir une forme bien définie :
• La première ligne du fichier devra comporter le nom de chaque variable-colonne du jeu
de données.
• Toutes les lignes du fichier qui suivent doivent avoir comme premier élément un indice
de ligne puis les valeurs pour chaque variable.
Si le fichier a un élément de moins dans sa première ligne que dans la seconde, c’est cette
convention qui sera utilisée. Les premières lignes d’un tel fichier de données ressembleront
à ce qui suit :
Forme du fichier avec indices de ligne:
01
02
03
04
05
...
Prix
52.00
54.75
57.50
57.50
59.75
Surface
111.0
128.0
101.0
131.0
93.0
Terrain Pièces
830
5
710
5
1000
5
690
6
900
5
Age
6.2
7.5
4.2
8.8
1.9
Chauff.central
non
non
non
non
oui
Par défaut les éléments numériques (à l’exception des indices de ligne) sont lus comme des
variables numériques et les éléments non-numériques, comme Chauff.central dans notre exemple, comme des facteurs. Ceci peut être modifié si nécessaire. La fonction read.table()
peut être utilisée directement pour lire ce jeu de données.
> PrixMaison <- read.table("maison.data")
1
comme sed ou awk sous UNIX
Chapitre 6: Lire des données dans des fichiers
24
Souvent vous ne voudrez pas mettre les indices de lignes et utiliser les indices par défaut.
Dans ce cas, il suffit que le fichier ne contienne pas la colonne d’indices, comme dans ce qui
suit.
Fichier sans indices de ligne:
Prix
52.00
54.75
57.50
57.50
59.75
...
Surface
111.0
128.0
101.0
131.0
93.0
Terrain Pièces
830
5
710
5
1000
5
690
6
900
5
Age
6.2
7.5
4.2
8.8
1.9
Chauff.central
non
non
non
non
oui
Ce fichier de données peut être lu par
> PrixMaison <- read.table("maison.data", header=TRUE)
Où l’option header=TRUE spécifies que la première ligne est la ligne des en-têtes, et, vu
la forme des données, qu’aucun nom de ligne explicite n’est fourni.
6.2 La fonction scan()
Supposons que l’on a des vecteurs de données que l’on veut lire en parallèle. Supposons
de plus qu’il y a trois vecteurs, le premier de mode caractère et les deux autres de mode
numérique, dans le fichier ‘entree.dat’. La première étape consiste dans ce cas à utiliser
scan() pour lire les 3 vecteurs comme une liste, de la faon suivante :
> in <- scan("entree.dat", list("",0,0))
Le deuxième argument est une liste factice qui donne le mode des vecteurs à lire. Le
résultat stocké dans in, est une liste dont les composants sont les trois vecteurs lus. Pour
séparer les éléments de la liste en trois vecteurs, on utilise une allocation du type
> label <- in[[1]]; x <- in[[2]]; y <- in[[3]]
Plus commodément, la liste factice peut avoir des arguments nommés;Dans ce cas ces
noms peuvent être utilisés pour accèder aux vecteurs. Par exemple :
> in <- scan("entree.dat", list(id="", x=0, y=0))
Si vous voulez accèder aux variables séparément, vous pouvez soit les reallouer dans
l’environnement de travail :
> label <- in$id; x <- in$x; y <- in$y
Soit les utiliser en attachant la liste en position 2 du chemin de recherche (voir hundefinedi [Attacher des listes], page hundefinedi). Si le deuxième argument est une valeur
simple au lieu d’une liste, une vecteur unique est lu dont tous les éléments doivent être du
même mode que la valeur factice.
> X <- matrix(scan("light.dat", 0), ncol=5, byrow=TRUE)
Chapitre 6: Lire des données dans des fichiers
25
6.3 Accèder aux jeux de données de base
Plus de cinquante jeux de données sont fournis avec R , et d’autres sont disponibles dans
les packages (y compris les packages standard fournis avec R). Contrairement à S-Plus, ces
jeux de données doivent être chargés de faon explicite en utilisant la fonction data. Pour
avoir la liste des jeux de données du système de base, on utilise
data()
et pour en charger un, par exemple,
data(infert)
Dans la plupart des cas, ceci chargera un objet R du même nom , en général un data frame.
Cependant, dans quelques cas, ceci chargera plusieurs objets, regardez l’aide en ligne sur
les données à charger pour savoir à quoi s’attendre.
6.3.1 charger des données d’autres packages
Pour accèder aux donnée d’autres packages, utilisez l’argument package, par exemple
data(package="nls")
data(Puromycin, package="nls")
Si un package a été attaché par library, ses jeux de données sont automatiquement
inclus dans la recherche, de telle sorte que
library(nls)
data()
data(Puromycin)
fera la liste de tous les jeux de données dans les packages attachés (au moins base et nls
ici) et chargera ensuite Puromycin depuis le premier package dans lequel ce jeu de données
est trouvé. Les packages écrits par des utilisateurs peuvent être une source riche de jeux
de donnée : par exemple, avec les notes du Dr Venables, source de ce document, vient un
ensemble de données qui est maintenant disponible sur le CRAN sous le nom de package
Rnotes.
6.4 Editer des données
Une fois qu’un jeu de données a été lu, il existe une fonctionnalité dans certaines versions
de R qui permet de faire de petits changements dans une fenêtre spéciale. La commande
> xnouveau <- data.entry(xvieux)
vous permet d’éditer votre vieux jeu de données xvieux en utilisant uin environnement du
style feuille de calcul. Après changements, le jeu de données est envoyé dans xnouveau.
xvieux, et donc xnouveau, peuvent être matrice, vecteur, data frame ou objet atomique.
Appeler data.entry() sans arguments
> xnouveau <- data.entry()
vous permet d’entrer de nouvelles données via cet interface.
Chapitre 6: Lire des données dans des fichiers
26
6.5 Importer des données
Il peut être important dans certains projets d’importer des données de bases de données
externes ou de fichiers conus pour d’autres systèmes. Il y a plusieurs packages développés
dans le but de rendre l’importation des données en R plus facile. Actuellement il existe
un package stataread qui permet de lire et écrire des fichiers stata ainsi qu’un package
expérimental, foreign, qui sera capable de lire des fichiers SAS, Minitab et SPSS. Plusieurs
packages proposent une interface pour les bases de données SQL et un package RODBC
est développé pour fournir une connexion aux bases de données ODBC (comme access sous
MS-Windows).
Chapitre 7: Complément sur le langage. Boucles et exécution conditionnelle.
27
7 Complément sur le langage. Boucles et
exécution conditionnelle.
7.1 Expressions groupées
R est un langage d’expressions dans le sens ou son seul type de commandes est une
fonction ou une expression qui retourne une valeur résultat. Même une allocation est une
expression, dont le résultat est une valeur allouée - et à ce titre elle peut être utilisée partout
o une expression peut l’être. En particulier, les allocations multiples sont possibles.
Les commandes peuvent être groupées ensemble dans des accolades, {expr 1; . . . ;
expr m}. Dans ce cas, la valeur du groupe est le résultatde la dernière expression. Puisqu’un
tel groupe est aussi une expression, il peut aussi, par exemple, être lui-même inclus dans
des parenthèses et utilisé dans une expression plus grande, et ainsi de suite.
7.2 Les instructions de contrôle
7.2.1 Exécution conditionnelle : l’instruction if.
Le langage possède une instruction conditionnelle de la forme
> if (expr 1) expr 2 else expr 3
o expr 1 doit retourner une valeur logique. Le résultat de l’expression complète est
évident.
Les opérateur && et || sont souvent utilisés dans la condition d’une instruction if. Alors
que & et | s’appliquent aux éléments d’un vecteur, && et || s’appliquent à des vecteurs de
longueur 1 et évaluent seulement le second élément si nécessaire.
Il y a également une version vectorielle du if/else : la fonction ifelse. Elle a la forme
ifelse(condition, a,b) et retourne un vecteur de même longueur que son plus grand
argument, avec les éléments a[i] si condition[i] est vraie et b[i] sinon.
7.2.2 éxecution repetitive : les boucles for, repeat et while.
Il existe également une boucle for qui a la forme
> for (nom in expr 1) expr 2
où nom est la variable de boucle . expr 1 est une expression vectorielle , (souvent une
séquence comme 1:20), et expr 2 est souvent un groupe d’expression qui composent avec
le nom. expr 2 est évalué de faon répétitive tant que nom parcourt les valeurs du vecteur
résultat de expr 1.
Regardons un exemple o l’on suppose que ind est un vecteur de catégories; On veut
faire un graphique de y contre x pour chaque catégorie. une possibilité serait ici d’utiliser
coplot(), que nous verrons plus tard, qui dessine une matrice de graphes correspondant à
chaque catégorie. Une autre faon de faire cela, en mettant dessinant toutes les courbes sur
le même graphes est la suivante :
> xc <- split(x, ind)
> yc <- split(y, ind)
> for (i in 1:length(yc)) {
Chapitre 7: Complément sur le langage. Boucles et exécution conditionnelle.
28
plot(xc[[i]], yc[[i]]);
abline(lsfit(xc[[i]], yc[[i]]))
}
(Remarquez l’utilisation de la fonction split() qui produit une liste de vecteurs obtenus
en séparant un vecteur d’après les classes d’un vecteur catégoriel. C’est une fonction très
utile, surtout utilisée en connection avec les boxplot. regardez sa page d’aide pour de plus
amples détails.)
ATTENTION : les boucles for sont beaucoup moins utilisées dans le code R
que dans des langages compilés. Un code qui compose avec des objets entiers
est plus clair et plus rapide.
D’autres fonctionnalités liées aux boucles sont l’instruction
> repeat expr
et l’instruction
> while (condition) expr
L’instruction break peut être utilisée dans toutes ces boucles. C’est la seule
faon de terminer une boucle repeat.
L’instruction next peut être utilisée pour sauter une étape et passer à la suivante.
Les instructions de contrôle sont souvent utilisées avec des fonctions qui sont détaillées dans
hundefinedi [Ecrire vos propres fonctions], page hundefinedi , chapitre dans lesquels d’uatres
exemples seront développés.
Chapitre 8: Ecrire des fonctions
29
8 Ecrire des fonctions
Comme nous l’avons déjà vu de faon informelle, le langage R permet à l’utilisateur de
créer des objets de mode fonction. Celles-ci sont des fonctions R qui sont stockées en interne
de faon appropriée et qui peuvent être utilisées dans des expressions etc. Avec ce procèdé,
le langage gagne en puissance, élégance et facilité d’utilisation. Apprendre à écrire des
fonctions utiles est l’une des faons d’utiliser R de faon confortable et productive.
Il faut préciser que la plupart des fonctions faisant partie du système R, comme mean(),
var(), postscript() etc. sont elle-même écrites en R et ne diffèrent pas des fonctions
utilisateur de ce point de vue.
Une fonction est définie par une affectation de la forme :
> nom <- function(arg 1, arg 2, ...) expression
L’expression est une expression R, habituellement un groupe d’expressions, qui utilise
les arguments arg i pour calculer une valeur résultat. Le résultat de l’expression (ou du
groupe d’expressions) est le résultat retourné par la fonction. Un appel de fonction est en
général de la forme nom(expr 1, expr 2, ...) et peut se faire partout ou cela est légitime.
8.1 Exemples simples
Comme premier exemple, considèrons une fonction qui calcule la statistique de fisher en
montrant bien toutes les étapes. C’est bien sr un exemple artificiel car il y a d’autres faons
plus simples de faire la même chose (fonction t.test par ex.).
8.2 Définir de nouveaux opérateurs binaires
8.3 Arguments nommés et arguments par défaut
8.4 L’argument ‘...’
8.5 Affectations dans les fonctions
Chapitre 9: Procèdures graphiques
30
9 Procèdures graphiques
Les fonctionnalités graphiques sont un composant important et très modifiable de
l’environnement R. Il est possible d’utiliser ces fonctionnalités pour produire une large
varièté de graphiques statistiques mais aussi pour construire de nouveaux types de
graphiques.
Les fonctionnalités graphiques peuvent être utilisée autant en mode interactif qu’en
mode batch, mais le mode interactif est dans la plupart des cas le plus utile. L’utilisation
interactive est également facile car au démarrage R lance un device driver graphique qui
ouvre au besoin des fenêtres graphiques pour l’affichage des graphiques interactifs. Même si
cela se fait fait automatiquement, il est utile de savoir que la fonction X11() est employée
sous UNIX et window() sous Windows.
Une fois que le device driver est en marche, Les commandes graphiques peuvent être
utilisées pour produire et créer des graphes.
Les commandes graphiques sont divisées en trois grands groupes :
• Les fonctions graphiques de haut-niveau créent un nouveau graphe sur la fenêtre
graphique, avec éventuellement des axes, des labels, des titres etc.
• Les fonctions graphiques de bas niveau rajoutent de l’information à un graphe existant,
comme des points supplémentaires, des lignes ou des labels.
• Les fonctions graphiques interactives permettent de rajouter, ou d’enlever, de
l’information sur un graphe existant de faon interactive, à l’aide d’un mécanisme de
pointage, comme la souris.
En supplément, R garde une liste des paramètres graphiques qui peuvent être manipulés
pour personnaliser vos graphes.
9.1 Commandes graphiques de haut niveau
Les fonctions graphiques de haut-niveau sont prévues pour générer un graphe complet
à partir des données passées en argument de la fonction.Quand c’est approprié, des axes,
labels et titres sont automatiquement générés (à moins que vou n’ayez spécifié le contraire).
Les commandes graphiques de haut niveau démarrent toujours un nouveau graphe, effaant
le graphe courant si nécessaire.
9.1.1 La fonction plot
Une des fonctions graphiques les plus utilisées en R est plot(). C’est une fonction
générique : le type de graphe produit dépend du type ou classe du premier argument.
plot(x,y)
plot(xy) si x et y sont des vecteurs, plot(x,y) produit un graphe des avec les coordonnées de x en abscisse et les coordonnées de y en ordonnée. On peut obtenir
le même résultat en fournissant un seul argument (seconde forme) qui soit une
liste de deux éléments x et y ou une matrice à deux colonnes.
plot(x)
si x est une série temporelle, cela produit un graphe série-temporelle, si x est
un vecteur numérique, cela produit un graphe des coordonnées de x contre leur
Chapitre 9: Procèdures graphiques
31
indice dans le vecteur, et si x est un vecteur complexe, cela produit un graphe
des parties imaginaires des éléments du vecteur contre les parties réelles.
plot(f )
plot(f,y) f est un facteur, y un vecteur numérique. La première forme gnère un diagramme en batons de f ; la seconde forme produit des boîtes à pattes de y pour
chaque niveau de f.
plot(jd)
plot(~ expr)
plot(y ~ expr)
jd est un jeu de données, y est un objet, expr est une liste de noms d’objets
séparée par ’+’ (e.g., a+b+c). Les deux premières forms produisent des graphes
des distributions des variables dans le jeu de données (première forme) ou d’un
certain nombre d’objets nommés (seconde forme). La troisième forme dessine
y contre chaque objet nommé dans expr.
9.1.1.1 graphes de données multivariées
R fournit deux fonctions très utiles pour représenter des données multivariées. Si X est
une matrice numérique ou un jeu de données, la commande
> pairs(X)
produit une matrice des diagrammes de dispersion définie par les colonnes de X, c’est à
dire que chaque colonne de X est dessinée contre chaque autre colonne de X et les n(n-1)
graphes sont placés dans une matrice avec la mme échelle dans les lignes et colonnes de la
matrice. Le nom de pairs vient du fait que’il y a un diagramme de dispersion pour chaque
paire de colonnes de X. Quand on travaille avec trois ou quatre variables, un coplot peut
être plus enrichissant. si a et b sont deux vecteurs numériques et c est un vecteur numérique
ou un facteur (tous de la même longueur), alors la commande
> coplot(a ~ b | c)
produit des graphes de a contre b pour des valeurs de c données. Si c est un facteur,
cela signifies simplement que a est dessiné contre b pour chaque niveau de c. Quand c
est numérique, il est divisé en un certain nombre d’intervalles de conditionnement et pour
chaque intervalle, a est dessiné contre b pour chaque valeur de c dans l’intervalle. Le
nombre et la position des intervalles peuvent être controllés via l’argument given.values=
de coplot()—la fonction co.intervals() est utile pour sélectionner les intervalles. Vous
pouver aussi donner 2 variables conditionnantes avec une commande comme
> coplot(a ~ b | c + d)
qui produit des graphes de dispersion de a contre b pour chaque intersection des intervalle
conditionnant de c et d.
Les fonctions coplot() et pairs() prennent toutes les deux un argument panel= qui
peut être utilisée pour définir le type de graphe qui apparaît dans chaque cadre. Le défaut
est points() pour produire un dessin des points sur un plan, mais en fournissant d’autres
fonctions graphiques de bas niveau à panel=, vous pouvez dessiner n’importe quel type de
graphe.Un exemple de fonction utile pour les coplot est panel.smooth().
Chapitre 9: Procèdures graphiques
32
9.1.2 Graphiques spéciaux
D’autres fonctions graphiques de haut niveau produisent des types de graphes différents.
Quelques exemples :
qqnorm(x)
qqline(x)
qqplot(x, y)
Graphiques de comparaison de distributions. La première forme trace le vecteur
numŕique x contre les scores attendus d’une normale (graphe qq) et le deuxième
ajoute une ligne à ce graphe qui passe à travers les quartiles de la distribution
et des données. La troisième forme dessine les quartiles de x contre ceux de y
pour comparer leur distributions respectives.\
hist(x)
hist(x, nclass=n)
hist(x, breaks=b, ...)
Produit l’histogramme du vecteur numérique x. Un nombre de classes adéquat
est géneralement choisi, mais on peut donner une recommandation a travers
l’argument nclass=. On peut également choisir de donner les points de rupture avec l’argument breaks=. Si probability=TRUE est donné, les barres
représentent les fréquences relatives au lieu de comptage.
dotchart(x, ...)
construit un graphique en épingle (?) des donnees de x. Dqns un graphique
en épingle (?), on a en ordonnée les labels des données de x et les valeurs en
abscisse. Par exemple cela permet une sélection visuelle facile de données dont
les valeurs sont dans une certaine fourchette.
image(x, y, z, ...)
contour(x, y, z, ...)
persp(x, y, z, ...)
Graphes tridimensionnels. le graphe image dessine une grille de rectangles de
differentes couleurs pour representer les valeurs de z, le graphe contour des
lignes, et persp dessine une surface 3D.
9.1.3 Arguments des fonctions graphiques de haut niveau
Un grand nombre d’arguments peuvent être passés aux fonctions graphiques de haut
niveau :
add=TRUE
Obliges la fonction à agir comme une fonction graphique de bas niveau, ajoutant
le graphe sur le graphe courant (seulement pour certaines fonctions).
axes=FALSE
ne génère pas les axes—utile pour ajouter vos axes personnalisés avec la fonction
codeaxis(). Par défaut , axes=TRUE, les axes sont génèrés.
log="x"
log="y"
log="xy"
les abscisses, les ordonnées ou les deux sont logarithmiques. Ceci marchera pour
beaucoup de fonctions (pas toutes...).
Chapitre 9: Procèdures graphiques
type=
33
l’argument type= contrôle le type de graphe produit, de la façon suivante :
type="p"
Dessine des points individuels (le défaut)
type="l"
Dessine des lignes
type="b"
Dessine des points connectés par des lignes (both)
type="o"
dessine des points traversés par des lignes.
type="h"
dessine des points reliés à l’axe des ordonnees par des lignes verticales (high-density)
type="s"
type="S"
type="n"
fonctions en escalier. (...)
Ne dessine rien. Cependant les axes sont génerés (par défaut) et le
système de coordonnées est mis en place en fonction des données.
Idéal pour creer des graphes avec les fonctions graphiques de bas
niveau par la suite.
xlab=string
ylab=string
Légendes des axes des abscisses et des ordonnées. utilisez ces arguments pour
changer les légendes par défaut, habituellement les noms des objets dans l’appel
de la fonction.
main=string
Titre de la figure, placé au dessus de cette dernière, en grosses lettres.
sub=string
Sous-titre, place juste sous l’axe des abscisses dans une police plus petite.
9.2 Fonctions graphiques de bas niveau
Parfois les fonctions graphiques de haut niveau ne produisent pas exactement
le type de graphe que l’on recherche. Dans ce cadre, les fonctions graphiques
de bas niveau peuvent être utilisées pour rajouter de l’information (comme des
points, des lignes, du texte) au graphique courant.
Parmi les plus utiles de ces fonction graphiques de bas niveau on a :
points(x, y)
lines(x, y)
Rajoutes des points ou des lignes au graphique courant. l’argument
type= de plot() peut egalement etre passes a ces fonctions (par
defaut il est a "p" pour points() et "l" pour lines().)
text(x, y, labels, ...)
Ajoutes du texte au graphique aux points donnés par x, y. Normalement labels est un vecteur de caractères ou d’entiers, et
labels[i] est ajouté à la position (x[i], y[i]).
Note: Cette fontion est souvent utilisée comme suit
Chapitre 9: Procèdures graphiques
34
> plot(x, y, type="n"); text(x, y, names)
Le paramètre graphique type="n" supprime les points mais dessine
les axes, et la fonction text() dessine les caracteres spéciaux donnés
par names aux emplacements des points.
abline(a, b)
abline(h=y)
abline(v=x)
abline(lm.obj)
Rajoutes une ligne de pente b et d’abscisse à l’origine a au graphe
courant. (...)
polygon(x, y, ...)
Dessines un polygone défini par les vecteurs ordonnés (x, y) et
(optionnellement) le remplit de hachures.
legend(x, y, legend, ...)
Ajoutes une légende au graphe courant à la position spécifiée. les
caractères utilisés pour les points, les styles de lignes etc. sont
identifiés par les labels du vecteur legend. Au moins un argument
v (de la même taille que legend) avec les valeurs correspondantes
doit être donné :
legend( , fill=v)
Couleurs pour des remplissages
legend( , col=v)
Couleurs des points ou lignes
legend( , lty=v)
Styles des lignes
legend( , lwd=v)
Epaisseurs des lignes
legend( , pch=v)
Type des points (vecteur de caractères)
title(main, sub)
Ajoute un titre main en haut du graphe courant en grande police
et (optionnellement) un sous-titre sub en bas avec une police plus
petite.
axis(side, ...)
Ajoutes un axe au graphe courant sur le coté donné par le premier
argument (1 à 4 en partant du bas dans le sens des aiguilles d’une
montre.) Les autres arguments contrôlent la position de l’axe, les
marques et les labels. Utile pour ajouter des axes personnalisés en
utilisant plot() avec l’argument axes=FALSE.
Les fonctions graphiques de bas niveau nécessitent en général des informations
de position (e.g., les coordonnees x et y) pour déterminer ou placer les nouveaux
eléments graphiques. Les coordonnées sont alors des coordonnées utilisateur qui
Chapitre 9: Procèdures graphiques
35
sont définies par les fonctions graphiques de haut niveau utilisées précédemment
et choisies en fonction des données fournies.
Quand les arguments x et y sont nécessaires, il est également possible de fournir
une liste avec deux éléments codex et y. On peut également fournir une matrice
avec deux colonnes. Ainsi des fonctions comme locator() (voir ci-dessous)
peuvent servir a donner des positions de façon interactive.
9.2.1 Annotation mathématique
Il est parfois utile djouter des symboles mathématiques et des formules àun
graphique. On peut faire cela en R en donnant une expression en argument de
text, mtext, axis, ou title au lieu d’une chaîne de caractères. Par exemple
le code suivant dessine la formule de la distribution d’une binomiale :
> text(x, y, expression(paste(bgroup("(", atop(n, x), ")"),
p^x, q^{n-x})))
Pour plus d’informations, y compris une liste complète des possibilités
disponibles, on peut utiliser les commandes R :
> help(plotmath)
> example(plotmath)
9.2.2 Polices Hershey vectorielles
Il est possible de spécifier une police vectorielle Hershey pour le texte qaund on
utilise les fonctions text et contour. Trois raisons d’utiliser ces polices Hershey
:
• Les polices Hershey rendent mieux, particuliérement á lècran, pour du text
renversé et/ou en petits caractères.
• Les polices Hershey fournissent des symboles qui ne sont pas disponibles
avec les polices classiques. En particulier certains signes du zodiaque, des
symboles cartographiques et astronomiques.
• Les polices Heshey fournissent les caractères japonais (kana et kanji).
Pour plus d’informations, y compris les tables des caractères Hershey, on peut
utiliser les commandes R :
> help(Hershey)
> example(Hershey)
> help(Japanese)
> example(Japanese)
9.3 Interragir avec les graphiques
R propose également des fonctions permettant à l’utilisateur d’ajouter ou
d’extraire des information d’un graphe avec la souris. La plus simple est la
fonction locator() :
locator(n, type)
Attends que l’utilisateur sélectionne un point du graphe courant
avec le bouton gauche de la souris. Ceci jusqu’a ce que n (512
Chapitre 9: Procèdures graphiques
36
par défaut) points aient été sélectionnés, ou jusqu’a ce qu’on clique
avec un autre bouton de la souris (Unix, Windows), ou en dehors
de la fenêtre (Mac). L’argument type permet de dessiner les points
selectionnés et a le même effet que pour les commandes graphiques
de haut niveau; par défaut, ne dessine pas les points. locator()
renvoie les coordonnées des points selectionnés dans une liste avec
deux composants x et y.
locator() est généralement appelé sans arguments. C’est une fonction bien
utile pour selectionner les position d’éléments graphiques comme des labels ou
des légendes quand il est compliqué de prévoir à l’avance où sera les graphe.
Par exemple, pour placer un texte informatif près d’un individu aberrant, on
peut faire :
> text(locator(1), "Aberrant", adj=0)
locator() marche également dans le cas ou la souris n’est pas disponible ; dans
ce cas l’utilisateur sera invité à saisir ses coordonnèes x et y.
identify(x, y, labels)
Permet à l’utilisateur de mettre en lumière un point défini par x
et y (avec le bouton gauche de la souris) en dessinant à coté le
composant de labels correspondant (ou l’indice du point si labels
est absent). Retournes les indices des points selectionnés quand on
clique avec un autre bouton (Unix, Windows) ou en dehors de la
fenêtre (Mac).
Parfois on veut identifier des points particuliers du graphe plutot que leurs
positions. Par exemple on peut vouloir que l’utilisateur selectionne certaines
observations d’interert sur un graphique pour les manipuler par la suite. Etant
donnés des coordonnées (x, y) données dans deux vecteurs numériques x et y,
on peut utiliser la fonction identify() comme suit :
> plot(x, y)
> identify(x, y)
identify() ne dessine rien par elle-même mais elle permet à l’utilisateur de
cliquer avec le bouton gauche de la souris près d’un point. Le point le plus
proche de la souris sera alors mis en lumière par son indice (c’est à dire sa
position dans les vecteurs x/y) imprimé juste à coté. On peut également fournir
une chaine de caractères plus informative en utilisant l’argument labels de
identify(), ou désactiver la mise en lumière avec l’argument plot=FALSE.
Quand le processus se termine (voir plus haut), identify() renvoies les indices
des points selectionnés; vous pouvez utiliser ces indices pour extraire les points
des vecteurs x et y.
9.4 Paramètres graphiques
Quand on crée des graphes, spécialement dans un objectif de présentation ou de
publication, R ne produit pas toujours exactement ce que l’on veut. Cependant
vous pouvez personnaliser presques tous les aspects d’une fenêtre graphique en
utilisant les Paramètres graphiques. R possède une grande varièté de paramètres
Chapitre 9: Procèdures graphiques
37
graphiques qui controlent des choses comme le style des lignes, les couleurs,
arrangement des figures et la justification du texte parmi tant d’autres. Chaque
paramètre graphique a un nom (comme ‘col’, qui contrôle les couleurs), et une
valeur (un numéro de couleur, par exemple).
Une liste de paramètres graphique est tenue à jour pour chaque graphe actif,
et chaque graphe a un jeu de paramètres par défaut quand il est initialisé. Les
paramètres graphiques peuvent être définis de deux façons : soit permanente,
affectant toutes les fonctions graphiques qui dessinent dans la fenêtre courante;
soit temporaire, affectant un unique appel de fonction graphique.
9.4.1 Changements permanents : la fonction par()
On utilise la fonction par() pour modifier ou accèder à une liste de tous les
paramètres graphiques et leurs valeurs pour le graphe courant.
par()
Sans arguments, renvoie une liste de tous les paramètres graphiques
et leurs valeurs pour le graphe courant.
par(c("col", "lty"))
Avec un vecteur de caractères en argument, renvoie seulement les
paramètres graphiques donnés (ici encore sous forme de liste).
par(col=4, lty=2)
Avec des arguments nommés (ou une liste), modifie les valeurs des
paramètres graphiques donnés, et retournes les valeurs originales
des paramètres dans une liste.
Ajuster les paramètres graphiques avec la fonction par() change les valeurs
des paramètres de façon permanente en ce sens que des appels futurs à des
fonctions graphiques (dans la fenêtre courante) seront affectés par ces nouvelles
valeurs. En fait quand on initialise les paramètres de cette façon, on doit y
penser comme à la mise en place de valeurs par "défaut" qui seront utilisées
par les fonctions graphiques à moins qu’une valeur alternative soit donnée.
Notez que les appels à par() affectent toujours les valeurs globales des
paramètres graphiques, même quand par() est appelé dans une fonction.
C’est souvent un comportement indésirable—en général, on veut modifier
certains paramètres graphiques, faire des graphes, puis revenir aux valeurs
originales sans affecter la session R. Vous pouvez revenir aux valeurs initiales
en sauvant le résultat de par() en faisant les changements, et en restaurant
les valeurs initiales une fois le graphe achevé.
> vieuxpar <- par(col=4, lty=2)
. . . commandes graphiques . . .
> par(vieuxpar)
9.4.2 Changements temporaires : arguments des
fonctions graphiques
Les paramètres graphiques peuvent aussi être passés à (presque) toutes les fonctions graphiques comme des arguments nommés. Cela à les mêmes effets que de
Chapitre 9: Procèdures graphiques
38
passer les argments à la fonction par() sauf que les changements ne dureront
que le temps de l’appel de la fonction. Par exemple :
> plot(x, y, pch="+")
produit un nuage de points en utilisant un signe plus comme caractère
d’impresion des points, sans changer le caractère d’impression par défaut pour
de futurs graphes.
9.5 Liste des paramètres graphiques
La section qui suit détaille beaucoup des paramètres graphiques les plus utilisés
au niveau utilisateur. La documentation R de la fonction par() fournit un
résumé plus concis; on propose ici une alternative un peu plus détaillée.
Les paramètres graphiques seront proposés sous la forme suivante :
nom=valeur
Une description de l’effet du param‘etre. nom est le nom du
paramètre, c’est à dire le nom de l’argument à utiliser dans les
appels à par() ou à des fonctions graphiques. valeur est une
valeur typiquement utilisée pour initialiser le paramètre.
9.5.1 Eléments graphiques
les graphes de R sont faits de points, de lignes, de texte, et de polygones (régions
pleines). Il existe des paramètres graphiques qui contrôlent la façon dont ces
élements graphiques sont dessinés :
pch="+"
Le caractère à utiliser pour le dessin des points. Le défaut varie
suivant les pilotes, mais en général c’est ‘◦’. Les points dessinés ont
tendance à apparaître au dessus ou au dessous de la vraie position,
à moins d’utiliser "." comme caractère de dessin, ce aui donne des
points bien centrés.
pch=4
Quand pch est donné par un entier compris entre 0 et 18, un symbole spécial est utilisé. Pour voir quels sont ces symboles, utilisez
la commande
> legend(locator(1), as.character(0:18), pch = 0:18)
lty=2
Type des lignes. Les styles de lignes ne sont pas supportés par tous
les pilotes graphiques (et varient suivant ceux qui les supportent)
mais une ligne de type 1 est toujours continue et les lignes au dessus
du type 2 sont plus ou moins pointillées.
lwd=2
Largeur des lignes. La largeur de ligne désirée, en multiples de la
largeur de ligne "standard". Affecte les axes autant que les lignes
dessinées avec lines(), etc.
col=2
Les couleurs à utiliser pour les points, les lignes, le texte, les régions
pleines et les images. Chacun de ces élements graphiques a une liste
de couleurs possibles et la valeur de ce paramètre est un indice de
cette liste. Ce paramètre ne s’applique bien sûr que pour un nombre
limité de périphériques graphiques.
Chapitre 9: Procèdures graphiques
font=2
39
Un entier qui spécifie la police à utiliser pour le texte. Si c’est possible, les pilotes de périphériques s’arrangent pour que 1 corresponde
à du texte normal, 2 à du gras, 3 à de l’italique et 4 à de l’italique
gras.
font.axis
font.lab
font.main
font.sub La police à utiliser pour l’annotation des axes, les labels des abscisses et des ordonnées, les titres principaux et les sous-titres respectivement.
adj=-0.1
La justification du texte relativement au dessin. 0 signifies justification à gauche, 1 à droite et 0.5 signifies que l’on centre horizontalement autour de la position de dessin. La valeur est en fait la
proportion de texte qui apparait à gauche de la position de dessin,
ainsi une valeur de -0.1 laisse un vide de 10% de la taille du texte
entre le texte et la position de dessin.
cex=1.5
Agrandissement de caractères. La valeur est la taille de caractères
désirée (y compris les caractères de dessin) relativement a la taille
du texte par défaut.
9.5.2 Axes et marques
Beaucoup des graphiques de haut niveau de R ont des axes, et l’on peut construire ses propres axes avec la fonctions graphique de bas niveau axis(). Les axes
ont trois composantes principales : les lignes d’axe (dont le style est controlé
par le paramètre graphique lty), les marques d’axe (qui marquent les unités de
l’axe) et les labels de marques (sic) (qui identifient les unités). Ces composantes
peuvent être personnalisées à l’aide des paramètres graphiques suivants.
lab=c(5, 7, 12)
Les deux premiers chiffres indiquent le nombre d’intervalles de marques sur les axes des abscisses et des ordonnées respectivement. Le
troisième chiffre e est la longueur, en caractères, des labels des axes
(en incluant le point des décimales). Si on choisit une valeur trop
petite pour ce paramètre, on peut se retrouver avec tous les labels
arrondis au même chiffre!
las=1
Orientation des labels des axes. 0 signifie parallèle à l’axe, 1 horizontal, et 2 perpendiculaire à l’axe.
mgp=c(3, 1, 0)
Positions des composantes des axes. Le premier paramètre est la
distance entre l’axe son intitulé, en lignes de texte. Le deuxième est
la distance aux labels des marques, et le dernier est la distance de
la position de l’axe à la ligne d’axe (en général 0). Nombres positifs
pour l’extérieur de la région graphique et négatifs pour l’intérieur.
tck=0.01
Longueur des marques, en fraction de la taille de la région
graphique. Quand tck est petit (plus petit que 0.5) les marques
Chapitre 9: Procèdures graphiques
40
des abscisses et des ordonnées sont forcées à la même taille. Une
valeur de 1 donne une grille. Les valeurs négatives donnent
des marques en dehors du graphique. Utilisez tck=0.01 et
mgp=c(1,-1.5,0) pour des marques à l’intérieur de la ligne d’axe.
xaxs="s"
yaxs="d"
Le style des axes pour les abscisses et des ordonnées respectivement.
Avec les styles "s" (standard) et "e" (étendu) la plus petite marque
et la plus grande sont en dehors du domaine des données. Les axes
étendus peuvent être rallongés si il y a des points trs̀ proches des
bords. Ce type d’axe peut laisser de larges espaces vides près des
bords. Avec les styles "i" (interne) et "r" (le défaut) les marques
sont toujours dans le domaine des données, et le style "r" laisse
toujours un espace vide sur les bords.
Règler ce paramètre sur "d" (axe dircet) bloque l’axe courant et
l’utilise pour les graphes suivants (ou au moins jusqu’à ce que le
paramètre soit reinitialisé à une des valeurs ci-dessus). Utile pour
génerer une série de graphes à la même échelle.
9.5.3 Marges des figures
Un graphe seul en R est appelé figure et comprends une région graphique
entourée de marges (contenant éventuellement les intitulés des axes, les titres,
etc.) et (généralement) délimitée par les axes eux-mêmes.
Une figure typique
mar[3]
3.0
−−−−−−−−−−−−−−−−−−
−−−−−−−−−−−−−−−−−−
−−−−−−−−−−−−−−−−−−
−−−−−−−−−−−−−−−−−−
−−−−−−−−−−−−−−−−−−
−−−−−−−−−−−−−−−−−−
y
0.0
1.5
Plot region
−3.0
−1.5
mai[2]
−3.0
−1.5
mai[1]
0.0
x
1.5
3.0
Margin
Les paramt̀res graphiques contrôlant tout ceci incluent :
mai=c(1, 0.5, 0.5, 0)
Les largeurs des marges du bas, de gauche, du haut et de droite
respectivement, en pouces.
Chapitre 9: Procèdures graphiques
41
mar=c(4, 2, 2, 1)
Pareil que mai sauf que l’unité est ici la ligne de texte au lieu du
pouce.
mar et mai sont équivalents au sens ou modifier l’un modifies aussi l’autre. Les
valeurs par défaut pour ces paramètres sont souvent trop grandes; la marge de
droite est rarement utile et celle du haut ne l’est jamais s’il n’y a pas de titre. Les
marges du bas et de gauche doivent être assez larges pour les axes et les intitulés
des marques. De plus le défaut est défini sans prendre en compte la taille de
la surface du graphe : par exemple en employant le pilote postscript() avec
l’argument height=4 resultera en un graphe occupé à 50% par les marges à
moins que mar ou mai soient donnés explicitement. Quand on a des matrices
de figures (voir plus loin) les marges sont réduites de moitié mais cela peut être
encore trop large siil y a beaucoup de figures sur la même page.
9.5.4 Matrices de graphiques
9.5.5 Pilotes de périphériques
9.5.6 Diagrammes postscript
9.6 Graphiques dynamiques
Annexe A: Une session d’introduction à R
42
Annexe A Une session d’introduction à R
La session qui va suivre se propose de vous présenter certaines fonctionnalités de
l’environnement R par la pratique. De nombreuses fonctionnalités sembleront déroutantes
au premier abord, mais cela disparaitra avec l’usage. Ceci est écrit pour l’utilisateur UNIX
, ceux qui utilisent Windows devront adapter un peu.
Loggez-vous et démarrez votre gestionnaire de fenêtres. Vous devez avoir le
fichier ‘morley.data’ dans votre répertoire de travail. Si ce n’est pas le cas,
addressez-vous à votre responsable système (si vous avez la chance d’en avoir
un;) ou prenez-la directement dans le répertoire ‘base/data’ de la bibliothque
R (dans ‘/usr/local/R’ par exemple).
$R
Démarre R.
Le programme R commence, avec un bandeau de commentaires..
(Par la suite le prompt de R ne sera pas représenté pour éviter les confusions.)
help.start()
Démarre l’aide html (en utilisant un butineur disponible sur votre machine).
Vous pouvez regarder un peu les différentes possibilités pour obtenir de l’aide.
Iconifiez ensuite la fenêtre.
x <- rnorm(50)
y <- rnorm(x)
Génère 2 vecteurs x et y pseudo-aléatoires de loi normales et de longueur 50.
plot(x, y)
dessine les points dans le plan. une fenre graphique apparaitra automatiquement.
ls()
Visualise les objets qui sont dans l’espace de travail de R.
rm(x,y)
supprime les objets dont on n’a plus besoin.
x <- 1:20 Crée x = (1, 2, . . . , 20).
w <- 1 + sqrt(x)/2
Cre un vecteur de ’poids’ (écarts types) w.
dummy <- data.frame(x=x, y= x + rnorm(x)*w)
dummy
Construit un data frame de 2 colonnes, x et y, et regarde ce qu’il y a dedans..
fm <- lm(y ~ x, data=dummy)
summary(fm)
Regression linéaire de y sur x et affichage de l’analyse.
fm1 <- lm(y ~ x, data=dummy, weight=1/w^2)
summary(fm1)
Vu qu’on connait les écarts types, on peut faire une regression pondérée.
attach(dummy)
Rends les colonnes du data frame visibles comme des variables.
lrf <- lowess(x, y)
Régression non-paramètrique.
Annexe A: Une session d’introduction à R
43
plot(x, y)
Graphique standard.
lines(x, lrf$y)
Ajoute la courbe de régression au graphe.
abline(0, 1, lty=3)
La vraie droite de régression : (ordonnée à l’origine 0, pente 1).
abline(coef(fm))
La droite de la régression non-pondérée.
abline(coef(fm1), col = "red")
La droite de la régression pondérée.
detach()
Enlève le data frame de la search list.
plot(fitted(fm), resid(fm),
xlab="Fitted values",
ylab="Residuals",
main="Residuals vs Fitted")
Un diagnostique graphique standard de régression pour confirmer ou infirmer
l’hypothèse d’hétéroscédasticité. Pouvez-vous le voir ?
qqnorm(resid(fm), main="Residuals Rankit Plot")
Un graphe de normalité des scores pour repèrer les individus aberrants (pas
très utile dans ce cas).
rm(fm, fm1, lrf, x, dummy)
On refait le ménage...
On étudiera dans la section qui vient des données provenant des expériences de Michaelson et Morley ayant pour but de mesurer la vitesse de la lumière.
file.show("morley.tab")
Optionnel. Interromp temporairement R et consulte le fichier.
mm <- read.table("morley.tab")
mm
enregistre les données de Michaelson et Morley comme data frame, et le consulte. Il y a cinq expériences (colonne Expt) répétés 20 fois (colonne Run) et sl
est la vitesse de la lumière enregistrée.
mm$Expt <- factor(mm$Expt)
mm$Run <- factor(mm$Run)
Change Expt et Run en facteurs.
attach(mm)
rends le data frame visible en position 2 (le défaut).
plot(Expt, Speed, main="Speed of Light Data", xlab="Experiment No.")
Compare les 5 expériences avec des botes à moustaches.
fm <- aov(Speed ~ Run + Expt, data=mm)
summary(fm)
Analyse de la variance, avec ‘runs’ et ‘experiments’ comme facteurs.
Annexe A: Une session d’introduction à R
44
fm0 <- update(fm, . ~ . - Run)
anova(fm0,fm)
Ajuste un sous modèle en omettant ‘runs’, puis le compare à l’autre.
detach()
rm(fm, fm0)
Fait le ménage avant la suite.
We now look at some more graphical features: contour and image plots.
x <- seq(-pi, pi, len=50)
y <- x
x is a vector of 50 equally spaced values in −π ≤ x ≤ π. y is the same.
f <- outer(x, y, function(x, y) cos(y)/(1 + x^2))
f is a square matrix, with rows and columns indexed by x and y respectively,
of values of the function cos(y)/(1 + x2 ).
oldpar <- par(no.readonly = TRUE)
par(pty="s")
Save the plotting parameters and set the plotting region to “square”.
contour(x, y, f)
contour(x, y, f, nlevels=15, add=TRUE)
Make a contour map of f ; add in more lines for more detail.
fa <- (f-t(f))/2
fa is the “asymmetric part” of f . (t() is transpose).
contour(x, y, fa, nint=15)
Make a contour plot, . . .
par(oldpar)
. . . and restore the old graphics parameters.
image(x, y, f)
image(x, y, fa)
Make some high density image plots, (of which you can get hardcopies if you
wish), . . .
objects(); rm(x, y, f, fa)
. . . and clean up before moving on.
R can do complex arithmetic, also.
th <- seq(-pi, pi, len=100)
z <- exp(1i*th)
1i is used for the complex number i.
par(pty="s")
plot(z, type="l")
Plotting complex arguments means plot imaginary versus real parts. This
should be a circle.
w <- rnorm(100) + rnorm(100)*1i
Suppose we want to sample points within the unit circle. One method would be
to take complex numbers with standard normal real and imaginary parts . . .
Annexe A: Une session d’introduction à R
45
w <- ifelse(Mod(w) > 1, 1/w, w)
. . . and to map any outside the circle onto their reciprocal.
plot(w, xlim=c(-1,1), ylim=c(-1,1), pch="+",xlab="x", ylab="y")
lines(z)
All points are inside the unit circle, but the distribution is not uniform.
w <- sqrt(runif(100))*exp(2*pi*runif(100)*1i)
plot(w, xlim=c(-1,1), ylim=c(-1,1), pch="+", xlab="x", ylab="y")
lines(z)
The second method uses the uniform distribution. The points should now look
more evenly spaced over the disc.
rm(th, w, z)
Clean up again.
q()
Quit the R program. You will be asked if you want to save the R workspace,
and for an exploratory session like this, you probably do not want to save it.
Annexe B: Index des variables et fonctions
46
Annexe B Index des variables et fonctions
!
<
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
!= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
< . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
<= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
&
& . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
&& . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
*
* ............................................ 8
- ............................................ 8
A
abline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
as.data.frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
attr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
axis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
21
15
15
34
B
break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
/
/ ............................................ 8
:
: ............................................ 9
C
c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7, 20
contour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
coplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
cos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
=
== . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
?
? ............................................ 4
|
| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
|| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
D
data.entry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
data.frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
dotchart. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
20
25
32
E
else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
exp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
+
+ ............................................ 8
F
>
fonction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
>= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
H
^
^ ............................................ 8
help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
hist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Annexe B: Index des variables et fonctions
I
identify. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ifelse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
is.na . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
is.nan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
Q
36
27
27
32
10
10
L
legend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
locator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
qqline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
qqnorm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
qqplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
R
range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
read.table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
rep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
repeat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
rm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
S
N
scan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
seq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
sin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
sink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
split . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
sqrt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
NA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
NaN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
T
M
max . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
mean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
min . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
O
order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
ordered . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
ordonne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
tan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
tapply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
title . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
U
P
pairs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
par . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
persp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
pmax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
pmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
polygon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
prod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
unclass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
V
var . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
W
while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Annexe C: Index des concepts
48
Annexe C Index des concepts
A
I
Accèder aux jeux de données de base . . . . . . . . . . 25
Affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Importer des données . . . . . . . . . . . . . . . . . . . . . . . . 26
Instructions de controle . . . . . . . . . . . . . . . . . . . . . . 27
B
Boucles et execution conditionnelle . . . . . . . . . . . . 27
D
Data frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
E
Ecrire des fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Espace de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Expressions groupees . . . . . . . . . . . . . . . . . . . . . . . . . 27
L
lire des donnees dans des fichiers . . . . . . . . . . . . . . 23
Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
P
Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Paramètres graphiques . . . . . . . . . . . . . . . . . . . . . . . 37
R
Rediriger les entrées et les sorties . . . . . . . . . . . . . . 5
regle de recyclage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
S
Supprimer des objets . . . . . . . . . . . . . . . . . . . . . . . . . . 6
F
Facteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Facteurs ordonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Fonctions arithmetiques et operateurs . . . . . . . . . . 8
V
Valeurs manquantes . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Vecteurs de caractères . . . . . . . . . . . . . . . . . . . . . . . . 10
Annexe D: Références
49
Annexe D Références
D. M. Bates and D. G. Watts (1988), Nonlinear Regression Analysis and Its Applications.
John Wiley & Sons, New York.
Richard A. Becker, John M. Chambers and Allan R. Wilks (1988), The New S Language.
Chapman & Hall, New York. Ce livre est souvent appel le “Blue Book ”.
John M. Chambers and Trevor J. Hastie eds. (1992), Statistical Models in S. Chapman
& Hall, New York. Aussi appel le “White Book ”.
Annette J. Dobson (1990), An Introduction to Generalized Linear Models, Chapman and
Hall, London.
Peter McCullagh and John A. Nelder (1989), Generalized Linear Models. Second edition,
Chapman and Hall, London.
John A. Rice (1995), Mathematical Statistics and Data Analysis. Second edition.
Duxbury Press, Belmont, CA.
S. D. Silvey (1970), Statistical Inference. Penguin, London.