Introduction - e-agrocampus
Transcription
Introduction - e-agrocampus
TABLE DES MATIÈRES TABLE DES MATIÈRES Introduction Eléments de R Besnik Pumo - Pierre Santagostini décembre 2013 R, Fenêtre de commandes, Les scripts R, Les graphiques avec R, Les objets, Condition et boucle, Quelques traitements statistiques. Espace de cours : http://tice.agrocampus-ouest.fr/course/, sous-catégorie ETIC Statistique : Logiciels : Informations sur R et autres logiciels statistiques. Les données : rubrique R. Fonctions INHP : Pour faciliter l'utilisation de R par les étudiants, nous avons créé une interface graphique. Pour des informations sur la manière de charger cette interface, ainsi qu'une aide à son utilisation, voir la rubrique R. Pour poursuivre l'apprentissage de R, voir P.A. Cornillon et autres, Statistiques avec R" (disponible à la Bibliothèque Générale d'Agrocampus-Ouest, centre d'Angers). Table des matières 1 2 3 Premiers pas 2 1.1 Fenêtre principale de R. La fenêtre des commandes . . . . . . . . . . . . . . . 2 1.2 L'interface Rcmdr - Importation de données . . . . . . . . . . . . . . . . . . . 3 1.3 Fonctions INHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Le langage R vector, matrix, data.frame 8 2.1 Les objets : . . . . . . . . . . . . . . . . . . . . . 8 2.2 Quelques éléments de programmation . . . . . . . . . . . . . . . . . . . . . . . 12 Quelques traitements statistiques 15 3.1 Résumés numériques et graphiques simples avec R . . . . . . . . . . . . . . . . 15 3.2 La régression linéaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.3 ANOVA à un facteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.4 ANOVA à deux facteurs - modèle additif . . . . . . . . . . . . . . . . . . . . . 20 3.5 ANOVA à deux facteurs - modèle avec interaction . . . . . . . . . . . . . . . . 23 3.6 Tests non paramétriques 25 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Index des fonctions R utilisées 29 1 1 1 PREMIERS PAS Premiers pas 1.1 1.1.1 Fenêtre principale de R. La fenêtre des commandes Eléments de R : La console, Présentation générale de R Figure 1 La console de R Quelques caractéristiques du logiciel R : Avantages : Logiciel libre (Windows, Linux, Unix) Ouvert : packages, à d'autres logiciels (SIG par exemple) Très utilisé en particulier dans les secteurs de recherche-développement Inconvénients : Un eort est nécessaire pour l'apprentissage Ouvert et donc vérier les packages utilisés 1.1.2 a. Dénir le répertoire courant. Sauvegarder l'espace de travail A chaque début de séance R, dénir le répertoire de travail : File → Change dir... R va alors créer tous les objets de la session dans ce dossier. b. On peut sauvegarder l'environnement de travail (contenant les objets, fonctions, résulats des analyses réalisées...) avec : File → Save Workspace... Et on peut sauvegarder l'historique des commandes avec : File → Save History... Choisir comme répertoire de travail, un dossier accessible à partir de toutes les salles informatiques de l'école. 2 1.2 L'interface Rcmdr - Importation de données 1.1.3 1 PREMIERS PAS Premiers calculs avec R ; la fenêtre de commande Taper dans la console les commandes suivantes. Elles s'exécutent alors immédiatement. > > > > prix <- 1.5 quantite <- 21 cout <- prix*quantite print(cout) N.B. 1.2 1.2.1 > est l'invite de commande. L'interface Rcmdr - Importation de données R-Commander Le package Rcmdr fournit une interface graphique. Figure 2 Rcmdr On l'ouvre en tapant la commande suivante dans la console : > library(Rcmdr) Cette interface permet d'eectuer certains traitements statistiques, via des menus. Elle donne aussi la possibilité d'importer des données, par exemple à partir de chiers Excel ou texte (avec la console de R, on ne peut importer de données qu'à partir de chiers texte). Elle permet encore de taper et d'exécuter des commandes grâce à la Fenêtre de script. 3 1.2 L'interface Rcmdr - Importation de données 1.2.2 1 PREMIERS PAS La fenêtre de script On peut taper les commandes dans la Fenêtre de script, et les exécuter dans la Fenêtre de sortie. Reprendre par exemple les lignes de code du 1.1.3. Les taper dans la Fenêtre de script. Pour exécuter ces commandes : sélectionner les lignes à exécuter → clic droit → Soumettre Les commandes ainsi tapées dans la fenêtre de script pourront ainsi être exécutées de nouveau, modiées, ou eacées. Pour sauvegarder ce script, cliquer dans : Fichier → Sauver le script sous... Enregistrer le chier, par exemple, sous le nom exo1.R. Dans l'explorateur de données, ouvrir le répertoire où la saisie a été faite. Le chier exo1.R y a été créé. 1.2.3 Importer des données a. Avec Rcmdr, il est possible d'importer des données à partir d'un chier texte ou Excel. A partir d'un chier texte : Importer les données (pucerons.csv) présentant quatre variables (taille, longevite, fecondite, strate) : Données → Importer des données → depuis un fichier texte, le presse-papier ou un lien URL... Donner au jeu de données créé le nom pucerons (attention à bien préciser le séparateur de champ). Visualiser le jeu de données qu'on vient d'importer : cliquer sur 4 Editer. 1.2 L'interface Rcmdr - Importation de données 1 PREMIERS PAS Figure 3 Rcmdr - Importation de données à partir d'un chier texte A partir d'un chier Excel : Importer les données (arbre.xls) présentant deux variables (Diamètre, Hauteur des arbres) : Données → Importer des données → depuis Excel, Access ou dBase... Nommer cet objet arbres. Un data.frame arbres sera créé. Ce data frame a pour colonne respectivement : 1 = Nr. d'arbre, 2=Diamètre (X), 3=Hauteur des arbres. Visualiser le jeu de données qu'on vient d'importer : cliquer sur Créer les variables X =Diamètre > Nr <- arbres[, 1] > X <- arbres[, 2] > Y <- arbres[, 3] OU et Y Hauteur des arbres : > Nr <- arbres$Nr > X <- arbres$Diametre > Y <- arbres$Hauteur 5 Editer. 1.2 L'interface Rcmdr - Importation de données 1 PREMIERS PAS Figure 4 Rcmdr - Importation de données à partir d'un chier .xls 1.2.4 Traitements statistiques avec Rcmdr On peut réaliser un certain nombre de traitements statistiques et représentations graphiques avec Rcmdr. Voir notamment les menus Statistiques Résumés : statistiques descriptives, distributions de fréquences, données manquantes, coef- cients/tests de corrélation, test de normalité (Shapiro-Wilk) ; Tables de contingence ; Moyennes : test de Student, analyse de la variance ; Proportions : tests de proportions ; Variance : test de Fisher, test de Bartlett, test de Levene ; Tests non paramétriques : Wilcoxon, Kruskal-Wallis, Friedman ; Ajustement de modèles : régression, modèle linéaire, modèle linéaire Figure 5 Rcmdr - Statistiques Graphes 6 généralisé... 1.3 Fonctions INHP 1 PREMIERS PAS Figure 6 Rcmdr - Graphes 1.3 Fonctions INHP Dans les sections suivantes, vous verrez quelques rudiments du langage R, et vous allez apprendre comment eectuer des traitements statistiques (analyse descriptive, régression, analyse de la variance) avec R, en utilisant les lignes de commandes. Cependant, nous avons réalisé des programmes destinés aux étudiants de l'INHP, pour eectuer plus simplement (via des menus) ces traitements statistiques. Vous trouverez des informations (chargement, utilisation) sur http://tice.agrocampus-ouest.fr/ Cours : Statistique : Logiciels, Section : R, Sous-section : Fonctions INHP 7 2 2 LE LANGAGE R Le langage R : quelques éléments Dans la suite, on pourra taper dans les commandes directement dans la console de R, ou dans la fenêtre de script de Rcmdr. On préfèrera cette deuxième solution, qui permet de modier, corriger, eacer les commandes. Rappelons qu'on peut sauvegarder le script (Fichier → Sauver le script sous...). Remarques : - Attention à structurer le code (alignements) pour qu'il soit lisible. - Lorsqu'on programme en R, ajouter des commentaires (lignes commençant par (#) pour expliciter ce que fait le code. 2.1 2.1.1 vector, matrix, data.frame Les ob jets : Vecteur a. Créer un vecteur > > > > > a, l'acher, calculer la somme de ses éléments a <- c(1, 2, 4, 6, 8, 10, 12) print(a) a print(sum(a)) sum(a) print(a) permet d'acher le contenu de l'objet a. Remarque : Quand on travaille dans la console de R, on peut simplement taper le nom de l'objet qu'on souhaite acher : > a Rcmdr ou un autre éditeur de texte (Tinn-R ou ...), taper a n'achera pas le contenu de a lors de l'exécution d'un groupe de commandes ; Si on travaille avec l'éditeur de simplement il faut alors écrire : print(a) b. Accéder à un ou plusieurs éléments d'un vecteur : un élément : > a[3] # 3ème élément de a plusieurs éléments : > a[c(1,3,5)] # 1er, 3ème et 5ème éléments > a[1:3] # les trois 1ers éléments les éléments de > a[a > 5] a vériant une certaine condition : # les éléments strictement supérieurs à 5 les indices des éléments de > which(a > 5) a vériant cette condition : # indices des éléments strictement supérieurs à 5 8 2.1 Les ob jets : 2.1.2 vector, matrix, data.frame 2 LE LANGAGE R Matrice Un objet de classe matrix contient des éléments qui sont tous de même type (tous des chaînes de caractères, ou tous numériques, ou...). Créer une matrice à 3 lignes et 4 colonnes, calculer la somme de ses éléments : > > > > A <- matrix(c(0, 0.7, 0, 1, 0, 0.5, 4, 0, 0, 2, 1.3, 0), nrow=3, ncol=4, byrow=T) rownames(A) <- 1:3 colnames(A) <- c("a", "b", "c", "d") print(A) byrow = T signie que les éléments de la matrice sont rangés par ligne. Si byrow = F, ils sont rangés par colonne. > cat("somme de A = ", sum(A), "\n\n") On peut aussi faire des calculs par ligne ou par colonne : > apply(A, 1, sum) # sommes par ligne > apply(A, 2, sum) # sommes par colonne 2.1.3 Data frame (tableau de données) Sous R, un data.frame est un tableau de données. Chaque colonne de ce tableau est com- posée d'éléments qui doivent avoir le même type : numérique, chaînes de caractères, facteur (variable qualitative), logique... Les colonnes peuvent être de types diérents (contrairement à un objet de type matrix dont, comme on a vu ci-dessus, tous les éléments sont de même type). a. Créer un data frame dont les deux premières colonnes et la troisième > > > > x trt1 trt2 sont des facteurs, est une variable numérique : X <- data.frame(c("A","A","B","B"), c("a","b","c","d"), c(-2,3,0, 1)) rownames(X) <- 1:4 # noms de lignes colnames(X) <- c("trt1", "trt2", "x") # noms de colonnes print(X) b. Accéder à un/des éléments du data frame : On accède au ième élément de la jème colonne, en tapant > > > > > > > > et X[,3] X[,1:2] X$x X[2,] X[c(1,3),] X[2,3] X[1:2,3] X[1:2,"x"] # # # # # # # # X[i,j] (ligne i, colonne j) 3ème colonne les 2 premières colonnes la colonne x 2ème ligne 1ère et 3ème lignes 2ème élément de la 3ème colonne les 2 premiers éléments de la 3ème colonne idem c. Extraire les lignes du tableau pour lesquelles x est positif ou nul : > Y1 <- X[X$x >= 0, ] 9 2.1 Les ob jets : vector, matrix, data.frame 2 LE LANGAGE R Ou encore, si l'on veut extraire les lignes du tableau pour lesquelles x est compris entre -2 et 2 ; c'est à dire : (supérieur ou égal à -2) ET (inférieur ou égal à 2) : > Y2 <- X[(X$x >= -2)&(X$x <= 2), ] Les numéros des lignes vériant ces conditions sont données par : > which(X$x >= 0) > which((X$x >= -2)&(X$x <= 2)) d. Eliminer une ou plusieurs ligne(s) ou colonne(s) du data frame : > > > > > > X[,-3] X[-4,] X[-c(4,6,7),] X[-4,3] X[-(1:4),3] X[-(1:4),"x"] # # # # # # toutes les colonnes sauf la 3ème toutes les lignes sauf la 4ème toutes les lignes sauf les 4ème, 6ème et 7ème la 3ème colonne privée du 4ème élément la 3ème colonne privée de ses 4 premiers éléments idem e. Eliminer les lignes du tableau pour lesquelles x est inférieur à -1 ou supérieur à 2 : > Y3 <- X[-which((X$x < -1)|(X$x > 2)), ] > print(Y3) Opérateurs logiques ! "| On pourrait taper, de façon équivalente : > Y3 <- X[which((X$x >= -1)&(X$x <= 2)), ] ou encore : > Y3 <- X[(X$x >= -1)&(X$x <= 2), ] f. Accéder à l'ensemble des lignes pour lesquelles le premier traitement est "A" : > Y.A <- X[X$trt1 == "A", ] Ou à l'ensemble des lignes pour lesquelles le premier traitement est diérent de "A" : > Y.BC <- X[X$trt1 != "A", ] g. Ajouter une colonne y au data frame X : > X <- data.frame(X, y = 1:4) h. Ajouter une ligne au data frame X : > X <- rbind(X, c("A", "a", 0, 5)) i. Ajouter plusieurs lignes : > X.ajout <- data.frame(trt1=c("C","D"), trt2=c("e","f"), x=c(-1,1), y=c(6,7)) > X <- rbind(X, X.ajout) Attention : Les lignes à a jouter au data frame grâce à rbind() doivent alors être fournies sous forme d'un data frame, de même nombre de colonnes que colonnes que X. 10 X, ayant les mêmes noms de 2.1 Les ob jets : vector, matrix, data.frame Principaux opérateurs logiques : 2 ! x : négation de x & y : x et y x "| y : x ou y LE LANGAGE R x On trouvera plus d'informations sur les opérateurs logiques en tapant dans la console : ?Logic 2.1.4 Exercices Exercice 1 : a. Créer le data frame et la troisième 1 2 3 4 5 6 7 8 9 x X, dont les deux premières colonnes trt1 et trt2 sont des facteurs, est une variable numérique : trt1 trt2 x A a 0 A b -7 A c 12 B a 10 B b 2 B c -7 C a -14 C b 6 C c 28 L'acher dans la console. Y, contenant les 4e, 6e et 7e lignes de X. L'acher dans la console. un vecteur x1 avec la colonne X$x. Acher ses éléments positifs ou nuls. un data frame Z1 contenant les lignes de X pour lesquelles X$x est strictement b. Créer un data frame c. Créer d. Créer positif. e. Créer un data frame Z2 contenant les lignes de X pour lesquelles X$x Z3 contenant les lignes de X pour lesquelles le traitement est compris entre -7 et 7. f. Créer un data frame est "b". g. Ajouter au data frame X X$trt2 les trois lignes suivantes : trt1 trt2 x D a 2 D b -3 D c 5 iris iris : Exercice 2 : données a. Charger les données > data(iris) Pour visualiser les données : > edit(iris) # affiche le data.frame dans l'éditeur de données > summary(iris) # les résumés numériques ou table de fréquences par variable > dim(iris) # dimension du data.frame 11 2.2 Quelques éléments de programmation b. Visualiser les 10 premières lignes de 2 iris. iris_versicolor la variable Species. c. Créer un sous-jeu de données la modalité versicolor de contenant uniquement les données de iris5 contenant uniquement Sepal.Length est comprise entre 5 et 6. d. Créer un sous-jeu de données quelles la variable 2.2 2.2.1 LE LANGAGE R les observations pour les- Quelques éléments de programmation Opérateurs arithmétiques Reprenons le vecteur a du 2.1.1. a. Somme de deux vecteurs : > b <- c(1, 2, 3, 4, 5, 6, 7) > c <- a+b > print(c) b. Ajouter un élément à tous les termes : > d <- a+10 > print(d) c. Multiplier/diviser un vecteur numérique par une valeur numérique : > e <- 3*a > f <- a/2 d. Multiplier deux vecteurs numériques membre à membre : > g <- a*b e. Division entière : > print(a %/% 3) > print(a %% 3) f. Sur la matrice > > > > A (2.1.2) : 1 + A 2*A sqrt(A) A[1, ] + A[2, ] # somme des deux premières lignes g. Sur le data frame > > > > # (quotient) # (reste) X (2.1.4) : 1 + X$x 2*X$x sqrt(X$x) X[X$trt1 == "A", "x"] + X[X$trt1 == "B", "x"] h. Ajouter au data frame une nouvelle variable contenant l'exponentielle de 12 X$x : 2.2 Quelques éléments de programmation 2 LE LANGAGE R > X <- data.frame(X, exp.x = exp(X$x)) Pour quelques informations sur les opérateurs arithmétiques, voir la page d'aide en tapant dans la console de R : > ?Arithmetic Avec les 2.2.2 et 2.2.3, nous n'avons naturellement pas pour ambition de faire de vous des pros de la programmation R, mais de vous faire entrevoir que R est aussi un langage de programmation, qui permet d'implémenter ses propres méthodes. Vous trouverez plus d'informations sur le langage R dans Statistiques avec R". 2.2.2 a. Condition, boucle Condition : Ecrivez les lignes de code suivantes : > x <- rnorm(1, 0, 1) # (générer aléatoirement > # une valeur selon la loi normale centrée réduite) > if (x >= 0) cat(x, ">= 0\n") else cat(x, "< 0\n") La fonction b. cat() permet d'acher du texte dans la console. Boucle : Reprenons le vecteur a du 2.1.1. Deux manières de calculer la somme des éléments du vecteur La fonction sum() a : : > sum(a) Pour acher l'aide d'une fonction R : taper dans la console son nom précédé d'un point d'interrogation : > ?sum Une boucle avec R : > > + + > 2.2.3 s <- 0 for (i in 1:7) { s <- s+a[i] } print(s) Ecrire une fonction avec R R est aussi un langage de programmation qui permet, si vous en avez besoin, d'écrire vos propres fonctions. Voici l'exemple d'une fonction qui calcule la somme des éléments d'un vecteur : somme <- function(x) { # x : vecteur numérique s <- 0 13 2.2 Quelques éléments de programmation } 2 LE LANGAGE R for (i in 1:length(x)) s <- s+x[i] return(s) Créez un script, tapez le code ci-dessus, enregistrez, puis chargez le script. La fonction ainsi créée prend en argument un vecteur numérique (x), et retourne la somme (s) de ses éléments. Vous pouvez alors appliquer cette fonction au vecteur > s <- somme(a) > s 14 a du 2.1.1 3 3 QUELQUES TRAITEMENTS STATISTIQUES Quelques traitements statistiques Pour la suite : taper les commandes, et observer les résultats numériques ou représenta- tions graphiques obtenus. Remarque : Vous pouvez accéder à l'aide d'une fonction (utilisation, arguments, résultats...) en tapant dans la console de R le nom de cette fonction, précédé d'un point d'interrogation. Par exemple pour acher l'aide de la fonction mean() : > ?mean 3.1 Résumés numériques et graphiques simples avec R On reprend les données iris de l'exercice 2 p. 11. Les charger : > data(iris) et créer les vecteurs X = iris$Petal.Length, Y = iris$Petal.Width et Sp = iris$Species. On trouvera des informations sur ce jeu de données (de Fisher et Anderson) 1 dans la page d'aide : > ?iris 3.1.1 Quelques statistiques descriptives sur les données iris a. Résumés numériques : moyenne, variance, écart-type, quantiles (quartiles, déciles) ; la fonction > > > > > > > > summary. mean(X) # (moyenne) var(X) # (variance) sd(X) # (écart-type) quantile(X) # (quantiles - par défaut, quartiles) quantile(X,probs = seq(0,1,0.1)) # (déciles) # Pour avoir les principaux résumés numériques : summary(X) Vous pouvez appliquer les mêmes traitements à la variable Y. b. Calculs sur le jeu de données iris : statistiques par colonne du data frame. > apply(iris[, c(1,2)], 2, mean) # moyennes par variable > apply(iris[, c(1,2)], 2, sd) # écarts types par variable c. Statistiques par niveau du facteur. 1. This famous (Fisher's or Anderson's) iris data set gives the measurements in centimeters of the variables sepal length and width and petal length and width, respectively, for 50 owers from each of 3 species of iris. The species are Iris setosa, versicolor, and virginica. 15 3.1 Résumés numériques et graphiques3simples QUELQUES avec R TRAITEMENTS STATISTIQUES > tapply(X, Sp, mean) # moyennes par espèce > tapply(X, Sp, sd) # écarts types par espèce d. Analyse bidimensionnelle : covariance et coecient de corrélation. > cov(X,Y) > cor(X,Y) Matrice de covariances, matrice de corrélations : > cov(iris[, 1:4]) > cor(iris[, 1:4]) 3.1.2 Outils graphiques de description a. Histogramme de X > hist(X) En ajoutant un titre : > hist(X, main = "Iris : histogramme des longueurs de petales") b. Les boîtes à moustaches" > boxplot(X) > boxplot(X, main = "Iris", ylab = "Longueur des petales") c. Par variété : > boxplot(X~Sp) > boxplot(X~Sp, main = "Iris", xlab = "Espece", ylab = "Longueur de petales") 3.1.3 Les graphiques a. Graphique X, Y Xj × Yj et le graphe multiple" (j, (Xj , Yj )) : > plot(X, Y, xlab = "Longueur", ylab = "Largeur", main = "Iris : dimensions des pétales") On peut faire varier la dimension des points (cex), le type de points (pch) et leur couleur (col) : > > > > > par(mfrow=c(2,1)) plot(X, Y, xlab="Petal Length", ylab="Petal Width", cex=1.5) plot(X, Y, xlab="Petal Length", ylab="Petal Width", cex=1.5, pch=16, col="blue") plot(X, Y, xlab="Petal Length", ylab="Petal Width", cex=1.5, pch=16, col=Sp) par(mfrow=c(1,1)) Vous trouverez diérentes valeurs possibles pour l'argument points() : > ?points Pour acher la liste des noms de couleurs : > colors() b. Graphique "multiple" : données de l'espèce Versicolor : 16 pch dans l'aide de la fonction 3.2 La régression linéaire > > > > > 3 QUELQUES TRAITEMENTS STATISTIQUES Z <- iris[iris$Species == "versicolor", 1:4] print(summary(Z)) matplot(Z, type="l", lty = 1, col=2:5, lwd=2, xlab="", ylab = "Dimension", ylim=c(0,8)) title("Iris (Versicolor)") legend("topright", colnames(iris)[1:4], col=2:5, lty=1, lwd=2) c. Avec le package lattice : représentation graphique par groupe (ici par variété) > library(lattice) > xyplot(Y~X|Sp, xlab="Petal Lenght", ylab="Petal Width", pch=16) 3.2 La régression linéaire Calcul de la régression linéaire simple (ou multiple) : (X, Y ) représentation graphique de Yi = β0 +β1 Xi +ei (Xi peut être un vecteur) ; et de la droite de régression (dans le cas de la RLS) ; calcul du tableau ANOVA associé au modèle On reprend les données vecteurs 3.2.1 X (Diametre) et Graph Y arbres. Si besoin, les importer (data frame arbres) et créer les (Hauteur) (cf. p. 5). X ×Y > plot(X, Y) 3.2.2 Régression a. Calcul de la régression Y ∼ X (X peut être une matrice) > Res <- lm(Y~X) Les résultats obtenus sont une liste avec pour composante les estimation des coecients β̂ (Res$coef), les résidus (Res$residuals) rj = Yj − Ŷj où Ŷj = β̂0 + β̂1 Xj . b. Les estimations β0 , β1 : > print(Res$coef) c. Graph Xj , Residusj > plot(X, Res$residuals) d. La droite de régression > plot(X, Y) > abline(Res, col = "red") 17 3.3 ANOVA à un facteur 3.2.3 3 QUELQUES TRAITEMENTS STATISTIQUES Calcul des statistiques sur la régression et ANOVA > summary(Res) > anova(Res) Voici quelques résultats : Résultats Régression Call: lm(formula = Y ~ X) Residuals: Min 1Q Median -0.23753 -0.07504 -0.03109 3Q 0.07319 Max 0.26621 Coefficients: Estimate Std. Error t value (Intercept) 7.173283 0.412684 17.38 X 0.180835 0.007055 25.63 --Signif. codes: 0 `***' 0.001 `**' 0.01 Pr(>|t|) 1.07e-12 *** 1.28e-15 *** `*' 0.05 `.' 0.1 ` ' 1 Residual standard error: 0.1306 on 18 degrees of freedom Multiple R-squared: 0.9733, Adjusted R-squared: 0.9719 F-statistic: 657 on 1 and 18 DF, p-value: 1.28e-15 3.3 L'analyse de variance à un facteur Le modèle : Rendir = αi +eir ; Description graphique des données, Test de Student, Test Gaussien sur les résidus, Test de Fisher (F), Tableau ANOVA, Tests non-paramétriques Importer les données ble.xls, tableau composé de deux colonnes : IT et Rendement. L'objectif est de décrire et analyser les données. 3.3.1 Description graphique des données Boîtes à moustaches et graphiques par IT > > > > > > > > > > Rendement ∼ IT # Présentation des données par modalité du facteur par(mfrow=c(1,2)) # On définit Y (Rendement) et IT Y <- ble$Rendement IT <- ble$IT stripchart(Y~IT, xlab="IT", ylab="Rendement", vertical=T) boxplot(Y~IT, xlab="IT", ylab="Rendement") # Les boites à moustaches aussi plot(Y~IT, data=ble, xlab="IT", ylab="Rendement") par(mfrow=c(1,1)) 18 3.3 ANOVA à un facteur 3.3.2 3 QUELQUES TRAITEMENTS STATISTIQUES ANOVA à un facteur Estimation et tests (Fisher et ANOVA) > Res <- lm(Y~IT) > summary(Res) Résultat AV(1) Call: lm(formula = Y ~ IT) Residuals: Min 1Q -12.3250 -4.0417 Median -0.4333 3Q 5.2583 Max 11.9667 Coefficients: Estimate Std. Error t value (Intercept) 91.725 1.905 48.161 IT[T.b] -1.083 2.693 -0.402 IT[T.c] -8.192 2.693 -3.041 --Signif. codes: 0 `***' 0.001 `**' 0.01 Pr(>|t|) < 2e-16 *** 0.69012 0.00459 ** `*' 0.05 `.' 0.1 ` ' 1 Residual standard error: 6.598 on 33 degrees of freedom Multiple R-Squared: 0.2486, Adjusted R-squared: 0.2031 F-statistic: 5.459 on 2 and 33 DF, p-value: 0.008952 Les résultats obtenus sont une liste avec parmi ses composantes : les estimation des coecients β̂ (Res$coef), les résidus (Res$residuals) rir = Yir − Ŷir := Yir − Ȳi . 3.3.3 Etude des résidus a. Graphe des résidus par modalité, leur représentation en fonction des valeurs estimées de la réponse, et leur histogramme > > > > > > stripchart(Res$residuals~IT, xlab="IT", ylab="Résidus", vertical=T) plot(Res$residuals~Res$fitted,xlab="Rendements attendus",ylab="Résidus") # Représentation graphique de l'histogramme des résidus, # et de la courbe de la densité de la loi normale centrée, de même moyenne : hist(Res$residuals,freq=F) curve(dnorm(x,mean(Res$res),sd(Res$res)),add=T) b. Test de la normalité des résidus : tests de Kolmogorov-Smirnov et de Shapiro-Wilk > ks.test(Res$residuals,"pnorm",mean(Res$residuals),sd(Res$residuals)) > shapiro.test(Res$residuals) c. Test de l'homoscédasticité des résidus : tests de Bartlett et de Levene 19 3.4 ANOVA à deux facteurs - modèle additif 3 QUELQUES TRAITEMENTS STATISTIQUES > bartlett.test(Res$residuals,IT) > library(car) > leveneTest(Res) 3.3.4 La table de l'analyse de variance table ANOVA > anova(Res) Analysis of Variance Table Response: Y Df Sum Sq Mean Sq F value Pr(>F) IT 2 475.22 237.61 5.4588 0.008952 ** Residuals 33 1436.42 43.53 --Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 3.3.5 Comparaison deux-à-deux : Tests de Student et comparaisons multiples a. Test t de comparaison des moyennes des itinéraires techniques a et b > > > > > > # Test de student g1 <- Y[IT=="a"] g2 <- Y[IT=="b"] t.test(g1, g2, var.equal = T) # ou test de Welsh (si l'hypothèse d'égalité des variances n'est pas vérifiée) t.test(g1, g2) b. Comparaisons multiples des moyennes et graphique des intervalles de conance > > > > > > > > library(HH) comp.2a2 <- mmc(Res, linfct = mcp(IT = "Tukey")) print(comp.2a2) # le premier tableau donne les intervalles de confiance pour les contrastes de Tukey. # Affichage des comparaisons deux-à-deux avec les p-values : summary(comp.2a2$mca$glht) plot(Comp.2a2mca$glht) Des fonctions pour les comparaisons multiples se trouvent aussi dans le package > library(agricolae) > LSD.test(Res,"IT") > HSD.test(Res,"IT") 3.4 agricolae : # Test LSD (Least Significant Differences) # Test HSD de Tukey (Honnestly Significant Differences) L'analyse de variance à deux facteurs, modèle additif Le modèle : Rendijr = αi + βj + eijr ; Description graphique des données, Test de Student, Test Gaussien sur les résidus, Test de Fisher (F), Tableau ANOVA, Tests non-paramétriques 20 3.4 ANOVA à deux facteurs - modèle additif 3 QUELQUES TRAITEMENTS STATISTIQUES Importer les données tomates.xls, tableau composé de trois colonnes : Traitement, Bloc et Rendement. L'objectif est de décrire et analyser les données. 3.4.1 Description graphique des données Boîtes à moustaches et graphiques par Traitement et par Bloc et Rendement ∼ T raitement Rendement ∼ Bloc > > > > > > > > > > > > > 3.4.2 # Présentation des données par modalité des facteurs par(mfrow=c(2,2)) # On définit Y (Rendement), B (Blocs) et Tr (Traitements) Y <- tomates$Rendement # On transforme B (la variable blocs) en facteur, sinon B serait considéré # comme une variable numérique (ce qui serait gênant pour la suite !) B <- as.factor(tomates$Bloc) Tr <- tomates$Traitement stripchart(Y~B, xlab="Bloc", ylab="Rendement", vertical=T) boxplot(Y~B, xlab="Bloc", ylab="Rendement") stripchart(Y~Tr, xlab="Traitement", ylab="Rendement", vertical=T) boxplot(Y~Tr, xlab="Traitement", ylab="Rendement") par(mfrow=c(1,1)) ANOVA à deux facteurs Estimation et tests (Fisher et ANOVA) > Res <- lm(Y~B+Tr) > summary(Res) Attention : s'assurer que B et Tr sont des facteurs, et non des variables quantitatives ! Résultat AV(2) Call: lm(formula = Y ~ B + Tr) Residuals: Min 1Q Median 3Q Max -2.244 -0.724 -0.064 0.516 2.336 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 50.1840 0.8779 57.163 < 2e-16 *** B2 -0.0400 0.9254 -0.043 0.9661 B3 -0.8600 0.9254 -0.929 0.3665 B4 -0.2200 0.9254 -0.238 0.8151 B5 -0.2000 0.9254 -0.216 0.8316 TrB -0.1200 0.9254 -0.130 0.8984 TrC 2.6400 0.9254 2.853 0.0115 * TrD 1.5800 0.9254 1.707 0.1071 21 3.4 ANOVA à deux facteurs - modèle additif 3 QUELQUES TRAITEMENTS STATISTIQUES TrT -11.8200 0.9254 -12.773 8.29e-10 *** --Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 Residual standard error: 1.463 on 16 degrees of freedom Multiple R-squared: 0.9526, Adjusted R-squared: 0.9289 F-statistic: 40.22 on 8 and 16 DF, p-value: 3.681e-09 Comme pour l'ANOVA à un facteur, les résultats obtenus sont une liste comprenant, entre autres, les estimation des coecients 3.4.3 β̂ (Res$coef) et les résidus (Res$residuals). Etude des résidus a. Graphe des résidus par bloc ou par traitement, leur représentation en fonction des valeurs estimées de la réponse, et leur histogramme > > > > > > par(mfrow=c(2,2)) stripchart(Res$residuals~B, xlab="Bloc", ylab="Résidus", vertical=T) stripchart(Res$residuals~Tr, xlab="Traitement", ylab="Résidus", vertical=T) plot(Res$residuals~Res$fitted,xlab="Rendements attendus",ylab="Résidus") hist(Res$residuals,freq=F) curve(dnorm(x,mean(Res$res),sd(Res$res)),add=T) b. Test de la normalité des résidus : On appliquera les tests comme pour l'analyse de variance à un facteur (3.3.3, b). c. Homoscédasticité des résidus Il n'y a pas de test pour tester l'homoscédasticité. On regarde sur la représentation des résidus en fonction des valeurs estimées de la réponse, si l'enveloppe du nuage de points est à peu près un rectangle. 3.4.4 La table de l'analyse de variance > anova(Res) table ANOVA Analysis of Variance Table Response: Y Df Sum Sq Mean Sq F value Pr(>F) B 4 2.41 0.60 0.2809 0.886 Tr 4 686.37 171.59 80.1492 2.247e-10 *** Residuals 16 34.25 2.14 --Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 22 3.5 ANOVA à deux facteurs - modèle avec 3 QUELQUES interaction TRAITEMENTS STATISTIQUES 3.4.5 Comparaisons multiples a. Les blocs : On a constaté que l'eet Bloc" n'est pas signicatif. Il n'y a donc pas lieu de faire de comparaisons multiples entre les blocs. b. Les traitements : Avec mmc(HH) > > > > Avec : comp.2a2 <- mmc(Res, linfct = mcp(Tr = "Tukey")) print(comp.2a2) summary(comp.2a2$mca$glht) plot(comp.2a2$mca$glht) agricolae : > LSD.tes(Res, "Tr") > HSD.tes(Res, "Tr") 3.5 # (test LSD) # (test HSD) L'analyse de variance à deux facteurs, modèle avec interaction Le modèle : Rendijr = αi +βj +(αβ)ij +eijr ; Description graphique des données, Test de Student, Test Gaussien sur les résidus, Test de Fisher (F), Tableau ANOVA, Tests non-paramétriques Importer les données teledetection.xls (nom du data.frame : teledet, tableau composé de trois colonnes : Jour, Operateur, Filtre, Encombrement, Intensite. L'objectif est de décrire et analyser les données, en étudiant l'eet des facteurs 3.5.1 Filtre et Encombrement sur l'intensité. Description graphique des données Boîtes à moustaches et graphiques par Traitement et par Bloc Intensite ∼ F iltre Intensite ∼ Encombrement > > > > > > > > > > > > > + > + > # Représentation des données par modalité des facteurs, # et représentation des interactions : par(mfcol=c(2,3)) # On définit Y (Intensite), Tr1 (Filtre) et Tr2 (Encombrement) Y <- teledet$Intensite Tr1 <- as.factor(teledet$Filtre) Tr2 <- teledet$Encombrement # Ici pas de problème, Tr1 et Tr2 sont bien des facteurs. stripchart(Y~Tr1, xlab="Filtre", ylab="Intensite", vertical=T) boxplot(Y~Tr1, xlab="Filtre", ylab="Intensite") stripchart(Y~Tr2, xlab="Encombrement", ylab="Intensite", vertical=T) boxplot(Y~Tr2, xlab="Encombrement", ylab="Intensite") interaction.plot(Tr1, Tr2, Y, trace.label="Encombrement", xlab="Filtre", ylab="Intensite") interaction.plot(Tr2, Tr1, Y, trace.label="Filtre", xlab="Encombrement", ylab="Intensite") par(mfrow=c(1,1)) 23 et 3.5 ANOVA à deux facteurs - modèle avec 3 QUELQUES interaction TRAITEMENTS STATISTIQUES 3.5.2 ANOVA à deux facteurs Estimation et tests (Fisher et ANOVA) > Res <- lm(Y~Tr1*Tr2) On pourrait encore écrire : > Res <- lm(Y~Tr1+Tr2+Tr1:Tr2) Tr1:Tr2 désignant le terme d'interaction. Remarque : là encore, s'assurer que Tr1 et Tr2 sont des facteurs, et non des variables quantitatives ! Résultat AV(2) > summary(Res) Call: lm(formula = Y ~ Tr1 * Tr2) Residuals: Min 1Q Median -9.6667 -2.2917 -0.1667 3Q 2.5417 Max 9.0000 Coefficients: Estimate Std. Error t value (Intercept) 93.333 1.871 49.876 Tr1f2 -8.000 2.646 -3.023 Tr2e2 7.833 2.646 2.960 Tr2e3 14.333 2.646 5.416 Tr1f2:Tr2e2 -5.167 3.743 -1.380 Tr1f2:Tr2e3 -9.167 3.743 -2.449 --Signif. codes: 0 `***' 0.001 `**' 0.01 Pr(>|t|) < 2e-16 0.00509 0.00596 7.2e-06 0.17764 0.02037 *** ** ** *** * `*' 0.05 `.' 0.1 ` ' 1 Residual standard error: 4.584 on 30 degrees of freedom Multiple R-squared: 0.7747, Adjusted R-squared: 0.7372 F-statistic: 20.63 on 5 and 30 DF, p-value: 6.743e-09 Comme pour l'ANOVA à un facteur, les résultats obtenus sont une liste comprenant, entre autres, les estimation des coecients 3.5.3 β̂ ($coef) et les résidus ($residuals). Etude des résidus a. Graphe des résidus par niveau de F iltre et de Encombrement, leur représentation en fonction des valeurs estimées de la réponse, et leur histogramme > > > > > > par(mfrow=c(2,2)) stripchart(Res$residuals~Tr1, xlab="Filtre", ylab="Résidus", vertical=T) stripchart(Res$residuals~Tr2, xlab="Encombrement", ylab="Résidus", vertical=T) plot(Res$residuals~Res$fitted,xlab="Rendements attendus",ylab="Résidus") hist(Res$residuals,freq=F) curve(dnorm(x,mean(Res$res),sd(Res$res)),add=T) 24 3.6 Tests non paramétriques 3 QUELQUES TRAITEMENTS STATISTIQUES b. Normalité et homoscédasticité des résidus : comme pour le modèle sans interaction (3.4.3, 3.5.4 b et c) La table de l'analyse de variance > anova(Res) table ANOVA Analysis of Variance Table Response: Y Df Sum Sq Mean Sq F value Pr(>F) Tr1 1 1469.44 1469.44 69.9365 2.469e-09 *** Tr2 2 571.50 285.75 13.5999 6.250e-05 *** Tr1:Tr2 2 126.72 63.36 3.0156 0.06407 . Residuals 30 630.33 21.01 --Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 3.5.5 Comparaisons multiples a. Le ltre : Avec mmc(HH) : > > > > comp.2a2 <- mmc(Res, linfct = mcp(Tr1 = "Tukey"), interaction_average = T) print(comp.2a2) summary(comp.2a2$mca$glht) plot(comp.2a2$mca$glht) Attention : Bien préciser interaction_average = TRUE permet de prendre en compte le terme d'interaction. Si on laisse cet argument interaction_average avec sa valeur par défaut (FALSE), les résultats des comparaisons multiples seront erronnés. Avec agricolae : > LSD.test(Res, "Tr1") > HSD.test(Res, "Tr1") # (test LSD) # (test HSD) b. L'encombrement : On procède de même avec 3.6 Tr2 Tests non paramétriques : Mann-Whitney, Kruskal-Wallis, Friedman 3.6.1 Comparaison de deux échantillons : test de Wilcoxon-Mann-Whitney Reprenons le jeu de données ble. Nous allons utiliser le test de Wilcoxon-Mann-Whitney b et les rendements de pour comparer entre eux les rendements de l'itinéraire technique l'itinéraire c. Créons d'abord les vecteurs ment pour l'itinéraire b Y.b et Y.c, contenant c: et pour l'itinéraire 25 les valeurs du rendement, respective- 3.6 Tests non paramétriques 3 QUELQUES TRAITEMENTS STATISTIQUES > Y.b <- ble$Rendement[ble$IT=="b"] > Y.c <- ble$Rendement[ble$IT=="c"] Appliquons le test de Wilcoxon-Mann-Whitney, pour tester l'égalité des deux échantillons : > wilcox.test(Y.b,Y.c) Voici les résultats obtenus : Résultat test de Wilcoxon Wilcoxon rank sum test with continuity correction data: Y.b and Y.c W = 113, p-value = 0.01935 alternative hypothesis: true location shift is not equal to 0 3.6.2 Plus de deux échantillons : test de Kruskal-Wallis ble. a. Toujours le jeu de données Pour tester l'eet Itinéraire T echnique sur le rende- ment, on utilisera le test de Kruskal-Wallis : > Y <- ble$Rendement > IT <- ble$IT > kruskal.test(Y,IT) > kruskal.test(RendementIT,data=ble) On peut aussi bien taper : Voici les résultats obtenus : Résultat test de Kruskal-Wallis Kruskal-Wallis rank sum test data: Rendement by IT Kruskal-Wallis chi-squared = 8.2907, df = 2, p-value = 0.01584 b. Si le test de Kruskal-Wallis a mis en évidence une diérence signicative entre les groupes, on peut vouloir eectuer des comparaisons multiples. Cela est possible avec la fonction kruskal() 2 du package agricolae : > library(agricolae) > kruskal(Y,IT) On obtient alors deux blocs de résultats : Le résultat du test de Kruskal-Wallis : 2. Cette fonction utilise la méthode détaillée par W.J. Conover, Practical Nonparametric Statistics", 3rd edition, p. 289-290 26 3.6 Tests non paramétriques 3 QUELQUES TRAITEMENTS STATISTIQUES Fonction kruskal() : résultat du test de Kruskal-Wallis Kruskal-Wallis rank sum test Study: Kruskal-Wallis test's Ties or no Ties Value: 8.290679 degrees of freedom: 2 Pvalue chisq : 0.01583805 Les comparaisons multiples : Fonction kruskal() : comparaisons multiples IT, means of the ranks Y replication a 22.87500 12 b 21.20833 12 c 11.41667 12 t-Student: 2.034515 Alpha : 0.05 LSD : 7.870629 Means with the same letter are not significantly different Groups, Treatments and mean of the ranks a a 22.875 a b 21.20833 b c 11.41667 3.6.3 Le test de Friedman a. Reprenons le jeu de données > > > > tomates. Pour tester l'eet Traitement, on pourra taper : Y <- tomates$Rendement B <- as.factor(tomates$Bloc) Tr <- tomates$Traitement friedman.test(Y,Tr,B) > friedman.test(YTr|B) > friedman.test(RendementTraitement|Bloc,data=tomates) On peut aussi bien taper : ou encore : Voici les résultats obtenus : Résultat test de Friedman Friedman rank sum test data: Rendement and Traitement and Bloc Friedman chi-squared = 15.52, df = 4, p-value = 0.003736 27 3.6 Tests non paramétriques 3 QUELQUES TRAITEMENTS STATISTIQUES b. On a donc mis en évidence une diérence signicative entre les traitements. De même que pour le test de Kruskal-Wallis, il est possible de réaliser des comparaisons mul- 3 tiples . Pour cela, on utilisera la fonction friedman() du package agricolae : > library(agricolae) > friedman(B, Tr, Y) On obtient alors deux blocs de résultats : Le résultat du test de Friedman : Fonction friedman() : résultat du test de Friedman Study: Tr, A B C D T Sum of the ranks Y replication 13 5 14 5 23 5 20 5 5 5 Friedman's Test =============== Adjusted for ties Value: 15.52 Pvalue chisq : 0.00373576 F value : 13.85714 Pvalue F: 4.568766e-05 Alpha : 0.05 t-Student : 2.119905 LSD : 5.608742 Les comparaisons multiples : Fonction friedman() : comparaisons multiples Means with the same letter are not significantly different. GroupTreatment and Sum of the ranks a C 23 a D 20 b B 14 b A 13 c T 5 3. W.J. Conover, Practical Nonparametric Statistics", 3rd edition, p. 369-371 28 Index Opérateurs arithmétiques *, 12 +, 12 %/%, 12 %%, 12 Opérateurs logiques !, 11 &, 11 |, 11 !=, 10 -, 10 <=, 10 <, 10, 13 ==, 10 >=, 10, 13 >, 8, 10 <-, 3, 5, 8, 9 &, 10 abline(), 17 anova(), 18, 20, 22, 25 apply(), 9, 15 as.factor(), 21, 23 bartlett.test(), 20 boxplot(), 16, 18, 21, 23 c(), 8, 12 cat(), 13 cbind(), 17 colnames(), 9 colors(), 16 colwnames(), 9 cor(), 16 cov(), 16 curve(), 19, 22, 25 data.frame(), 9, 10 dnorm(), 19, 22, 25 for (), 13, 14 friedman(), 28 friedman.test(), 27 function(), 14 hist(), 16, 19, 22, 25 HSD.test(), 20, 23, 25 if () ... then ... else, 13 interaction.plot(), 23 kruskal(), 26 kruskal.test(), 26 ks.test(), 19, 22 leveneTest(), 20 library(), 3, 17, 20 lm(), 17, 19, 21, 24 LSD.test(), 20, 23, 25 matplot(), 17 matrix(), 9 mean(), 15, 16 mmc(), 20, 23, 25 nrow(), 17 par(), 16, 18, 21, 23 plot(), 1620, 22, 23, 25 points(), 16 print(), 3, 8, 9 quantile(), 15 rbind(), 10 return(), 14 rnorm(), 13 rownames(), 9 sd(), 15, 16 shapiro.test, 19, 22 stripchart(), 18, 19, 2123, sum(), 9, 13 summary(), 15 summary.lm(), 18, 19, 22, 24 t.test(), 20 tapply(), 16 title(), 17 var(), 15 which(), 10 wilcox.test(), 26 xyplot(), 17 29 25