Professional Documents
Culture Documents
ANOVA bsico
En esta leccin explicamos cmo efectuar con R los anlisis de la varianza bsicos que se
han estudiado en el curso. Aunque el tema central es el estudio de los aspectos tcnicos
del ANOVA con R y los tests posteriores de comparacin de pares de medias, dedicamos
tambin una pequea seccin a introducir algunas funciones que sirven para comprobar
dos de las condiciones del ANOVA la normalidad y la igualdad de varianzas sin profundizar en las mismas. En la prxima leccin estudiaremos con ms detalle algunos tests
de normalidad.
24.1.
Los modelos a los que se aplica un ANOVA u otras muchas funciones, como por ejemplo
la funcin lm para calcular la recta de regresin lineal que veamos en la Leccin 3, se
especifican en R mediante frmulas. El operador bsico para construir una frmula es la
tilde ~. Las frmulas suelen tener la forma Y~modelo, donde la Y es un vector y el modelo
es una combinacin de vectores que representa el modelo con el que queremos explicar el
vector Y (para ser precisos, al que queremos ajustar el vector Y). Por ejemplo, cuando en
la Leccin 3 queramos calcular la recta de regresin por mnimos cuadrados de un vector
Y respecto de un vector X, usbamos lm(Y~X). Esto significa que aplicbamos la funcin
lm a la frmula Y~X que indica que queremos explicar Y como una funcin lineal de X.
En el ANOVA bsico que hemos estudiado en el curso, usamos cuatro tipos de frmulas.
Sean X una variable numrica y F1 y F2 dos factores de una cierta tabla de datos.
La frmula X~F1 se usa para indicar el ANOVA de un factor, F1, de la variable X.
La frmula X~F1+F2 se usa para indicar el ANOVA de dos factores, F1 y F2, de la
variable X, sin tener en cuenta la interaccin entre los factores. Es decir, suponiendo
que sus efectos se acumulan, sin que haya interaccin entre los mismos.
59
24.2.
ANOVA de un factor
60
A
62
60
63
59
63
59
Dieta
B C
63 68
67 66
71 71
64 67
65 68
66 68
D
56
62
60
61
63
64
60
65
70
Obtenemos el grfico de la Figura 24.1, donde vemos que las medias para las dietas A, B
y C tienen el aspecto de ser diferentes dos a dos, y en cambio es posible que no podamos
rechazar que las de las dietas A y D sean iguales. Por tanto el resultado que esperamos del
ANOVA es que nos permita rechazar la hiptesis nula de que los cuatro tiempos medios
de coagulacin son iguales.
Figura 24.1. Diagrama de cajas de los tiempos de coagulacin segn las diferentes dietas.
Como hemos comentado, para realizar el ANOVA deseado, la instruccin bsica es la
siguiente:
> aov(coag~diet,data=coagulacion)
Call:
aov(formula = coag ~ diet, data = coagulacion)
Terms:
Sum of Squares
Deg. of Freedom
diet Residuals
228
112
3
20
Residuals 20
--Signif. codes:
112
5.6
Para extraer los datos de la tabla ANOVA obtenida con summary(aov(...)), y as poder
operar directamente con ellos, hay que aadir a esta instruccin un sufijo adecuado.
> tabla=summary(aov(coag~diet,data=coagulacion))
> str(tabla)
List of 1
$ :Classes anova and data.frame: 2 obs. of 5 variables:
..$ Df
: num [1:2] 3 20
..$ Sum Sq : num [1:2] 228 112
..$ Mean Sq: num [1:2] 76 5.6
..$ F value: num [1:2] 13.6 NA
..$ Pr(>F) : num [1:2] 4.66e-05 NA
- attr(*, "class")= chr [1:2] "summary.aov" "listof"
> tabla[[1]]$"Sum Sq"
[1] 228 112
> tabla[[1]]$"Mean Sq"
[1] 76.0 5.6
> tabla[[1]]$"F value"
[1] 13.57143
NA
> tabla[[1]]$"Pr(>F)"
[1] 4.658471e-05
NA
> tabla[[1]]$"Pr(>F)"[1]
[1] 4.658471e-05
El resultado de str(tabla) nos indica que summary(aov(...)) produce una list formada
por un solo objeto (List of 1), un data frame, y de aqu que para extraer sus valores
tengamos que usar la construccin mostrada: el sufijo [[1]] extrae el nico objeto de
la list, el data frame, y a continuacin el sufijo $variable extrae el contenido de la
variable. Como los nombres de las variables tienen espacios en blanco u otros smbolos no
aceptados en los nombres de objetos de R (recordad la Leccin 2), los especificamos entre
comillas.
El resultado de anova(lm(...)) es directamente un data frame, y por tanto para extraer
los valores de la tabla ANOVA obtenida de esta manera podemos usar la sintaxis usual de
los data frames.
> tabla2=anova(lm(coag~diet,data=coagulacion))
> str(tabla2)
Classes anova and data.frame: 2 obs. of 5 variables:
$ Df
: int 3 20
$ Sum Sq : num 228 112
64
Experimental Design and Analysis, de M. Lentner y T. Bishop (Valley Book Co. 1986), p. 428.
65
50
45
40
35
30
25
20
> summary(aov(gain~treat,data=rabbit))[[1]]$"Pr(>F)"[1]
[1] 0.1342124
Al usar las instrucciones aov o anova(lm(...)) para realizar un ANOVA, se ha de
emplear un factor (o varios, en las prximas secciones) para separar la variable numrica
en subpoblaciones. Veamos un ejemplo de lo que pasa si nos descuidamos en este punto.
Ejemplo 24.2. En un experimento, se estudi el efecto de la vitamina C en el crecimiento
de los dientes.3 Se trat, en diferentes momentos, a cada ejemplar de un grupo de 10 cobayas
con todas las combinaciones posibles de dosis de vitamina C (0.5, 1 o 2 mg) y mtodos de
suministro (mediante zumo de naranja o como cido ascrbico) durante 6 semanas, y se
cuantific el crecimiento de sus dientes durante dicho perodo (ms en concreto, se midi
la longitud media de sus odontoblastos al final del mismo). El resultado es una tabla de 60
datos, que aparecen recogidos en el fichero ToothGrowth del paquete UsingR.
> install.packages("UsingR",dep=TRUE) #si an no est instalado
> library(UsingR)
> str(ToothGrowth)
data.frame: 60 obs. of 3 variables:
$ len : num 4.2 11.5 7.3 5.8 6.4 10 11.2 11.2 5.2 7 ...
$ supp: Factor w/ 2 levels "OJ","VC": 2 2 2 2 2 2 2 2 2 2 ...
$ dose: num 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
> help(ToothGrowth)
3 Vase
66
La variable len contiene la longitud media de los odontoblastos del animal, la variable
supp el mtodo de suministro (OJ indica zumo de naranja, orange juice, y VC indica cido
ascrbico, vitamine C), y la variable dose la dosis.
Nos vamos a olvidar por el momento de la variable supp, y vamos a contrastar si la dosis
de vitamina C tiene influencia en el crecimiento de los dientes. Para ello realizamos un
ANOVA de un factor.
> summary(aov(len~dose,data=ToothGrowth))
Df Sum Sq Mean Sq F value
Pr(>F)
dose
1
2224 2224.3
105.1 1.23e-14 ***
Residuals
58
1228
21.2
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Veis algo raro? Hemos comentado que se usaron tres dosis, por lo que tendramos que
esperar que el nmero de grados de libertad en la fila del factor, dose, fuera 2, y no 1.
Qu ha pasado? Muy sencillo: dose es una variable numrica, y para emplear aov el factor
ha de ser eso, un factor. As que lo primero que vamos a hacer es convertir esta variable
en un factor.
> ToothGrowth2=ToothGrowth #NUNCA modifiquis el fichero original!
> ToothGrowth2$dose=as.factor(ToothGrowth2$dose)
> str(ToothGrowth2)
data.frame: 60 obs. of 3 variables:
$ len : num 4.2 11.5 7.3 5.8 6.4 10 11.2 11.2 5.2 7 ...
$ supp: Factor w/ 2 levels "OJ","VC": 2 2 2 2 2 2 2 2 2 2 ...
$ dose: Factor w/ 3 levels "0.5","1","2": 1 1 1 1 1 1 1 1 1 1 ...
> summary(aov(len~dose,data=ToothGrowth2))
Df Sum Sq Mean Sq F value
Pr(>F)
dose
2
2426
1213
67.42 9.53e-16 ***
Residuals
57
1026
18
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Ahora est bien. El p-valor prcticamente 0 nos permite rechazar la hiptesis nula y concluir que diferentes dosis de vitamina C dan lugar a diferentes crecimientos medios de los
odontoblastos.
24.3.
Para ilustrar este tipo de ANOVA, analizaremos un experimento sobre produccin de penicilina.4 En dicho experimento, se evaluaron cuatro procesos diferentes para determinar si
4 Vase Practical Regression and Anova using R, de J. Faraway, p. 186. Este texto se puede descargar
de la pgina web cran.r-project.org/doc/contrib/Faraway-PRA.pdf.
67
haba diferencias en su efectividad. Los cuatro procesos usaban una tcnica de cultivo sumergido y empleaban agua de macerado de maz como fuente de nitrgeno orgnico. Como
la composicin de este lquido puede afectar la produccin final de penicilina, para evaluar
los cuatro procesos se prepararon 5 mezclas diferentes de agua de macerado de maz, de
cada mezcla se tomaron 4 muestras y se asignaron de manera aleatoria a los cuatro procesos
de produccin. Los resultados obtenidos son los de la Tabla 24.2, y aparecen recogidos en
la tabla de datos penicillin del paquete faraway.
Mezcla
1
2
3
4
5
Proceso
A B
89 88
84 77
81 87
87 92
79 81
de prod.
C D
97 94
92 79
87 85
89 84
80 88
blend contiene la mezcla usada (los bloques), con valores Blend1, Blend2,. . . , Blend5; y
la variable numrica yield contiene un valor que cuantifica la produccin de penicilina.
Ahora es un buen momento para mencionar que a partir de un data frame con dos
factores podemos obtener su tabla de doble entrada, con filas y columnas representando
los niveles de ambos factores (la Tabla 24.2, en este ejemplo), por medio de la instruccin
ftable(xtabs(formula,data=...))
Por ejemplo
> ftable(xtabs(yield~blend+treat,data=penicillin))
treat A B C D
blend
Blend1
89 88 97 94
Blend2
84 77 92 79
Blend3
81 87 87 85
Blend4
87 92 89 84
Blend5
79 81 80 88
produce la Tabla 24.2. Observad el orden en el que hemos entrado los factores en la frmula:
el primero, en nuestro caso blend, indica las filas y el segundo, treat, las columnas.
Veamos como son los diagramas de cajas de la produccin de penicilina separada por
procesos de produccin y por mezclas.
> boxplot(yield~treat,data=penicillin)
> boxplot(yield~blend,data=penicillin)
Obtenemos los grficos de la Figura 24.3. Vemos que no hay mucha diferencia entre las
producciones para los diferentes procesos (sin tener en cuenta los bloques), y que s que
hay algunas diferencias en las producciones segn la composicin del agua de macerado de
maz.
Si realizamos un ANOVA de un factor para cada uno de estos dos factores por separado,
obtenemos resultados consistentes con esta observacin visual:
> summary(aov(yield~treat,data=penicillin))
Df Sum Sq Mean Sq F value Pr(>F)
treat
3
70
23.33
0.762 0.532
Residuals
16
490
30.62
> summary(aov(yield~blend,data=penicillin))
Df Sum Sq Mean Sq F value Pr(>F)
blend
4
264
66.00
3.345 0.038 *
Residuals
15
296
19.73
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
69
95
80
85
90
95
90
85
80
Blend1
Blend2
Blend3
Blend4
Blend5
El p-valor del ANOVA separando por procesos de produccin es 0.532, lo que indica que
no podemos rechazar la hiptesis nula de que los procesos de produccin tengan igual productividad media (sin tener en cuenta las mezclas), y el p-valor del ANOVA separando por
mezclas es 0.038, lo que indica que no todas las mezclas producen la misma cantidad media
de penicilina. Pero precisamente, el hecho de que la mezcla influya en la produccin es lo
que hace el primer ANOVA no concluyente: a lo mejor el efecto de las mezclas enmascara las
diferencias en las productividades de los procesos bajo estudio. Para determinarlo, hemos
de llevar a cabo un ANOVA por bloques, es decir, de dos factores y efectos acumulados.
> summary(aov(yield~treat+blend,data=penicillin))
Df Sum Sq Mean Sq F value Pr(>F)
treat
3
70
23.33
1.239 0.3387
blend
4
264
66.00
3.504 0.0407 *
Residuals
12
226
18.83
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
El p-valor que nos interesa en esta tabla es el primero, correspondiente a la fila treat: es
0.3387, lo que significa que al realizar el anlisis por bloques tampoco detectamos evidencia
de que haya diferencias en las productividades medias de los procesos estudiados.
El segundo p-valor de la tabla, 0.0407, es el correspondiente al ANOVA de bloques que
resulta de intercambiar los bloques y el tratamiento: es decir, tomando las mezclas como
70
Estudiante
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Tests
48
94
98
60
52
77
84
83
75
24
47
53
82
66
49
Casa
42
86
94
58
56
73
84
76
55
49
47
42
93
62
40
Actividad
Talleres Control 1
85
31
100
52
93
93
71
66
79
64
84
80
94
83
99
51
70
85
57
19
64
44
78
50
92
66
74
24
74
35
Control 2
20
48
90
46
24
95
70
55
48
55
35
8
30
56
21
3
4
5
6
85 Talleres
31 Control1
20 Control2
94
Tests
1
1
1
2
Observad que hemos definido la variable de bloques como un factor, puesto que para realizar
el ANOVA ha de ser un factor del data frame.
Vamos a dibujar los diagramas de cajas de las notas de las diferentes actividades y de
los diferentes estudiantes:
> boxplot(notas.bloques$notas~notas.bloques$acts)
> boxplot(notas.bloques$notas~notas.bloques$bloques)
100
80
60
40
20
20
40
60
80
100
Obtenemos los grficos de la Figura 24.4. Se observan diferencias en las notas de algunas
actividades: por ejemplo, las notas del control 2 son muy inferiores a las de los talleres.
Asimismo, como nos temamos, vemos una gran variabilidad en las notas de los estudiantes.
Casa
Control1
Control2
Talleres
Tests
10
11
12
13
14
15
--Signif. codes:
El p-valor que nos interesa es el de la primera fila, etiquetada con el factor cuyos niveles
queremos comparar, en este caso acts. Este p-valor es muy pequeo, 1.31 107 , lo que
indica que, en efecto, no todas las notas medias de las actividades de evaluacin fueron
iguales.
24.4.
Para ilustrar el ANOVA de dos vas, es decir, de dos factores con interaccin, analizaremos
los resultados de un experimento sobre el efecto de venenos y antdotos.5 En este experimento se usaron tres venenos y cuatro antdotos, y cada combinacin de veneno y antdoto
se administr a cuatro ratas elegidas de manera aleatoria e independiente. A continuacin,
se anot el tiempo de supervivencia de cada animal, en unidades de 10 horas. Los resultados se muestran en la Tabla 24.4. El objetivo era analizar el efecto de los venenos y de
los antdotos. Se trata, pues, de un diseo experimental de dos factores, en el que cada
individuo ha sido asignado al azar a cada nivel de los dos factores. Estamos interesados en
contrastar la igualdad de medias bajo estos dos factores.
Veneno
I
II
III
A
0.31
0.45
0.46
0.43
0.36
0.29
0.40
0.23
0.22
0.21
0.18
0.23
Antdoto
B
C
0.82 0.43
1.10 0.45
0.88 0.63
0.72 0.76
0.92 0.44
0.61 0.35
0.49 0.31
1.24 0.40
0.30 0.23
0.37 0.25
0.38 0.24
0.29 0.22
D
0.45
0.71
0.66
0.62
0.56
1.02
0.71
0.38
0.30
0.36
0.31
0.33
74
> str(rats)
data.frame: 48 obs. of 3 variables:
$ time : num 0.31 0.82 0.43 0.45 0.45 1.1 0.45 0.71 0.46 0.88 ...
$ poison: Factor w/ 3 levels "I","II","III": 1 1 1 1 1 1 1 1 1 1 ...
$ treat : Factor w/ 4 levels "A","B","C","D": 1 2 3 4 1 2 3 4 1 2 ...
> head(rats)
time poison treat
1 0.31
I
A
2 0.82
I
B
3 0.43
I
C
4 0.45
I
D
5 0.45
I
A
6 1.10
I
B
> help(rats)
La variable treat contiene el antdoto, con valores A, B, C y D; la variable poison contiene
el veneno, con valores I, II y III; y la variable numrica time contiene el tiempo de
supervivencia de las ratas. Veamos cmo son los diagramas de cajas de estos tiempos,
separados por venenos y por antdotos.
> boxplot(time~poison,data=rats)
> boxplot(time~treat,data=rats)
Obtenemos los grficos de la Figura 24.5. Parece que hay diferencias en los tiempos de
supervivencia tanto para los diferentes venenos como para los diferentes antdotos. Podemos
tambin dibujar un diagrama de cajas de los tiempos de supervivencia separndolos por
combinaciones de veneno y antdoto. La instruccin para hacerlo es la siguiente (observad
la frmula del argumento) y el resultado es el de la Figura 24.6.
> boxplot(time~poison:treat,data=rats)
El cdigo para llevar a cabo el ANOVA de dos vas del tiempo de supervivencia de las
ratas bajo los efectos combinados de veneno y antdoto es el siguiente:
> summary(aov(time~poison*treat,data=rats))
Df Sum Sq Mean Sq F value
Pr(>F)
poison
2 1.0330 0.5165 23.222 3.33e-07 ***
treat
3 0.9212 0.3071 13.806 3.78e-06 ***
poison:treat 6 0.2501 0.0417
1.874
0.112
Residuals
36 0.8007 0.0222
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
En la ltima columna de esta tabla, el primer p-valor es el del contraste de la igualdad
de tiempos medios de supervivencia segn el veneno (poison): el p-valor 3.3 107 indica
75
1.2
0.2
0.4
0.6
0.8
1.0
1.2
1.0
0.8
0.6
0.4
0.2
II
III
Figura 24.5. Diagramas de cajas de los tiempos de supervivencia segn los diferentes venenos (izquierda) y segn los
diferentes antdotos (derecha).
que estos tiempos medios no son todos iguales. El segundo p-valor es el del contraste de la
igualdad de tiempos medios de supervivencia segn el antdoto (treat): el p-valor 3.8106
indica de nuevo que estos tiempos medios tampoco no son todos iguales. Finalmente, el
tercer p-valor es el del contraste de la interaccin entre veneno y antdoto (poison:treat):
el p-valor 0.1123 indica que no hay interaccin.
La tabla que produce R con esta frmula no contiene la fila que permite contrastar si hay
diferencia entre las medias de las poblaciones definidas por pares de niveles, uno por cada
factor: en este ejemplo, por las combinaciones de veneno y antdoto. Si se desea obtener
esta fila, basta realizar un ANOVA de un factor que combine los dos del experimento.
> summary(aov(time~poison:treat,data=rats))
Df Sum Sq Mean Sq F value
Pr(>F)
poison:treat 11 2.2044 0.20040
9.01 1.99e-07 ***
Residuals
36 0.8007 0.02224
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Vemos que tambin hay diferencias significativas entre los tiempos medios de supervivencia
para combinaciones de veneno y antdoto.
En el caso del ANOVA de dos vas, tiene sentido dibujar el grfico de interaccin entre
factores. En un grfico de interaccin del factor F1 respecto del factor F2 en el ANOVA
de una variable numrica X respecto de estos factores, se dibuja una lnea quebrada para
cada nivel del factor F1 . Esta lnea une, mediante segmentos, los valores medios que toma
76
1.2
1.0
0.8
0.6
0.4
0.2
I.A
II.A
III.A
I.B
II.B
III.B
I.C
II.C III.C
I.D
II.D III.D
Figura 24.6. Diagramas de cajas de tiempos de supervivencia segn diferentes combinaciones de veneno y antdoto.
0.9
0.9
0.8
0.6
0.7
I
II
III
0.5
0.7
0.6
0.5
0.2
0.2
0.3
0.3
0.4
mean of rats$time
Veneno
II
I
III
0.4
0.8
rats$poison
rats$treat
Antdoto
> boxplot(len~supp,data=ToothGrowth2)
> boxplot(len~dose:supp,data=ToothGrowth2)
Obtenemos los diagramas de la Figura 24.8. Se observan diferencias segn la dosis y tambin
segn el mtodo de suministro. Las detectar el ANOVA?
> summary(aov(len~supp*dose,data=ToothGrowth2))
Df Sum Sq Mean Sq F value
Pr(>F)
supp
1 205.4
205.4 15.572 0.000231 ***
dose
2 2426.4 1213.2 92.000 < 2e-16 ***
supp:dose
2 108.3
54.2
4.107 0.021860 *
Residuals
54 712.1
13.2
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
> summary(aov(len~supp:dose,data=ToothGrowth2))
Df Sum Sq Mean Sq F value Pr(>F)
supp:dose
5 2740.1
548.0
41.56 <2e-16 ***
Residuals
54 712.1
13.2
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
> interaction.plot(ToothGrowth2$supp,ToothGrowth2$dose,ToothGrowth2$len,
xlab="Mtodo de suministro", ylab="Crecimiento medio",trace.label="Dosis",
lwd=c(2,2,2),fixed=TRUE)
Obtenemos que, efectivamente, hay diferencias significativas en el crecimiento de los dientes
tanto segn la dosis (p-valor prcticamente 0) como segn el mtodo de suministro (pvalor 0.000231) o la combinacin de ambos (p-valor prcticamente 0), y tambin que hay
interaccin entre los dos factores (p-valor 0.02186). El grfico de interaccin producido con
la ltima instruccin (Figura 24.9) refleja esta interaccin: la lnea correspondiente a la
dosis de 2 mg no es paralela a las otras.
El hecho de haber detectado interaccin entre los dos factores hace que nos interese
estudiar el efecto de los niveles de un factor en el otro. Esto se puede llevar a cabo mediante
varios ANOVA de un factor.
En primer lugar, vamos estudiar, para cada mtodo de suministro de vitamina C, si
hay diferencias entre los crecimientos medios de los odontoblastos segn la dosis cuando la
vitamina C se suministra mediante ese mtodo. Para ello vamos a realizar dos ANOVA de
un factor, la dosis, sobre dos dataframes extrados de ToothGrowth2, uno con las filas donde
supp toma el valor OJ y otro con las filas donde supp toma el valor VC. La manera ms
sencilla de extraer estas subtablas de datos es con la instruccin subset. La construccin
subset(df,condicin)
define un dataframe con las filas del data frame df que cumplen la condicin.
79
35
5
10
15
20
25
30
35
30
25
20
15
10
5
OJ
10
15
20
25
30
35
0.5
0.5.OJ
1.OJ
2.OJ
0.5.VC
1.VC
2.VC
Figura 24.8. Diagramas de cajas del crecimiento de los dientes segn la dosis de vitamina C (arriba, izquierda), segn
el mtodo de suministro (arriba, derecha), y segn la combinacin de ambos (abajo).
80
VC
25
Dosis
20
15
10
Crecimiento medio
0.5
1
2
OJ
VC
Mtodo de suministro
> TG.OJ=subset(ToothGrowth2,supp=="OJ")
> TG.VC=subset(ToothGrowth2,supp=="VC")
Naturalmente, en este caso sencillo tambin podramos haber usado la construccin
> TG.OJ=ToothGrowth2[ToothGrowth2$supp=="OJ",]
> TG.VC=ToothGrowth2[ToothGrowth2$supp=="VC",]
pero es mejor empezar a costumbrarse a usar subset.
Ahora realizamos los dos ANOVA:
> summary(aov(len~dose,data=TG.OJ))
Df Sum Sq Mean Sq F value
Pr(>F)
dose
2 885.3
442.6
31.44 8.89e-08 ***
Residuals
27 380.1
14.1
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
> summary(aov(len~dose,data=TG.VC))
Df Sum Sq Mean Sq F value
Pr(>F)
dose
2
1650
824.7
67.07 3.36e-11 ***
Residuals
27
332
12.3
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
81
En ambos casos el p-valor es prcticamente nulo, lo que indica que para cada tipo de
suministro de vitamina C el crecimiento medio de los dientes vara con la dosis. Hay que
tener presente aqu que como realizamos diversos ANOVA de un factor, uno para cada
nivel del otro factor, para garantizar un nivel de significacin global hay que realizar
cada ANOVA con nivel de significacin dividido por el nmero de ANOVA realizados.
En este ejemplo concreto esto no afecta las conclusiones, ya que los p-valores salen realmente
muy pequeos.
Tambin podemos estudiar, para cada dosis, si hay diferencias entre las medias de crecimiento segn el mtodo de suministro. Como slo hay dos mtodos de suministro, para
cada dosis tanto da realizar un ANOVA o un simple t-test suponiendo que las varianzas
son iguales (ya que es una de las condiciones para poder realizar el ANOVA).
> TG.0.5=subset(ToothGrowth2,dose==0.5)
> summary(aov(len~supp,data=TG.0.5))
Df Sum Sq Mean Sq F value Pr(>F)
supp
1 137.8 137.81
10.05 0.0053 **
Residuals
18 246.9
13.72
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
> t.test(len~supp,data= TG.0.5,var.equal=TRUE) #ha de dar el mimso p-valor
Two Sample t-test
data: len by supp
t = 3.1697, df = 18, p-value = 0.005304
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
1.770262 8.729738
sample estimates:
mean in group OJ mean in group VC
13.23
7.98
> TG.1=subset(ToothGrowth2,dose==1)
> summary(aov(len~supp,data=TG.1))
Df Sum Sq Mean Sq F value
Pr(>F)
supp
1 175.8 175.82
16.26 0.000781 ***
Residuals
18 194.6
10.81
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
> TG.2=subset(ToothGrowth2,dose==2)
> summary(aov(len~supp,data=TG.2))
Df Sum Sq Mean Sq F value Pr(>F)
supp
1
0.03
0.032
0.002 0.964
Residuals
18 270.61 15.034
Si queremos realizar este test con un nivel de significacin de 0.05, hay que realizar cada
ANOVA (o cada t-test) con un nivel de significacin 0.05/3 = 0.017. Observamos que hay
82
diferencia segn el tipo de suministro slo para las dosis de 0.5 y 1 mg, que es donde hemos
obtenido p-valores inferiores al nivel de significacin.
24.5.
Como sabemos, los resultados de un ANOVA nos permiten extraer conclusiones slo si
las poblaciones a las que se aplica cumplen una serie de condiciones. Las dos bsicas son
la normalidad y la igualdad de varianzas. La condicin de normalidad requiere que cada
variable de cada factor defina una distribucin normal, es decir, que cada muestra aleatoria
simple de un tratamiento provenga de una poblacin normal. La condicin de igualdad de
varianzas requiere que todas estas distribuciones tengan la misma varianza. R dispone
de varias funciones para comprobar estas condiciones. En esta seccin simplemente las
mencionamos y mostramos como usarlas. Los tests de normalidad se estudiarn con ms
detalle en la prxima leccin.
24.5.1. Normalidad
La manera ms sencilla de comprobar si un vector numrico es consistente con una distribucin normal (o con cualquier otra distribucin continua) es usar el test de KolmogorovSmirnov, que en R viene implementado en la funcin ks.test. La manera de usarlo para
comprobar la normalidad de un vector x es mediante la instruccin
ks.test(x,"pnorm",mean(x),sd(x))
Este test realiza un contraste de hiptesis, cuya hiptesis nula es x es una muestra aleatoria
de una distribucin normal de media y desviacin tpica su media muestral y su desviacin
tpica muestral, respectivamente; la hiptesis alternativa es, naturalmente, que esto sea
falso. El resultado del test contiene un p-valor cuyo significado es el usual: si es mayor de
0.1, no podemos rechazar la hiptesis nula y aceptamos por lo tanto que x proviene de una
distribucin normal.
Veamos algunos ejemplos de su uso.
Ejemplo 24.5. Para comprobar si podemos aceptar que las cuatro dietas en el ejemplo
de la coagulacin de la Seccin 24.2 provienen de distribuciones normales, ejecutamos el
cdigo siguiente.
> coagA=subset(coagulacion,diet=="A")$coag
> ks.test(coagA,"pnorm",mean(coagA),sd(coagA))
One-sample Kolmogorov-Smirnov test
data: coagA
D = 0.2009, p-value = 0.9687
alternative hypothesis: two-sided
Warning message:
83
Ejemplo 24.6. Vamos a comprobar si el ANOVA de dos vas del ejemplo de venenos
y antdotos explicado en la Seccin 24.4 satisface las condiciones de normalidad. En los
ANOVA de dos vas, se requiere que cada combinacin de niveles de los dos factores bajo
consideracin, es decir, en este caso, cada combinacin venenoantdoto, provenga de
una poblacin normal. Para determinarlo, deberamos repetir 12 veces, una para cada
combinacin de veneno y antdoto, una pareja de instrucciones como las siguientes:
> time.I.A=subset(rats,poison=="I" & treat=="A")$time
> ks.test(time.I.A,"pnorm",mean(time.I.A),sd(time.I.A))$p.value
[1] 0.6069251
Esto lo podemos automatizar con un bucle:
> pvalores=c()
> for(x in c("I","II","III")){for (y in c("A","B","C","D")){
z=subset(rats,poison==x & treat==y)$time;
pvalores=c(pvalores,ks.test(z,"pnorm",mean(z),sd(z))$p.value)}}
> pvalores
[1] 0.6069251 0.9062500 0.8484187 0.8148487 0.9862054 0.9552048 0.9984383
[8] 0.9940713 0.9062500 0.8466835 0.9998316 0.9752233
De esta manera, el vector pvalores resultante contiene los p-valores de los 12 tests, y
vemos que todos son muy grandes, por lo que podemos aceptar que las 12 muestras, correspondientes a combinaciones venenoantdoto, provienen de distribuciones normales.
24.5.2. Igualdad de varianzas
Para contrastar la igualdad de varianzas, usaremos el llamado test de Bartlett. Supongamos
para fijar ideas que tenemos k vectores numricos
xi = (xi1 , xi2 , . . . , xini ),
i = 1, . . . , k.
Suponemos que cada uno de ellos es una muestra aleatoria simple de una variable aleatoria
normal (tenemos que haberlo comprobado previamente) de varianza i2 . El contraste que
queremos realizar es:
H0 : 12 = = k2
H1 : i, j | i2 6= j2
Para realizar este contraste, se usa el estadstico de Bartlett:
(N k) ln(e
s2p )
K2 =
1
1+
3(k 1)
k
X
(ni 1) ln(e
s2i )
i=1
k
X
i=1
85
1
ni 1
N k
!,
donde
N=
k
X
i=1
ni ,
se2p
Pk
=
1)e
s2i
,
N k
i=1 (ni
Pni
se2i
j=1 (xij
xi )2
ni 1
> fligner.test(time~interaction(poison,treat),data=rats)
Fligner-Killeen test of homogeneity of variances
data: time by interaction(poison, treat)
Fligner-Killeen:med chi-squared = 30.8987, df = 11, p-value = 0.001143
>
> install.packages("car",dep=TRUE) #si no est instalado
> library(car)
Attaching package: car
The following objects are masked from package:faraway:
logit, vif
> leveneTest(time~poison:treat,data=rats)
Levenes Test for Homogeneity of Variance (center = median)
Df F value
Pr(>F)
group 11 4.1323 0.0005833 ***
36
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
En este caso, con ambos tests obtenemos la misma conclusin que con el bartlett.test.
24.6.
Por otro lado, el parmetro paired se ha de usar para indicar si las muestras son independientes, con FALSE, o emparejadas, con TRUE. El primero, que es el que se ha de usar en
los tests ANOVA de un factor y de dos vas, es el valor por defecto, as que no es necesario
especificarlo. Cuando el ANOVA es de bloques, las muestras son emparejadas, y por lo
tanto se ha de especificar paired=TRUE.
Veamos algunos ejemplos de su uso.
Ejemplo 24.7. Para determinar cules de las tres dietas en el ejemplo de la coagulacin
de la Seccin 24.2 dan tiempos medios de coagulacin diferentes, realizamos un test T de
Bonferroni.
> pairwise.t.test(coagulacion$coag,coagulacion$diet,
p.adjust.method="bonferroni")
Pairwise comparisons using t tests with pooled SD
data: coagulacion$coag and coagulacion$diet
A
B
C
B 0.02282 C 0.00108 0.95266 D 1.00000 0.00518 0.00014
P value adjustment method: bonferroni
Los p-valores del resultado ya han sido ajustados, y por lo tanto se han de comparar
directamente con el nivel de significacin global. Por ejemplo, con un nivel de significacin
= 0.05, obtenemos evidencia de que los tiempos medios para los pares de dietas (A,B),
(A,C), (B,D), (C,D) son diferentes, y en cambio no hay evidencia de que los tiempos medios
para los pares (A,D) y (B,C) sean diferentes.
Ejemplo 24.8. Para determinar qu actividades de evaluacin de las consideradas en el
Ejemplo 24.3 dan notas medias diferentes, podemos realizar un test T de Bonferroni. Para
que ste tenga sentido, primero hemos de comprobar que dichas actividades de evaluacin
definen poblaciones normales con la misma varianza.
Para abreviar, usaremos un for para calcular todos los p-valores del test de KolmogorovSmirnov.
> pvalores=c()
> for(x in c("Tests","Casa","Talleres","Control1","Control2"))
{z=subset(notas.bloques,acts==x)$notas;
pvalores=c(pvalores,ks.test(z,"pnorm",mean(z),sd(z))$p.value)}
> pvalores
[1] 0.9033076 0.8749051 0.9399853 0.9883079 0.8603251
Los p-valores altos indican que podemos aceptar que las notas provienen de distribuciones
normales. Contrastemos ahora la igualdad de varianzas.
88
> bartlett.test(notas~acts,data=notas.bloques)
Bartlett test of homogeneity of variances
data: notas by acts
Bartletts K-squared = 6.1529, df = 4, p-value = 0.188
El p-valor superior a 0.1 indica que podemos aceptar que las varianzas son todas iguales. Por
lo tanto, podemos realizar el test T de Bonferroni. En este caso hemos de usar paired=TRUE,
ya que es un ANOVA de bloques.
> pairwise.t.test(notas.bloques$notas,notas.bloques$acts,
paired=TRUE,p.adjust.method="bonferroni")
Pairwise comparisons using paired t tests
data: notas.bloques$notas and notas.bloques$acts
Casa
Control1 Control2 Talleres
Control1 1.0000 Control2 0.0526 1.0000
Talleres 0.0013 0.0048
0.0012
Tests
1.0000 0.4101
0.0451
0.0048
P value adjustment method: bonferroni
Los p-valores inferiores a 0.05 son los que corresponden a la comparacin de la nota media
de Talleres con cualquier otra actividad, y la nota media de los tests con la del Control 2.
Por tanto, stos son los nicos pares de actividades para los que podemos rechazar que sus
notas medias son iguales a un nivel de significacin global de 0.05.
24.6.1. Test de Duncan
Otro mtodo para comparar los pares de medias es el test de Duncan. Con R se puede
efectuar con la instruccin duncan.test del paquete agricolae. Su sintaxis bsica es
duncan.test(aov,"factor",group=...)$sufijo
donde
aov es el resultado del ANOVA de partida.
El factor es el factor del ANOVA, y se ha de entrar entrecomillado.
group puede valer TRUE o FALSE, y hace que el resultado se presente de forma diferente.
El sufijo es groups si group=TRUE y comparison si group=FALSE.
Este test slo se puede usar en los ANOVA de efectos fijos y de dos vas, no en el ANOVA
de bloques, puesto que supone que las muestras de los tratamientos son independientes.
89
Ejemplo 24.9. Vamos a usar el test de Duncan para determinar cules de las tres dietas
en el ejemplo de la coagulacin de la Seccin 24.2 dan tiempos medios de coagulacin
diferentes. En primer lugar, volvemos a calcular el ANOVA con aov. Luego aplicamos dos
veces duncan.test al resultado de esta aov, una para cada opcin para group.
>
>
>
>
A
A
A
B
B
C
>
1
2
3
4
Para explicar qu informacin obtenemos con esta funcin, veamos un ejemplo. Vamos a
aplicar el mtodo de Tukey al ANOVA del ejemplo sobre tiempos de coagulacin de 24.2.
> anova.coag=aov(coag~diet,data=coagulacion)
> TukeyHSD(anova.coag)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = coag ~ diet, data = coagulacion)
$diet
diff
lwr
upr
p adj
B-A
5
0.7245544 9.275446 0.0183283
C-A
7
2.7245544 11.275446 0.0009577
D-A
0 -4.0560438 4.056044 1.0000000
C-B
2 -1.8240748 5.824075 0.4766005
D-B
-5 -8.5770944 -1.422906 0.0044114
D-C
-7 -10.5770944 -3.422906 0.0001268
De esta manera, para cada par de niveles obtenemos:
La diferencia de sus medias muestrales, en la columna diff.
Los extremos inferior y superior de un intervalo de confianza del 95 % para la diferencia de medias poblacionales, en las columnas lwr y upr, respectivamente. Este nivel
de confianza se puede ajustar con el parmetro conf.level dentro de la funcin.
El p-valor del contraste de igualdad de medias correspondiente, en la columna p adj
En nuestro ejemplo, los intervalos de confianza para las diferencias de medias para los
pares AB, AC, BD y CD no contienen el valor 0 (y los p-valores correspondientes son
pequeos), lo que indica que podemos rechazar que estas medias sean iguales. En cambio,
los intervalos de confianza para las diferencias de medias para los pares AD y BC s que
contienen el 0 (y los p-valores correspondientes son grandes), lo que indica que podemos
aceptar que estas medias son iguales. En este caso obtenemos, por lo tanto, la misma
conclusin que con el test T de Bonferroni o el test de Duncan.
91