# Analyse de la variance en Splus. La fonction read.table crée un "data # frame". > kenton_read.table("exemples/CH16TA01.DAT") > kenton V1 V2 V3 1 11 1 1 2 17 1 2 3 16 1 3 4 14 1 4 5 15 1 5 6 12 2 1 7 10 2 2 8 15 2 3 9 19 2 4 10 11 2 5 11 23 3 1 12 20 3 2 13 18 3 3 14 17 3 4 15 27 4 1 16 33 4 2 17 22 4 3 18 26 4 4 19 28 4 5 # Comme nous n'avons pas besoin de la dernière colonne, on ne conserve # que les deux premières et nous donnons un nom plus significatif que Vi à # chacune des colonnes (le [[2]] plutôt que [[1]] indique colonne au lieu # de rangées. > kenton_kenton[,1:2] > dimnames(kenton)[[2]]_c("Caisse","Design") > kenton Caisse Design 1 11 1 2 17 1 3 16 1 4 14 1 5 15 1 6 12 2 7 10 2 8 15 2 9 19 2 10 11 2 11 23 3 12 20 3 13 18 3 14 17 3 15 27 4 16 33 4 17 22 4 18 26 4 19 28 4 # La variable Design est considérée comme une variable continue et non pas # une variable qualitative (factor). Pour bien vérifier que c'est le cas, # on utilise la fonction is.factor. Puis on la force à devenir qualitative # avec la fonction as.factor. Si on ne s'assure pas que la variable est # qualitative, on obtiendra une régression de Y sur X (avec 1 degré de liberté) # plutôt qu'un plan à classification simple pour quatre groupes (3 degrés de # liberté). > is.factor(kenton[,2]) [1] F > kenton[,2]_as.factor(kenton[,2]) > kenton Caisse Design 1 11 1 2 17 1 3 16 1 4 14 1 5 15 1 6 12 2 7 10 2 8 15 2 9 19 2 10 11 2 11 23 3 12 20 3 13 18 3 14 17 3 15 27 4 16 33 4 17 22 4 18 26 4 19 28 4 # On modélise la variable Caisse par la variable Design à l'aide de la # fonction aov (analysis of variance). Le jeu de données est dans le data # frame kenton. Pour voir le tableau anova, on utilise la fonction summary. > kenton.aov_aov(Caisse ~ Design, data=kenton) > summary(kenton.aov) Df Sum of Sq Mean Sq F Value Pr(F) Design 3 588.2211 196.0737 18.59106 2.584961e-05 Residuals 15 158.2000 10.5467 # Le résultat de la fonction summary est un objet à partir duquel on peut # accéder aux différents éléments. En particulier, on peut accéder à la # colonne "F value" avec le signe de dollar ($). Comme la seconde composante # est manquante (NA), on obtient la valeur de la statistique F en ne prenant # que la première composante. > summary(kenton.aov)$F [1] 18.59106 NA > summary(kenton.aov)$F[1] [1] 18.59106 #################################################################### # Simulations en Splus pour étudier la robustesse du niveau du test F # lorsque les conditions de normalité ou d'égalité de variance ne sont # pas satisfaites. ##################################################################### # Cas 1000 échantillons de taille 30 d'une t à 4 degrés de liberté # On génère une matrice de 30000 variables aléatoires dans une matrice de # 30 lignes (et donc 1000 colonnes) > temp_matrix(rt(30000,4),nrow=30) # On utilise la fonction apply. Celle-ci "applique" une fonction à un # tableau à k dimesions, dans ce cas-ci une matrice (donc k=2). Elle est # appliquée à la deuxième dimension (donc les colonnes), c'est donc dire # qu'on fait comme une boucle où chaque colonne devient tour à tour le jeu # de données. La fonction qui est appliquée est définie explicitement. # Elle prend un argument (x). On fait une analyse de variance où la variable # indépendante est x et le facteur est le vecteur qui contient la valeur 1 # 10 fois (rep(1,10)), puis la valeur 2, 10 fois et la valeur 3, 10 fois. # C'est donc comme si on avait trois groupes de 10 observations chacun. Il # ne faut toutefois pas oublier de spécifier que ce vecteur doit être traité # comme un facteur (variable qualitative) à l'aide de la fonction factor. # À l'objet de type analyse de variance qui est créé, nous appliquons la # fonction summary. Comme nous sommes intéressés qu'à la statistique F, # nous allons chercher le vecteur F ($F) du sommaire. La statistique F est # la première composante de ce vecteur ($F[1]), les autres étant des NA. # Le résultat de la fonction apply est donc le vecteur tempo de longueur 1000 # (le nombre de colonnes de temp). Il contient la statistique F des 1000 # jeux de données. > tempo_apply(temp,2,function(x){summary(aov(x~ + factor(c(rep(1,10),rep(2,10),rep(3,10)))))$F[1]}) # Comme il y a trois groupes de 10 observations chacun, les degrés de liberté # sont 2 et 27. La commande tempo>qf(.95,2,27) est un vecteur logique qui # dit si la statistique F dépasse la borne critique pour un test de niveau # 5%. En prenant la somme de ce vecteur, on obtient le nombre de jeux de # données pour lesquels on rejette H0. En divisant par la longueur du vecteur # on obtient la proportion des jeux de données pour lesquels on a rejeté H0. # Ceci est un estimé du niveau du test et doit être comparé à 5%. > sum(tempo>qf(.95,2,27))/length(tempo) [1] 0.044 # On recommence avec des données exponentielle de moyenne 1. > temp_matrix(rexp(30000),nrow=30) > tempo_apply(temp,2,function(x){summary(aov(x~ + factor(c(rep(1,10),rep(2,10),rep(3,10)))))$F[1]}) > sum(tempo>qf(.95,2,27))/length(tempo) [1] 0.035 # Cette fois-ci, on considère des échantillons d'observations normales, mais # avec des écart type de 1, 1.5 et 3, respectivement, soit des variances de 1, # 2.25 et 9. Afin de s'assurer que les 10 premières rangées ont un écart type # de 1, les 10 suivantes , un écart type de 1.5, etc., il faut s'assurer que # la matrice construite à partir du vecteur de longueur 30000 soit formée # rangée par rangée, plutôt que colonne par colonne. Ceci est assuré par # l'option byrow=T. > temp_matrix(c(rnorm(10000),1.5*rnorm(10000),3*rnorm(10000)),nrow=30,byrow=T) > tempo_apply(temp,2,function(x){summary(aov(x~ + factor(c(rep(1,10),rep(2,10),rep(3,10)))))$F[1]}) > sum(tempo>qf(.95,2,27))/length(tempo) [1] 0.06 # Même chose, mais avec des variances de 1, 2 et 3 (plutôt que des écart type # de 1, 2, 3). > temp_matrix(c(rnorm(10000),sqrt(2)*rnorm(10000),sqrt(3)*rnorm(10000)), + nrow=30,byrow=T) > tempo_apply(temp,2,function(x){summary(aov(x~ + factor(c(rep(1,10),rep(2,10),rep(3,10)))))$F[1]}) > sum(tempo>qf(.95,2,27))/length(tempo) [1] 0.052 > temp_matrix(c(rexp(10000),sqrt(2)*rexp(10000)-(sqrt(2)-1), + sqrt(3)*rexp(10000)-(sqrt(3)-1)),nrow=30,byrow=T) > tempo_apply(temp,2,function(x){summary(aov(x~factor(c(rep(1,10),rep(2,10),rep(Interrupt Interrupt> > tempo_apply(temp,2,function(x){summary(aov(x~ + factor(c(rep(1,10),rep(2,10),rep(3,10)))))$F[1]}) > sum(tempo>qf(.95,2,27))/length(tempo) [1] 0.059