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