En un diseño de medidas repetidas (RM-ANOVA) se evalúa el efecto de un factor sobre una variable independiente medida en dos o más ocasiones para un mismo individuo o para varios individuos que pertenecen a un mismo grupo (e.g., miembros de una misma familia). Como los múltiples valores en la VD están correlacionados entre ellos ya no es posible usar ANOVA en su forma tradicional, donde los errores de estimación son independientes entre los niveles del factor.
El uso de diseños intra-sujetos tiene algunas desventajas y algunas ventajas en comparación con el diseño entre-sujetos. Algunas de sus desventajas se pueden controlar mediante un diseño apropiado.
El siguiente ejemplo corresponde a un grupo de 12 niños observados a los 30, 36, 42 y 48 meses. La VD en este caso es la inteligencia del grupo de 12 niños y el propósito del análisis es determinar si la inteligencia va cambiando con el tiempo.
| Months30 | Months36 | Months42 | Months48 |
|---|---|---|---|
| 108 | 96 | 110 | 122 |
| 103 | 117 | 127 | 133 |
| 96 | 107 | 106 | 107 |
| 84 | 85 | 92 | 99 |
| 118 | 125 | 125 | 116 |
| 110 | 107 | 96 | 91 |
| 129 | 128 | 123 | 128 |
| 90 | 84 | 101 | 113 |
| 84 | 104 | 100 | 88 |
| 96 | 100 | 103 | 105 |
| 105 | 114 | 105 | 112 |
| 113 | 117 | 132 | 130 |
Para RM-ANOVA cada sujeto se considera un factor. Si este fuese un ANOVA factorial le llamaríamos a este diseño un ANOVA de 4x12. La diferencia es que el factor “sujeto” se considera una factor aleatorio en vez de un factor fijo3 Un factor fijo es replicable ya que un investigador puede rehacer el estudio usando los mismos niveles del factor. Los sujetos no son replicables, en el sentido que son una muestra de los niveles que un factor puede asumir. Análogamente a lo que vimos en ANOVA factorial, la pregunta de investigación en RM-ANOVA es si existen diferencias entre las medias del factor A (i.e., meses) controlando por las diferencias asociadas a cada caso. Dicho de otra manera, cuánto peor es la predicción de \(Y_{ij}\) en base a la gran media (\(\mu\)) y el promedio de cada persona (\(\pi\)) en comparación con el mismo modelo pero más el efecto del factor investigado (\(\alpha\)).
El valor predicho en el modelo saturado sería: \[\hat{Y}_{ij}=\hat{\mu}+\hat{\alpha}_j+\hat{\pi}_i\]
Mientras que el valor predicho en el modelo restringido sería: \[\hat{Y}_{ij}=\hat{\mu}+\hat{\pi}_i\]
Si graficamos los valores esperados para el modelo saturado obtenemos el gráfico de más abajo. Cada punto en el gráfico representa el valor predicho para el sujeto i en el tiempo j, que es el factor de interés.
En comparación, el modelo restringido muestra que el puntaje esperado para cada sujeto i es el promedio del sujeto i ignorando el factor tiempo.
ggplot(data= d1.emmeans,aes(x=Month, y=Y.pred.R, group=ID))+
geom_line()+
geom_point()
La diferencia entre los valores observados y predichos de cada modelo se usa para obtener el error del modelo saturado y restringido respectivamente. Específicamente, la suma de cuadrados del modelo saturado corresponde a la suma de cuadrados de la interacción \(A\times S\), que se obtiene mediante:
\[E_F=\sum_{i=1}^n\sum_{j=1}^a(Y_{ij}-\overline{Y}_{.j}+\overline{Y}_{i.}+\overline{Y}_{..})=SS_{A\times S} \] Mientras que la suma de cuadrados del modelo restringido es matemáticamente equivalente a error asociado a la interacción más el efecto principal y se obtiene mediante:
\[E_R=\sum_{i=1}^n\sum_{j=1}^a(Y_{ij}-\overline{Y}_{i.})=SS_{A\times S}+SS_A \] Por lo que \(E_R-E_F=(SS_{A\times S}+SS_A)-SS_{A\times S}=SS_A\). Dividiendo por los grados de libertad correspondiente, en definitiva, el valor para F se obtiene mediante:
\[F=\frac{SS_A/(a-1)}{SS_{A\times S}/(n-1)(a-1)} \] Si calculamos \(E_R\) y \(E_F\) obtendremos 2558 y 2006, respectivamente, por lo que el valor de F sería 3.03, que implica un valor p de .042: \[F=\frac{552/3}{2006/33}=\frac{184}{60.7879}=3.03\] En R el cálculo de F se obtiene mediante la función aov pero especificando que el Error es la interacción entre sujeto y condición como se muestra más abajo. Como se puede apreciar, los valores resultantes reproducen correctamente lo que obtuvimos en el paso anterior.En este link] de UCLA hay algunas estrategias adicionales para modelar cambios longitudinales.
rm.aov<-aov(Values~Month+Error(ID/Month),data=d1_long)
summary(rm.aov)
##
## Error: ID
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 11 6624 602.2
##
## Error: ID:Month
## Df Sum Sq Mean Sq F value Pr(>F)
## Month 3 552 184.00 3.027 0.0432 *
## Residuals 33 2006 60.79
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El valor de F de 3.03 es estadísticamente significativo. Sin embargo, para interpretar correctamente F hay que chequear un supuesto de RM.ANOVA que se llama esfericidad. El valor para F obtenido en el paso anterior se llama F no ajustado, para subrayar que se asume esfericidad. Si no se cumple el supuesto de esfericidad hay que usar un valor de F ajustado (más adelante).
Un supuesto de RM-ANOVA es que la varianza de las diferencias entre cada par de niveles debe ser la misma. Si no se cumple este supuesto la probabilidad de cometer un error de Tipo I puede ser de .10 o incluso .15 cuando \(\alpha\) nominal es .05. En nuestrio ejemplo tenemos 4 niveles y queremos saber si las varianzas de \(Y_{l}-Y_{m}\) son todas iguales.
d1
## Months30 Months36 Months42 Months48
## 1 108 96 110 122
## 2 103 117 127 133
## 3 96 107 106 107
## 4 84 85 92 99
## 5 118 125 125 116
## 6 110 107 96 91
## 7 129 128 123 128
## 8 90 84 101 113
## 9 84 104 100 88
## 10 96 100 103 105
## 11 105 114 105 112
## 12 113 117 132 130
Para la data d1 la diferencia entre 30 meses y 36 meses es
(dif.30m36m<-d1[,1]-d1[,2])
## [1] 12 -14 -11 -1 -7 3 1 6 -20 -4 -9 -4
Y su varianza es 79.82
var(dif.30m36m)
## [1] 79.81818
Mientras que la varianza de la diferencia entre 36 meses y 42 meses es 91.27
(dif.36m42m<-d1[,2]-d1[,3])
## [1] -14 -10 1 -7 0 11 5 -17 4 -3 9 -15
var(dif.36m42m)
## [1] 91.27273
Formalmente, este supuesto se puede evaluar usando el Test de Esfericidad de Mauchly. En R el test de Mauchly requiere que un objeto de clase SSD que se puede obtener mediante el paquete car. Los resultados bajo el título Univariate Type III Repeated-Measures ANOVA Assuming Sphericity replican los obtenidos en el paso anterior. Sin embargo, dado que el test de Mauchly es estadísticamente significativo (ver Mauchly Tests for Sphericity) tenemos que mirar el valor p bajo el título Greenhouse-Geisser and Huynh-Feldt Corrections.
#require matrix form
month.levels<-c(1,2,3,4)
month.factor<-as.factor(month.levels)
month.frame<-data.frame(month.factor)
d1.matrix<-as.matrix(d1)
month.model<-lm(d1.matrix~1)
require(car)
## Loading required package: car
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
#El nombre de la función del paquete car es "Anova" con "A" mayúscula
rm.aov<-Anova(month.model, idata = month.frame, idesign = ~month.factor)
## Note: model has only an intercept; equivalent type-III tests substituted.
summary(rm.aov)
##
## Type III Repeated Measures MANOVA Tests:
##
## ------------------------------------------
##
## Term: (Intercept)
##
## Response transformation matrix:
## (Intercept)
## Months30 1
## Months36 1
## Months42 1
## Months48 1
##
## Sum of squares and products for the hypothesis:
## (Intercept)
## (Intercept) 2239488
##
## Multivariate Tests: (Intercept)
## Df test stat approx F num Df den Df Pr(>F)
## Pillai 1 0.98831 929.7391 1 11 0.0000000000055863
## Wilks 1 0.01169 929.7391 1 11 0.0000000000055863
## Hotelling-Lawley 1 84.52174 929.7391 1 11 0.0000000000055863
## Roy 1 84.52174 929.7391 1 11 0.0000000000055863
##
## Pillai ***
## Wilks ***
## Hotelling-Lawley ***
## Roy ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## ------------------------------------------
##
## Term: month.factor
##
## Response transformation matrix:
## month.factor1 month.factor2 month.factor3
## Months30 1 0 0
## Months36 0 1 0
## Months42 0 0 1
## Months48 -1 -1 -1
##
## Sum of squares and products for the hypothesis:
## month.factor1 month.factor2 month.factor3
## month.factor1 972 540 216
## month.factor2 540 300 120
## month.factor3 216 120 48
##
## Multivariate Tests: month.factor
## Df test stat approx F num Df den Df Pr(>F)
## Pillai 1 0.4274916 2.240098 3 9 0.15284
## Wilks 1 0.5725084 2.240098 3 9 0.15284
## Hotelling-Lawley 1 0.7466993 2.240098 3 9 0.15284
## Roy 1 0.7466993 2.240098 3 9 0.15284
##
## Univariate Type III Repeated-Measures ANOVA Assuming Sphericity
##
## Sum Sq num Df Error SS den Df F value Pr(>F)
## (Intercept) 559872 1 6624 11 929.7391 0.000000000005586 ***
## month.factor 552 3 2006 33 3.0269 0.04322 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Mauchly Tests for Sphericity
##
## Test statistic p-value
## month.factor 0.24265 0.017718
##
##
## Greenhouse-Geisser and Huynh-Feldt Corrections
## for Departure from Sphericity
##
## GG eps Pr(>F[GG])
## month.factor 0.60954 0.07479 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## HF eps Pr(>F[HF])
## month.factor 0.7248502 0.06353773
Tanto el test de Greenhouse-Geisser (GG) como el test de Huynh-Feldt (HF) se basan en el valor de \(\varepsilon\) que indica en qué medida la matriz de covarianza se aleja del supuesto de esfericidad. A medida que \(\varepsilon\) se aleja de 1 más se aleja la matriz de covaranza del supuesto de esfericidad. Como se observa en la tabla de resultados GG (\(\varepsilon=.61\)) es más conservador que HF (\(\varepsilon=.72\)). No obstante, en ambos casos el valor ajustado de F no es estadísticamente significativo, p > .05. El test de HF es preferible porque produce valores más ajustados a \(\alpha\) nominal (T&F, 2007, p. 287).
El cálculo de \(\omega^2\) sigue la misma lógica que vimos para el caso de ANOVA entre-sujetos usando la siguiente fórmula4 T&F (2007) usan \(\omega^2_p\) (omega cuadrado parcial) que no considera el efecto de los sujetos en el error, por lo que suele arrojar valores demasiado altos.
\[\omega^2=\frac{(a-1)(MS_A-MS_{A\times S})}{SS_{total}+MS_S} \] Usando como referencia los resultados del modelo anterior y reemplazando en la fórmula obtenemos:
rm.aov<-aov(Values~Month+Error(ID/Month),data=d1_long)
summary(rm.aov)
##
## Error: ID
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 11 6624 602.2
##
## Error: ID:Month
## Df Sum Sq Mean Sq F value Pr(>F)
## Month 3 552 184.00 3.027 0.0432 *
## Residuals 33 2006 60.79
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#SS total
6624+552+2006
## [1] 9182
#La suma de cuadrado de los residuos corresponde a error asociado a los sujetos (ID)
\[\omega^2=\frac{3/(184-60.79)}{9182+(6624/11)}=.04\]
Esto es, la edad de los niños explica aproximadamente un 4% de la varianza de sus puntajes de inteligencia.
Al igual que vimos en ANOVA entre-sujetos podemos obtener una medida del tamaño del efecto ( d) que sea independiente de la escala de medición utilizada. Para calcular la varianza error que usaremos en el denominador del cálculo de d tenemos que tener en consideración que el error del factor A es ahora la sumatoria de \(SS_S\) y \(SS_{A\times S}\). En ANOVA entre-sujetos el error no distinguía entre el error atribuible a los sujetos y la interacción entre el factor y los sujetos. Luego, la estimación de la desviación estándar está dada por:
\[sd=\sqrt{\frac{SS_S+SS_{A\times S}}{a(n-1)}}\] Por lo que,
\[sd=\sqrt{\frac{6624+2006}{4(12-1)}}=14.00\] En nuestra data tenemos las siguientes medias:
#MARGIN = 1 se obtiene las medias de cada fila
#MARGIN = 2 se obtiene las medias de cada columna
apply(d1,MARGIN = 2, FUN = "mean")
## Months30 Months36 Months42 Months48
## 103 107 110 112
Luego, la diferencia estandarizada ( d) entre la inteligencia al mes 48 y al mes 30 sería (112-103)/14=0.64
Tal como vimos en relación a ANOVA entre sujetos, es posible usar contrastes para evaluar diferencias entre medias o grupos de medias. Sin embargo, en RM-ANOVA es usualmente interesante evaluar si existe una tendencia. En el ejemplo, tenemos que las medias de los grupos van subiendo progresivamente, desde 103 hasta 112. Imaginemos que este fuese un diseño entre-sujetos (niños distintos en cada grupo)
aov1<-aov(Values~Month, data=d1_long)
summary(aov1)
## Df Sum Sq Mean Sq F value Pr(>F)
## Month 3 552 184.0 0.938 0.43
## Residuals 44 8630 196.1
Podemos hacer un contraste para evaluar la diferencia entre el grupo de niños entre 30 y 36 meses y el grupo de niños entre 42 y 48 meses.5 Recordemos que la suma de los contrastes debe ser 0 y que idealmente los contrastes deben sumar |1|.
require(emmeans)
## Loading required package: emmeans
aov1.emm = emmeans(aov1, specs =~Month)
Contrasts.1 = list(m30m36_vs_m42m48 = c(1/2,1/2,-1/2,-1/2))
contrast(aov1.emm, Contrasts.1)
## contrast estimate SE df t.ratio p.value
## m30m36_vs_m42m48 -6 4.04 44 -1.484 0.1449
Sin embargo, en este caso es más interesante evaluar si hay una progresión lineal entre el mes 30 y el mes 42. En este caso tenemos 4 niveles (1,2,3, y 4). Construimos los contrastes como la diferencia entre cada nivel y la media de los 4 niveles (i.e., 2.5).
\[c_1=(1-2.5)=-1.5\] \[c_2=(2-2.5)=-0.5\]
\[c_3=(3-2.5)=0.5\] \[c_4=(2-2.5)=-0.5\] Luego, el valor predicho para el contraste es:
\[\hat\psi=-1.5(103)-0.5(107)+0.5(110)+1.5(112)=15\]
El valor estimado de \(\hat\psi\) es 15, tal como se obtiene mediante el paquete emmeans que ya vimos antes.
require(emmeans)
aov1.emm = emmeans(aov1, specs =~Month)
Contrasts.2 = list(lineal = c(-1.5,-0.5, 0.5,1.5))
contrast(aov1.emm, Contrasts.2)
## contrast estimate SE df t.ratio p.value
## lineal 15 9.04 44 1.659 0.1042
Sin embargo, el valor p para el contraste es > .05, lo que es consistente con los resultados iniciales de ANOVA. Sin embargo, este es el resultado ignorando el efecto de los sujetos. El suma de cuadrados para un contraste en el contexto de RM-ANOVA se obtiene mediante:
\[F=\frac{SS_\psi}{MS_{A\times S}}\] donde \(SS_\psi\) se obtiene mediante:
\[SS_\psi=\frac{n(\hat\psi)^2}{\sum{c^2_j}}\]
En nuestro caso, tenemos:
\[SS_\psi=\frac{12(15)^2}{-1.5^2-0.5^2+0.5^2+1.5^2}=\frac{2500}{5}=540\]
\[F=\frac{540}{60.79}=8.88\]
Podemos intentar resolver el mismo problema con el paquete emmeans usando los contrastes especificados pero teniendo cuidado que ahora el modelo incorpore el efecto de los sujetos.
rm.aov<-aov(Values~Month+Error(ID/Month),data=d1_long)
summary(rm.aov)
##
## Error: ID
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 11 6624 602.2
##
## Error: ID:Month
## Df Sum Sq Mean Sq F value Pr(>F)
## Month 3 552 184.00 3.027 0.0432 *
## Residuals 33 2006 60.79
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rm.aov.emm = emmeans(rm.aov, specs =~Month)
## Note: re-fitting model with sum-to-zero contrasts
Contrasts.3 = list(lineal = c(-1.5,-0.5, 0.5,1.5))
contrast(rm.aov.emm, Contrasts.3)
## contrast estimate SE df t.ratio p.value
## lineal 15 5.03 33 2.980 0.0054
En este caso, el valor t resultante es estadísticamente significativo. Si elevamos el valor t al cuadrado obtenemos el valor F calculado en el paso anterior.6 ¡BAM!
\[t^2=F=8.88\] Habiendo dicho todo lo anterior, en el caso de RM-ANOVA casi siempre se viola el supuesto de esfericidad, en cuyo caso los resultados obtenidos a través de este procedimiento no son correctos.
Es posible analizar modelos con más de un factor intra-sujetos. En el siguiente ejemplo, se le presentó la letra T o I a 10 participantes. En algunas ocasiones la letra objetivo (T o I) aparece en un grupo con otras letras (noise present) y en otras aparece sola (noise absent). Adicionalmente, la letra objetivo se muestra al centro de la pantalla (0°) o desplazada 4° y 8°. Por lo tanto, cada persona tiene 6 puntajes, uno para cada combinación de los factores. Por lo tanto en este diseño hay dos efectos principales (ruido y grado de rotación, con 2 y 3 niveles respectivamente) más un efecto de interacción (ruido \(\times\) grado de rotación)
kable(d)
| Absent0 | Absent4 | Absent8 | Present0 | Present4 | Present8 |
|---|---|---|---|---|---|
| 420 | 420 | 480 | 480 | 600 | 780 |
| 420 | 480 | 480 | 360 | 480 | 600 |
| 480 | 480 | 540 | 660 | 780 | 780 |
| 420 | 540 | 540 | 480 | 780 | 900 |
| 540 | 660 | 540 | 480 | 660 | 720 |
| 360 | 420 | 360 | 360 | 480 | 540 |
| 480 | 480 | 600 | 540 | 720 | 840 |
| 480 | 600 | 660 | 540 | 720 | 900 |
| 540 | 600 | 540 | 480 | 720 | 780 |
| 480 | 420 | 540 | 540 | 660 | 780 |
Para poder analizar la data vamos a llevarla del formato ancho (wide) a un formato largo (long) donde una columna representa los niveles de la variables independiente intra-sujeto. Además, tendremos cuidado de decirle a R que las variables independientes son factores.
require(AMCP)
data("chapter_12_table_1")
# Add an ID variable (by row number)
C12_T1_PP <- chapter_12_table_1
C12_T1_PP$ID <- as.factor(1:nrow(C12_T1_PP))
# Note that the "sep=-2" partitions between the 1st and 2nd value from the end.
# The "-ID" here means to leave ID as it is (i.e., without "gathering" it). We
# use "Noise.Angle" variable before seperating into the group and the angle.
C12_T1_PP = C12_T1_PP %>%
gather(key=Noise.Angle, value=Reaction_Time, -ID) %>%
separate(col=Noise.Angle, into=c("Noise", "Angle"), sep=-1) %>%
arrange(ID, Noise, Angle)
# Display the data
C12_T1_PP
## ID Noise Angle Reaction_Time
## 1 1 Absent 0 420
## 2 1 Absent 4 420
## 3 1 Absent 8 480
## 4 1 Present 0 480
## 5 1 Present 4 600
## 6 1 Present 8 780
## 7 2 Absent 0 420
## 8 2 Absent 4 480
## 9 2 Absent 8 480
## 10 2 Present 0 360
## 11 2 Present 4 480
## 12 2 Present 8 600
## 13 3 Absent 0 480
## 14 3 Absent 4 480
## 15 3 Absent 8 540
## 16 3 Present 0 660
## 17 3 Present 4 780
## 18 3 Present 8 780
## 19 4 Absent 0 420
## 20 4 Absent 4 540
## 21 4 Absent 8 540
## 22 4 Present 0 480
## 23 4 Present 4 780
## 24 4 Present 8 900
## 25 5 Absent 0 540
## 26 5 Absent 4 660
## 27 5 Absent 8 540
## 28 5 Present 0 480
## 29 5 Present 4 660
## 30 5 Present 8 720
## 31 6 Absent 0 360
## 32 6 Absent 4 420
## 33 6 Absent 8 360
## 34 6 Present 0 360
## 35 6 Present 4 480
## 36 6 Present 8 540
## 37 7 Absent 0 480
## 38 7 Absent 4 480
## 39 7 Absent 8 600
## 40 7 Present 0 540
## 41 7 Present 4 720
## 42 7 Present 8 840
## 43 8 Absent 0 480
## 44 8 Absent 4 600
## 45 8 Absent 8 660
## 46 8 Present 0 540
## 47 8 Present 4 720
## 48 8 Present 8 900
## 49 9 Absent 0 540
## 50 9 Absent 4 600
## 51 9 Absent 8 540
## 52 9 Present 0 480
## 53 9 Present 4 720
## 54 9 Present 8 780
## 55 10 Absent 0 480
## 56 10 Absent 4 420
## 57 10 Absent 8 540
## 58 10 Present 0 540
## 59 10 Present 4 660
## 60 10 Present 8 780
# Examining the structure of the data we see that "Angle" and "Noise" are not factors,
# thus the following code.
C12_T1_PP$Angle <- as.factor(C12_T1_PP$Angle)
C12_T1_PP$Noise <- as.factor(C12_T1_PP$Noise)
str(C12_T1_PP)
## 'data.frame': 60 obs. of 4 variables:
## $ ID : Factor w/ 10 levels "1","2","3","4",..: 1 1 1 1 1 1 2 2 2 2 ...
## $ Noise : Factor w/ 2 levels "Absent","Present": 1 1 1 2 2 2 1 1 1 2 ...
## $ Angle : Factor w/ 3 levels "0","4","8": 1 2 3 1 2 3 1 2 3 1 ...
## $ Reaction_Time: int 420 420 480 480 600 780 420 480 480 360 ...
Análisis de la data
Repeated.Measures.ANOVA <- aov(Reaction_Time ~ Angle + Noise + Angle*Noise + Error(ID/Angle*Noise), data=C12_T1_PP)
summary(Repeated.Measures.ANOVA)
##
## Error: ID
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 9 292140 32460
##
## Error: Noise
## Df Sum Sq Mean Sq
## Noise 1 285660 285660
##
## Error: ID:Angle
## Df Sum Sq Mean Sq F value Pr(>F)
## Angle 2 289920 144960 40.72 0.000000209 ***
## Residuals 18 64080 3560
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Error: ID:Noise
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 9 76140 8460
##
## Error: ID:Angle:Noise
## Df Sum Sq Mean Sq F value Pr(>F)
## Angle:Noise 2 105120 52560 45.31 0.0000000942 ***
## Residuals 18 20880 1160
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La complejidad del análisis reside en determinar para cada efecto cuál es el error apropiado. En general, el denominador de F es la interacción de sujetos con el efecto investigado
\[F=\frac{MS_{effect}}{MS_{effect \times S}}\]
Por ejemplo, para el efecto del ruido, tenemos que la media cuadrática para este efecto es 285.660 con 1 df. El denominador de este efecto sería la media cuadrática de ruido \(\times\) sujeto, que es 8.460 con 9 df. Por lo tanto el efecto de este factor es:
\[F=\frac{285660}{8460}=33.77\] El valor crítico para F en este caso es 5.12 por lo que F observado es estadísticamente significativo
qf(.95,1,9)
## [1] 5.117355
En este caso tenemos un factor inter-sujeto además del factor intra-sujeto. Usaremos la data de Tabachnick y Fidell (2007, p.324) para ejemplificar el análisis
d_wide <- read.table(header=TRUE, text="
book month1 month2 month3
1 science 1 3 6
2 science 1 4 8
3 science 3 3 6
4 science 5 5 7
5 science 2 4 5
6 mystery 3 1 0
7 mystery 4 4 2
8 mystery 5 3 2
9 mystery 4 2 0
10 mystery 4 5 3
11 romance 4 2 0
12 romance 2 6 1
13 romance 3 3 3
14 romance 6 2 1
15 romance 3 3 2
")
###################
## Esta sintaxis permite tener una versión de la data
## donde el factor está representado en una columna
## Para más detalles ver
## http://www.cookbook-r.com/Manipulating_data/Converting_data_between_wide_and_long_format/
d_wide$Subject<-as.factor(1:nrow(d_wide))
library(tidyr)
d_long<-gather(d_wide,month,n_novels,month1:month3,factor_key = TRUE)
str(d_long)
## 'data.frame': 45 obs. of 4 variables:
## $ book : Factor w/ 3 levels "mystery","romance",..: 3 3 3 3 3 1 1 1 1 1 ...
## $ Subject : Factor w/ 15 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ month : Factor w/ 3 levels "month1","month2",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ n_novels: int 1 1 3 5 2 3 4 5 4 4 ...
El análisis en este caso consiste en agregar los factores inter- e inter-sujetos y su interacción especificando como denominador los factores intrasujeto (en este caso Subject y month)
Repeated.Measures.ANOVA <- aov(n_novels ~ book + month + book*month + Error(Subject/month), data=d_long)
summary(Repeated.Measures.ANOVA)
##
## Error: Subject
## Df Sum Sq Mean Sq F value Pr(>F)
## book 2 20.58 10.29 4.677 0.0315 *
## Residuals 12 26.40 2.20
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Error: Subject:month
## Df Sum Sq Mean Sq F value Pr(>F)
## month 2 0.71 0.356 0.229 0.797
## book:month 4 71.42 17.856 11.520 0.0000231 ***
## Residuals 24 37.20 1.550
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Lo importante en este caso es entender cuál es denominador para la media cuadrática de cada efecto. Como se ve a continuación, el error depende del efecto que se está evaluando. Si el factor inter-sujeto es A y el factor intrasujeto es B, F se calcula de la siguiente manera:
\[F=\frac{MS_A}{MS_{S/A}}\] \[F=\frac{MS_B}{MS_{B\times S/A}}\] \[F=\frac{MS_{A\times B}}{MS_{B\times S/A}}\]