slides

Transcription

slides
.
Les bases du langage R
Introduction à R pour la recherche biomédicale
http://www.aliquote.org/cours/2012_biomed
.
.
Introduction
Qu’est-ce que R ?
▶ R est un logiciel pour le traitement et la modélisation de données
statistiques (Ihaka & Gentleman, 1996; Venables & Ripley, 2002).
▶ Dans cet environnement interactif, l’utilisateur envoie des
commandes, R les interprète et renvoit un résultat.
▶ Il existe des interfaces graphiques plus ou moins avancées (Deducer,
Rcmdr, etc.), mais on ne les utilisera pas.
R est gratuit, possède de nombreuses fonctionnalités pour la modélisation,
le reporting et la visualisation de données. Il s’agit avant tout d’un langage de programmation inspiré du langage S développé dans les années 80
(Becker & Chambers, 1981; 1984). Le projet est maintenu par la R Foundation
for Statistical Computing, et toutes les informations officielles sur le projet
R se trouvent à cette adresse : http://www.r-project.org.
.
.
Représentation des données
Contrairement à SPSS ou Statistica, on ne travaille pas à partir d’une vue de
type tableur des données, comme MS Excel®.
A
1
2
3
4
5
6
7
score gender IQ SES
1
M 92
C
5
M 96
A
3
F 97
C
1
F 93
C
5
F 101
C
2
F 100
B
2
M 97
B
B
score
1
5
3
1
5
2
2
gender
M
M
F
F
F
F
M
C
D
IQ
92
96
97
93
101
100
97
SES
C
A
C
C
C
B
B
1
2
3
4
5
6
7
8
Un tableau Excel sera représenté sous forme d’un data.frame, c’est-à-dire
un tableau avec des données de type mixte (chaînes de caractères, nombres,
dates, etc.) et des lignes/colonnes nommées.
Des sources de données externes au format SPSS, Stata, SAS, ou des bases
de données MySQL, peuvent être importées sans problème majeur.
.
.
Exemple de commandes R
Voici un exemple de régression simple à partir de données artificielles :
n <- 100
x <- runif ( n )
y <- 0 .9 + 0 .65 * x + rnorm ( n )
# Fit a simple linear model
summary ( lm ( y ∼ x ))
Dans l’exemple ci-dessus, on voit que la syntaxe est proche de celle d’un langage de programmation : on travaille sur des variables à l’aide de fonctions.
Comme dans tout langage, il existe un vocabulaire et une syntaxe spécifique
au langage R, ainsi que des règles sémantiques. Dans une optique introductive, on s’intéressera essentiellement aux fonctions de base qui permettent
d’effectuer la plupart des opérations statistiques.
.
.
Environnement de travail
Pour travailler avec R, il est nécessaire d’avoir les outils adaptés, en particulier un environnement de développement “intelligent” qui ne gêne pas
l’approche interactive, p.ex. RStudio : http://rstudio.org/.
.
.
Obtenir de l’aide
Il est indispensable de savoir où chercher l’information et de bien se documenter !
▶ sous R directement,
help(topic, package=) ou
help.search(pattern)
▶ la documentation R disponible sur CRAN (Manuals)
▶ la mailing-list R-help
▶ le moteur de recherche Google R-Seek
▶ les sites Stack Exchange (bien lire la FAQ) :
▶
▶
http://stackoverflow.com
http://crossvalidated.com
The R Inferno (Burns, 2011) est une lecture conseillée pour les personnes
désirant approfondir leurs connaissances de R.
.
.
Ressources bibliographiques
En anglais :
▶ Introductory Statistics with R (Dalgaard, 2006)
▶ Biostatistical Design and Analysis Using R (Logan, 2010)
▶ Modern Applied Statistics with S (Venables & Ripley, 2002)
En français :
▶ R pour les débutants (Paradis, 2005)
▶ Comprendre et utiliser les statistiques dans les sciences de la vie
(Falissard, 2005)
Voir aussi http://www.R-project.org/doc/bib/R-books.html.
.
.
Les objets R
L’élément de base est le vecteur (un scalaire est alors un vecteur de longueur
1) que l’on peut créer avec la commande c et dont les éléments sont de l’un
des “types” (mode) suivants :
▶
numeric, des nombres (entiers ou flottants, integer/double)
▶
logical, des booléens à valeur dans {TRUE, FALSE}
▶
character, des caractères ASCII
Les expressions suivantes sont valides :
nombre <- 3 .141593
v <- c (1 ,2 ,3 ,4)
b <- c (T ,F ,T , F )
s <- c ( " h " ," e " ," l " ," l " ," o " )
a <- b <- rnorm (2)
u <- b
.
.
Adresser les éléments d’un vecteur
On utilise [ pour indexer les n éléments d’un vecteur, sachant que l’index du
premier élément vaut 1 (et non 0 comme dans certains langages) :
v [1]
v [ c (1 ,4)]
On peut adresser les élements d’un vecteur en utilisant les valeurs contenues dans un autre vecteur (principe d’un dictionnaire), par exemple :
v[b ]
# valeurs de v telles que b vaut TRUE
s [ v [3]] # v [3]=3 ème valeur de s
On peut encore adresser les éléments d’un vecteur par leur “nom”, le cas
échéant :
names ( v ) <- c ( " toto " ," titi " ," tata " ," tutu " )
v [ " tata " ]
.
.
Application
On peut également vouloir isoler des groupes de valeurs :
▶ Restriction d’un vecteur à certaines de ses valeurs (filtre),
▶ ventilation de scores par niveaux d’un facteur de classification.
Exemple :
n <- 100
age <- sample (25:45 , n , replace = TRUE )
sex <- sample ( c ( " M " ," F " ) , n , replace = TRUE )
length ( age [ sex == " F " ])
length ( sex [ age >= 30 & age <= 40])
Une expression telle que age > 30 retourne un vecteur booléen (“les éléments du vecteur age sont-ils supérieurs (strictement) à 30”). Ce vecteur a
la même longueur que age. Les indices de age pour lesquels cette condition
est vérifiée peuvent être obtenus ainsi :
which ( age > 30)
.
.
Recap’
Voici deux façons d’adresser spécifiquement un sous-ensemble des valeurs
assignées à un vecteur x :
x <- c (1 ,4 ,10 ,3 ,1)
names ( x ) <- letters [1: length ( x )]
idx <- c (1 ,3 ,4)
g <- c (T ,F ,T ,T , F )
all ( x [ idx ] == x [ g ])
avec les caractéristiques suivantes :
.
▶
length(idx) ≤ length(x)
▶
length(g) = length(x)
idx
1
3
4
a
b
c
d
e
x
1
4
10
3
1
g
T
F
T
T
F
.
Propriétés des vecteurs
On peut connaître la taille d’un vecteur (length), son nombre d’éléments
uniques (unique), le type de ses éléments (class ou str).
On peut également nommer les éléments d’un vecteur :
x <- rnorm (100)
res <- c ( m = mean ( x ) , s = sd ( x ))
On peut les “assembler” ou effectuer des opérations d’algèbre linéaire :
y <- rnorm (100)
rbind (x , y )
cbind (x , y )
t ( x ) % * % x * 1 / ( length ( x ) -1)
c(ol)bind(ing)
r(ow)bind(ing)
1
2
.
4
7
10
1
3
5
1
3
1
2
4
7
10
1
3
5
1
3
.
Générer des vecteurs
En dehors de l’opérateur c, on peut utiliser les commandes pré-définies dans
R:
1:5
seq (1 , 5)
rep ( c (1 ,3) , 5)
rep ( c (1 ,3) , each =5)
# rep ( c (1 ,3) , c (5 ,5))
Comme on l’a vu, l’indexation d’un vecteur repose sur… un vecteur :
x <- c (0 ,1 ,1 ,0 ,1 ,0 ,1 ,0 ,0)
x [3]
x [ length ( x )]
x [2:4]
x [ c (2 ,4)]
seq (1 , 10)[ seq (1 , 10 , by =2)]
seq (1 , 10)[ seq (2 , 10 , by =2)]
.
# nombres impairs
# nombres pairs
.
Opérer sur des vecteurs
On peut également effectuer des opérations de tri sur un vecteur :
x <- 1:10
xs <- sample ( x )
sort ( xs , decreasing = TRUE )
order ( xs )
ou obtenir le rang de ses élements
rank ( rev ( xs ))
rank ( sample ( LETTERS ))
x
1
2
3
4
5
6
7
8
9
10
xs
1
4
8
5
2
6
10
9
3
7
sorting
10
9
8
7
6
5
4
3
2
1
ordering
1
5
9
2
4
6
10
3
8
7
ranking
7
3
9
10
6
2
5
8
4
1
Attention au traitement des “ex-æquo” ; la commande
rank ( c (1 ,3 ,5 ,5 ,2))
renvoit le vecteur 1 3 4.5 4.5 2, alors que
rank ( c (1 ,3 ,5 ,5 ,2) , ties.method = " first " )
retourne 1 3 4 5 2.
.
.
Valeurs manquantes
Les valeurs manquantes sont représentées par NA, quel que soit le type des
variables.
x <- 1:10
sum ( x )
Certaines fonctions exigent de préciser ce que l’on doit faire en présence de
valeurs manquantes.
x [ c (1 ,3)] <- NA # ou is.na ( x [ c (1 ,3)]) <- TRUE
sum ( x )
sum (x , na.rm = TRUE )
is.na ( x )
sum ( is.na ( x ))
D’autres non :
summary ( x )
.
.
Les matrices
Une matrice est une structure composée de vecteurs de même taille et de
même type.
x1 <- sample (1:100 , 10)
x2 <- sample (1:100 , 10)
x <- cbind ( x1 , x2 )
x [ , " x1 " ]
.
x
x1
x2
On peut créer explicitement des matrices comme suit :
53
36
x <- matrix ( sample (1:100 , 10) , ncol =2)
colnames ( x ) <- paste ( " x " , 1:2 , sep = " " )
dim ( x )
ncol ( x ) # ou nrow ( x )
x [ ,1]
# id. à x [ ," x1 "]
x [1:3 ,]
head ( x )
str ( x )
21
16
49
85
34
81
73
45
.
Opérations sur les matrices
L’adressage des éléments d’une matrice, ou l’assignation de valeurs, suit le
même principe que pour les vecteurs, sauf que l’on a deux indices (ligne et
colonne).
x <- matrix (1:10 , nrow =2 , byrow = TRUE )
x [1 ,2]
Lorsque l’on souhaite effectuer le même type d’opération sur les colonnes
(ou les lignes) d’une matrice, au lieu d’une boucle
for ( j in 1: ncol ( x ))
print ( mean ( x [ , j ]))
on peut utiliser la fonction apply :
apply (x , 2 , mean )
# ou colMeans ( x ) , plus efficace
L’argument ... (special variable length argument) permet de passer des arguments supplémentaires lors de l’appel à une fonction, p.ex. :
apply (x , 2 , mean , na.rm = TRUE )
.
.
Les facteurs
Un facteur permet d’effectuer une partition des unités statistiques : variable
catégorielle à valeurs discrètes (niveaux, modalités, strates).
La commande
factor (x , levels = , labels = , ordered =)
convertit x en une variable R de type factor.
Comme dans le cas des matrices, il existe des fonctions spéciales qui permettent d’opérer selon les niveaux d’un facteur :
y <- sample (1:100 , 20)
x <- factor ( rep ( c ( " a " ," b " ) , 10))
tapply (y , x , mean )
by (y , x , mean )
On peut tabuler un facteur, comme n’importe quelle collection d’unités discrètes :
table ( x )
.
.
Accéder aux informations d’un facteur
Un facteur reste un vecteur :
x <- factor ( rep ( c ( " t1 " ," t2 " ," t3 " ) , each =10) ,
ordered = TRUE )
x [ c (1 ,3)]
avec des attributs supplémentaires qui peuvent être interrogés à l’aide de
fonctions spécifiques :
levels ( x )
nlevels ( x )
is.factor ( x )
summary ( x )
# unique ( x )
# length ( unique ( x ))
# id. à table ( x )
R ne fait pas de distinction lexicale entre niveaux (variable ordinale) et modalités (variable nominale), mais l’argument ordered= permet d’imposer une
relation d’ordre sur les modalités du facteur.
.
.
Créer des facteurs
Au lieu de factor, on peut utiliser gl ou utiliser/créer un vecteur et le convertir en factor.
x <- rep ( letters [1:3] , each =10)
x <- as.factor ( x )
# ou de manière équivalente
gl (3 , 10 , labels = letters [1:3])
Les commandes interaction et expand.grid sont également utiles pour
générer des combinaisons de niveaux de facteurs (“traitements”).
Attention à ne pas confondre labels= et levels= :
factor ( rep (1:2 , 2) , labels =2:1)
factor ( rep (1:2 , 2) , labels =2:1 , levels =2:1)
.
.
Modifier un facteur
On peut vouloir
▶ changer l’ordre des niveaux (p.ex., catégorie de référence pour une
régression),
▶ supprimer un niveau ou regrouper des niveaux (p.ex., équilibrer les
effectifs entre niveaux).
Exemple :
x <- gl (4 , 5 , 100)
relevel (x , ref =4)
levels ( x ) <- 4:1
levels ( x )[1:2] <- " 3 .5 "
Cela ne change en aucun cas le rang des éléments de x, seulement la modalité qui leur est associée.
.
.
Les erreurs fréquentes
En interne, les facteurs sont stockés sous forme numérique mais on leur
associe des étiquettes (labels) :
as.numeric ( x )
Les “niveaux” d’un facteur sont classés par ordre lexicographique, et la conversion d’un facteur en nombre peut être délicate parfois.
as.numeric ( f <- factor (1:2 , levels =2:1)[1])
as.numeric ( levels ( f ))[ f ]
Il paut penser à garder en correspondance les niveaux observés et observables lorsque l’on souhaite modifier un facteur :
a <- gl (4 , 5 , 100)
b <- a [ a ! = 1]
all ( levels ( a ) == levels ( b ))
d <- droplevels ( a [ a ! = 1])
.
Il est recommendé de toujours vérifier que R code bien les données telles
qu’on se les représente !
.
Structure de données avancée
Le data.frame est l’objet de base pour gérer des données de type variable
(numeric, factor, etc.). Un data.frame est une collection de vecteurs de
même taille, mais de type possiblement variable.
score <- c (1 ,5 ,3 ,1 ,5 ,2 ,2)
x1 <- c ( " M " ," M " ," F " ," F " ," F " ," F " ," M " )
x2 <- c (92 ,96 ,97 ,93 ,101 ,100 ,97)
x3 <- c ( " C " ," A " ," C " ," C " ," C " ," B " ," B " )
a <- data.frame ( score , gender = x1 ,
IQ = x2 , SES = x3 )
dim ( a )
summary ( a )
str ( a )
as.matrix ( a )
.
a
score
gender
IQ
SES
1
M
92
C
5
M
96
A
3
F
97
C
1
F
93
C
5
F
101
C
2
F
100
B
2
M
97
B
.
Adresser les éléments d’un data.frame
Même principe d’adressage que pour de simple vecteurs ou des matrices,
mais on peut accéder aux colonnes nommées avec l’opérateur $ :
a [ ,1:2]
a [1:3 , c (2 ,4)]
a $ score [1:3]
a $ score [ a $ gender == " M " ]
with (a , score [ gender == " M " ])
# ou de manière équivalente
subset (a , gender == " M " )
a $ score [ a $ SES % in % c ( " A " ," C " )]
a
score
gender
IQ
SES
1
M
92
C
5
M
96
A
3
F
97
C
1
F
93
C
5
F
101
C
2
F
100
B
2
M
97
B
Les commandes with ou subset, comme beaucoup de commandes R, acceptent comme argument un data.frame ce qui simplifie l’accès aux variables contenues dans celui-ci. On peut également utiliser attach pour créer
une copie dans l’espace de travail, mais ce n’est pas conseillé.
.
.
Propriétés d’un data.frame
Certaines commandes R traitent les data.frame de manière spéciale. Comme
pour les matrices, on peut utiliser :
summary ( a )
str ( a )
dim ( a )
colnames ( a )
On peut ajouter des colonnes ou des lignes à un data.frame, comme dans
le cas des matrices, p.ex.
cbind (a , 1:7)
mais
rbind (a , c (3 , " M " , 100 , " C " ))
ne produira pas le résultat escompté. Pourquoi ?
.
.
Opérations sur un data.frame
À ce stade, gender n’est pas considéré comme un facteur :
is.factor ( gender )
mais il a été converti en facteur lors de la création du data.frame (cf.
getOption("stringsAsFactors")):
is.factor ( a $ gender )
On peut convertir ou recoder les variables contenues dans a en facteurs
comme suit :
within (a , SES <- factor ( SES , labels = c ( " low " ," mid " ," high " )))
Plus généralement,
within ( data , expr , ... )
permet d’opérer sur les variables d’un data.frame et de rendre ces modifications permanentes, contrairement à with qui ne sert qu’à accéder aux
composantes du data.frame (principe d’accès en “lecture seule”).
.
.
Importer des données externes
blood.txt, cereal.csv
Les fonctions read.table et read.csv permettent d’importer des données
tabulées ou csv (séparateur de champs virgule ou point-virgule).
Exemple :
blood <- read.table ( " blood.txt " , header = TRUE )
cereal <- read.csv ( " cereal.csv " )
Bien vérifier le chemin d’accès au fichier (ou utiliser set.wd), la présence
d’une ligne d’en-tête (header), le type de séparateur de champs (sep), ainsi
que le codage des valeurs manquantes (na.strings).
Un data.frame est créé automatiquement lorsque l’on importe des données externes, p.ex. un fichier csv.
.
.
Ce qu’il faut retenir
▶ L’élément de base est le vecteur. Un vecteur a une taille définie et est
constitué d’éléments du même type (nombre, caractères, etc.).
▶ Des structures plus complexes, comme les
matrix ou les
data.frame, sont constituées de vecteurs.
▶ On peut effectuer des opérations élémentaires d’indexation et de
sélection sur ce type de structures de données.
▶ Les facteurs jouent un rôle particuliers en statistiques, et ils sont
représentées sous forme d’une association nombre/étiquette sous R.
▶ L’importation de données externes, souvent sous forme de fichiers
plats, résulte en un data.frame.
.
.
Index
all, 11, 22
apply, 17
as.factor, 20
as.matrix, 23
as.numeric, 22
attach, 24
by, 13, 18
byrow, 17
c, 8–15, 18, 19, 23–26
cbind, 12, 16, 25
character, 8
class, 12
colnames, 16, 25
data.frame, 3, 23–28
decreasing, 14
dim, 16, 23, 25
droplevels, 22
each, 13, 19, 20
expand.grid, 20
factor, 18–20, 22, 23,
26
.
for, 17
getOption, 26
gl, 20–22
head, 16
header, 27
help, 6
help.search, 6
in, 17, 24
interaction, 20
is.factor, 19, 26
is.na, 15
labels, 18, 20, 22, 26
length, 10–13
LETTERS, 14
letters, 11, 20
levels, 18–22
lm, 4
logical, 8
matrix, 16, 17, 28
mean, 12, 17, 18
na.rm, 15, 17
na.strings, 27
names, 9, 11
ncol, 16, 17
nlevels, 19
nrow, 17
numeric, 8, 23
order, 14
ordered, 18, 19
package, 6
paste, 16
print, 17
rank, 14
rbind, 12, 25
read.csv, 27
read.table, 27
relevel, 21
rep, 13, 18–20
replace, 10
rev, 14
rnorm, 4, 8, 12
runif, 4
sample, 10, 14, 16, 18
sd, 12
sep, 16, 27
seq, 13
set.wd, 27
sort, 14
str, 12, 16, 23, 25
subset, 24
sum, 15
summary, 4, 15, 19, 23,
25
t, 12
table, 18
tapply, 18
ties.method, 14
unique, 12
which, 10
with, 24, 26
within, 26
.
Bibliographie
Becker, R. A., & Chambers, J. M. (1981). S: A Language and System for Data Analysis.
Becker, R. A., & Chambers, J. M. (1984). S: An Interactive Environment for Data Analysis
and Graphics. Wadsworth.
Burns, P. (2011, April). The R Inferno. Retrieved from http://www.burns-stat.com
Dalgaard, P. D. (2006). Introductory Statistics with R. Springer.
Falissard, B. (2005). Comprendre et utiliser les statistiques dans les sciences de la vie.
Masson.
Ihaka, R., & Gentleman, R. (1996). R: A language for data analysis and graphics.
Journal of Computational and Graphical Statistics, 5, 299–314.
Logan, M. (2010). Biostatistical Design and Analysis using R. Wiley.
Paradis, E. (2005, Septembre). R pour les débutants. Retrieved from http://cran.rproject.org
Venables, W. N., & Ripley, B. D. (2002). Modern Applied Statistics with S. Springer.
.

Documents pareils