R est un logiciel pour l’analyse statistique. C’est un logiciel libre ; il est disponible gratuitement et tourne sur différent système (PC Linux, PC Windows, Mac). Vous pouvez le télécharger ici : http://cran.r-project.org/ si vous voulez l’installer chez vous.
Pour démarrer R sous Windows ou Mac, double-cliquez sur l’icône correspondante. Pour démarrer R sous Linux, double-cliquez sur l’icône du terminal (icône avec un petit écran noir), puis dans la fenêtre qui s’affiche tapez “R” et validez.
Utilisez RStudio de préférence.
Le signe “>” en début de ligne est “l’invite de commande” de R : le programme vous demande d’entrer une commande.
La commande suivante (à taper au clavier ; le “>” est l’invite de commande et ne doit pas être tapé) quitte R :
> q()
Dans R, tout ce qui suit le caractère # (= dièse) est un commentaire et n’est pas pris en compte par R :
> # Ceci est du baratin qui n’est pas pris en compte par R !
R étant prévu pour faire des calculs statistiques, il ne manipule que des tableaux de données. Ces tableaux sont stockés dans des variables, ce qui permet de leur donner un nom. Le nom des variables doit commencer par une lettre et peut contenir des lettres, des chiffres, des points et des caractères de soulignement (_), mais surtout pas d’espace.
L’opérateur = est utilisé pour donner une valeur à une variable ; il peut se lire “prend la valeur de” (NB : on trouve aussi l’opérateur <- (“flèche”) qui a exactement la même signification).
> age = 28
Pour afficher la valeur de la variable âge, il suffit de taper le nom de la variable :
> age
[1] 28
la variable “age” est ici un tableau avec une seule case, qui contient le chiffre 28. Le 1 entre crochet indique qu’il s’agit de la case n°1. R numérote les cases des tableaux en commençant à 1.
R peut manipuler des nombres entiers, des flottants (= nombres à virgule), des chaînes de caractère et des booléens (valeur vraie ou fausse) :
> age = 28 # Entier
> poids = 64.5 # Flottant
> nom = "Ngo bo" # Chaîne de caractère
> enseignant = TRUE # booléen
> etudiant = FALSE # booléen
> telephone = "01 48 38 73 34" # Chaîne de caractère !
Enfin, la valeur spéciale NA (non available) est utilisée lorsqu’une donnée est manquante.
Un vecteur est un tableau à une dimension. Toutes les cases du vecteur doivent contenir des données du même type (des entiers, des chaînes de caractère,...). La fonction c() permet de créer un vecteur :
> ages = c(28, 25, 23, 24, 26, 23, 21, 22, 24, 29, 24, 26, 31, 28, 27, 24, 23, 25, 27, 25,
24, 21, 24, 23, 25, 31, 28, 27, 24, 23)
> ages
[1] 28 25 23 24 26 23 21 22 24 29 24 26 31 28 27 24 23 25 27 25 24 21 24 23 25
[26] 31 28 27 24 23
“[1]” indique que ce qui suit est la première valeur du vecteur, et “[26]” que la deuxième ligne commence à la 26ème valeur ; “[1]” et “[26]” ne sont pas des éléments du vecteur.
La fonction c() permet aussi de concaténer (= mettre bout à bout) des vecteurs :
> poids_groupe_temoin = c(75.0, 69.2, 75.4, 87.3)
> poids_groupe_intervention = c(70.5, 64.2, 76.4, 81.6)
> poids = c(poids_groupe_temoin, poids_groupe_intervention)
> poids
[1] 75.0 69.2 75.4 87.3 70.5 64.2 76.4 81.6
Il est possible d’accéder à un élément du vecteur avec des crochets. Par exemple pour accéder au second élément du vecteur poids :
> poids[2]
[1] 69.2
Il est aussi possible d’accéder à l’ensemble des poids répondant à une condition, par exemple l’ensemble des poids supérieurs à 70.0 :
> poids[poids > 70.0]
[1] 75.0 75.4 87.3 70.5 76.4 81.6
Enfin, la fonction length() permet de récupérer le nombre d’éléments d’un tableau :
> length(poids)
[1] 8
> length(poids[poids > 70.0])
[1] 6
Il est possible de créer un vecteur contenant une suite de nombres entiers avec la fonction seq :
> seq(1, 10)
[1] 1 2 3 4 5 6 7 8 9 10
> seq(1, 10, by = 0.5)
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0
[16] 8.5 9.0 9.5 10.0
Une matrice est un tableau à deux dimensions, c’est à dire avec des lignes et des colonnes. Comme pour les vecteurs, toutes les cases d’une matrice doivent contenir des données du même type.
Une matrice est créée à partir d’un vecteur contenant les valeurs, et d’un nombre de ligne (nr, pour Number of Row) et de colonne (nc, pour Number of Column) :
> ma_matrice = matrix(c(1.5, 2.1, 3.2, 1.6, 1.4, 1.5),nr=3, nc=2)
> ma_matrice
[,1] [,2]
[1,] 1.5 1.6
[2,] 2.1 1.4
[3,] 3.2 1.5
Les éléments de la matrice peuvent être accédé en donnant entre crochets le numéro de la ligne puis celui de la colonne :
> ma_matrice[1, 1]
[1] 1.5
Il est aussi possible de récupérer une ligne ou une colonne entière, en omettant le numéro correspondant :
> ma_matrice[1,]
[1] 1.5 1.6
Une liste est un tableau à une dimension, qui peut contenir des données de différents types (contrairement au vecteur).
> ma_liste = list("JB", 28)
Un tableau de donnée est un tableau où chaque colonne correspond à un attribut différents (âge, taille, poids par exemple) et chaque ligne à un individu différent. Il est possible de créer des tableaux de données dans R, cependant il est beaucoup plus facile de les charger à partir d’un fichier. On utilise pour cela la fonction read.table(). Voici le fichier taille_poids.csv :
nom,taille,poids
Ngo bo,1.70,64.0
Bo bo,1.80,63.0
M. X,1.67,70.5
M. Y,1.69,95.0
M. Z,1.75,NA
Ce fichier peut être chargé ainsi dans R :
t = read.table("taille_poids.csv", sep=",", header=TRUE)
sep="," indique que dans le fichiers les différentes colonnes sont séparées par des virgules, et header=TRUE indique que la première ligne du fichier contient les noms des colonnes. Ces valeurs correspondent aux fichiers CSV (Comma-Separated Value file : fichier dont les valeurs sont séparées par des virgules) qui peuvent être généré facilement, par exemple en exportant depuis un tableur comme OpenOffice ou Excel.
> t
nom taille poids
1 Ngo bo 1.70 64.0
2 Bo bo 1.80 63.0
3 M. X 1.67 70.5
4 M. Y 1.69 95.0
5 M. Z 1.75 NA
Les noms des colonnes sont disponibles via la fonction names() :
> names(t)
[1] "nom" "taille" "poids"
Comme pour les matrices, il est possible d’accéder aux cases, lignes et colonnes d’un tableau. Les noms des colonnes peuvent être utilisés à la place de leurs index :
> t[1, 2] # Première ligne, deuxième colonne : taille du premier individu
[1] 1.7
> t[1, "taille"] # Première ligne, colonne taille : pareil
[1] 1.7
> t[1,] # Première ligne
nom taille poids IMC
1 NgoBaoCho 1.7 64 22.14533
> t[,"taille"] # Colonne taille
[1] 1.70 1.80 1.67 1.69 1.75
> t$taille # Notation raccourci pour la colonne taille
[1] 1.70 1.80 1.67 1.69 1.75
Il est aussi possible d’indexer avec une condition : par exemple, pour obtenir un tableau avec seulement les individus dont la taille est supérieure à 1m70 (ne pas oublier la virgule, qui sert à indiquer que l’on veut récupérer toutes les colonnes !) :
> t[t$taille > 1.7,]
nom taille poids IMC
2 NgoBaoCho 1.80 63 19.44444
5 M. Z 1.75 NA NA
Enfin, la fonction write.table() permet d’enregistrer un tableau de donnée (row.names = FALSE permet de désactivé les numéros de ligne) :
write.table(t, "taille_poids_2.csv", sep = ",", row.names = FALSE)
Ce fichier pourra ensuite être rechargé avec read.table() comme ci-dessus.
R permet de réaliser la plupart des opérations courantes à l’aide des opérateurs suivants : + (addition), - (soustraction), * (multiplication), / (division), ^ (puissance).
> 2 * 3 + 1
[1] 7
Les opérations sont réalisées sur chaque élément des tableaux. Par exemple, pour calculer l’Indice de Masse Corporelle (IMC) sur chaque individu du tableau de donnée chargé précédemment, en appliquant la formule IMC = :
> t$poids / (t$taille ^ 2)
[1] 22.14533 19.44444 25.27878 33.26214 NA
R a calculé l’IMC pour chacun des 5 individus ! Notez que la donnée manquante (NA) se “propage”, ce qui est logique : si le poids de M. Z est manquant, il n’est pas possible de calculer son IMC, qui est donc manquant lui aussi.
Il est possible d’ajouter une quatrième colonne avec l’IMC à notre tableau de la manière suivante :
> t$IMC = t$poids / (t$taille ^ 2)
> t
nom taille poids IMC
1 NgoBaocho 1.70 64.0 22.14533
2 NgoBaoCho 1.80 63.0 19.44444
3 M. X 1.67 70.5 25.27878
4 M. Y 1.69 95.0 33.26214
5 M. Z 1.75 NA NA
Les comparaisons se font avec les opérateurs <, >, <= (inférieur ou égal) , >= (suppérieur ou égal), == (égal), != (différent de). Ils retournent une (ou plusieurs) valeur(s) booléenne(s).
> 1 < 3
[1] TRUE
> t$IMC > 25
[1] FALSE FALSE TRUE TRUE NA
Il est possible de combiner plusieurs comparaisons avec des & (et) ou des | (ou).
R définit un grand nombre de fonctions ; nous en avons déjà vu quelques unes. La fonction help() permet d’obtenir de l’aide sur une fonction :
help(mean)
Voici une liste des principales fonctions :
Nous avons vu que les valeurs NA se propagent. Cela est parfois gênant, par exemple lorsque l’on calcule une moyenne :
> mean(t$poids)
[1] NA
Dans ce cas, il faut demander à R de ne pas tenir compte des valeurs NA pour ce calcul :
> mean(t$poids, na.rm = TRUE)
[1] 73.125
Nous allons étudier une base de prescription, afin d’étudier l’inertie thérapeutique dans l’hypertension. L’inertie thérapeutique correspond à la situation où le traitement anti-hypertenseur actuel du patient est insuffisant, et où le médecin ne modifie pas ce traitement.
> t = merge(d, nd, all=TRUE)
Pour afficher une boîte à moustache simple :
> boxplot(variable_numérique)
Lorsque l’on a plusieurs variables INDÉPENDANTES, il est possible de placer plusieurs boîtes à moustaches les unes à côté des autres, en séparant les variables par des virgules :
> boxplot(variable1_numérique, variable2_numérique, variable3_numérique,...)
C’est une représentation plus classique et très utile ; on l’obtient avec :
> hist(variable_numérique)
Par défaut R applique la loi de Sturges (cf cours) pour déterminer le nombre de barres ; il est possible de préciser le nombre de barres manuellement (ici, 3), ou bien les valeurs auquelles auront lieu les coupures :
> hist(variable_numérique, breaks = 3)
> hist(variable_numérique, breaks = c(0.0, 0.2, 0.5, 0.6, 1.0))
Un camembert se fait avec la commande pie :
> pie(variable_numérique)
Pour faire un camembert à partir d’une donnée qualitative, il faut d’a bord stratifier celle-ci avec la commande summary :
> pie(summary(factor(variable_qualitative)))
Il est fréquent d’étudier une variable en fonction d’une (ou plusieurs) autres variables : par exemple la réponse biologique d’un organisme à une substance en fonction de la dose de substance,...
Pour afficher une boîte à moustache de la variable 1 pour chaque valeur possible de la variable 2 (la variable 1 est numérique et la variable 2 est qualitative) :
> boxplot(variable1_numérique ~ variable2_qualitative)
La première variable est placée en X, la seconde en Y. Il est possible d’utiliser des variables numériques ou qualitatives, cependant ce type de graphique est surtout utile avec des variables qualitatives.
> plot(variable_numerique1, variable_numerique2)
Un diagramme en “barre cumulée” permet d’étudier 2 variables qualitatives :
> plot(factor(variable_qualitative1), factor(variable_qualitative2))
Pour afficher une boîte à moustache sur trois variables (ou plus) : ici on affiche une boîte à moustache pour la variable 1 pour chaque combinaison des variables 2 et 3 :
> boxplot(variable1_numerique ~ (variable2_qualitative + variable3_qualitative))
> boxplot(variable1_numerique ~ (variable2_qualitative + variable3_qualitative), horizontal = TRUE, las = 2)
Avant d’utiliser ce type de graphique, il faut importer le module d’extention “lattice” (il suffit de le faire une seule fois) :
> require(lattice)
Les graphiques de niveau permettent d’étudier une variable numérique en fonction de deux variables qualitatives :
> levelplot(variable_numérique1 ~ variable_qualitative2 * variable_qualitative3)
Chaque “case” du graphique obtenue correspond à une valeur de la variable 2 et une valeur de la variable 3 ; la couleur de la case indique la valeur moyenne de la variable 1.
Avant d’utiliser ce type de graphique, il faut importer le module d’extention “lattice” (il suffit de le faire une seule fois) :
> require(lattice)
Les nuages de point en 3D permettent d’étudier le comportement de 3 variables numériques simultanément :
> cloud(variable_numérique1 ~ variable_numérique2 * variable_numérique3)
Il existe de nombreuses options pour mettre en forme les grahiques. En voici quelques-unes :
D’autres options sont disponibles ; pour les obtenir, consultez l’aide, par exemple pour les histogrammes :
> help(hist)
Pour comparer 2 moyennes observées sur des échantillons (ou sous-échantillons) différents, on utilise le test de Welch Student :
> t.test(variable1_numerique, variable2_numerique)
Dans ce cas, on distingue en général deux groupes d’invidus : un groupe “témoin” et un groupe “expérimental”, et l’on souhaite comparer la valeur moyenne d’une variable entre ces deux groupes.
Pour comparer de deux moyennes observées sur un même échantillon, les valeurs étant appariées 2 à 2, on utilise le test T de student apparié :
> t.test(variable1_numerique, variable2_numerique, paired = TRUE)
Dans ce cas, les deux variables doivent avoir le même nombre de valeurs, chaque paire (1ère valeur de la variable 1, 1ère valeur de la variable 2), (2ème valeur de la variable 1, 2ème valeur de la variable 2),... correspondant à un seul individu. C’est notamment le cas des études du type “avant - après”.
Pour comparer une moyenne observée dans un échantillon à une moyenne théorique, on utilise le test T de student :
> t.test(variable_numerique, mu = moyenne_theorique)
La fonction cor() permet de calculer le coefficient de corrélation linéaire :
> cor(variable1_numérique, variable2_numérique)
Ce coefficient indique si les deux variables sont liées de manière linéaire. Une valeur de 0 indique une absence de liaison, une valeur de 1 ou de -1 indique une linéarité parfaite.
En cas de relation linéaire, la fonction lm() permet d’effectuer une régression linéaire :
> lm(variable1_numérique ~ variable2_numérique)
Call :
lm(formula = variable1_numérique ~ variable2_numérique)
Coefficients :
(Intercept) variable2_numérique
Y0 pente
# pente est la pente de la droite
# Y0 est son ordonnée à l’origine
La variable passée en premier à la fonction lm() doit être la variable dont on cherche à expliquer les variations, à partir de la seconde variable.
Afin de tester la toxicité d’une variété de maïs OGM, 3 groupes de 10 rats a été nourri avec ce maïs. Le maïs OGM représentait 11% de la ration alimentaire dans le premier groupe, 22% dans le second, et 33% dand le troisième. Un quatrième groupe témoin de 60 rats a été nourri avec du maïs non-OGM. Après 90 jours, on mesure le poids du foie de chaque rat.
[Gilles-Eric Séralini et al., New analysis of a rat feeding study with a genetically modified maize reveals signs of hepatorenal toxicity, 2007, Archives of Environmental Contamination and Toxicology, version française :
http ://www.criigen.org/full_article.pdf]