Table of Contents

E.g. 1

rep.meas.anova.csv

###################################################
###################################################
###################################################

# data
df <- data.frame(patient=rep(1:5, each=4),
                 drug=rep(1:4, times=5),
                 response=c(30, 28, 16, 34,
                            14, 18, 10, 22,
                            24, 20, 18, 30,
                            38, 34, 20, 44,
                            26, 28, 14, 30))

#view data
df
write.csv(df, file="rep.meas.anova.csv")


#fit repeated measures ANOVA model
df$drug <- factor(df$drug)
df$patient <- factor(df$patient)

# Error(patient) = patient error should be isolated
m.aov <- aov(response ~ drug 
             + Error(patient), 
             data = df)
#view model summary
summary(m.aov)

# Error(patient/drug) = patient error embedded in drug
# the same thing
# the latter should be preferred
m2.aov <- aov(response ~ drug 
              + Error(patient/drug), 
              data = df)
summary(m2.aov)

# check this 
m3.aov <- aov(response ~ drug, data = df)
summary(m3.aov)

# check probability level (pr)
1 - pf(24.75886525, 3, 12)
# or 
library(broom)
fit <- tidy(m2.aov)
fit
fit$statistic[2]
1 - pf(fit$statistic[2], 3, 12)
# A one-way repeated measures ANOVA was conducted 
# on five individuals to examine the effect that 
# four different drugs had on response time.

# Results showed that the type of drug used lead 
# to statistically significant differences in 
# response time (F(3, 12) = 24.76, p < 0.001).

# A one-way repeated measures ANOVA was conducted 
# on five individuals to examine the effect that 
# four different drugs had on response time.

# Results showed that the type of drug used lead 
# to statistically significant differences in 
# response time (F(3, 12) = 24.76, p < 0.001).
> # data
> df <- data.frame(patient=rep(1:5, each=4),
+                  drug=rep(1:4, times=5),
+                  response=c(30, 28, 16, 34,
+                             14, 18, 10, 22,
+                             24, 20, 18, 30,
+                             38, 34, 20, 44,
+                             26, 28, 14, 30))
> 
> #view data
> df
   patient drug response
1        1    1       30
2        1    2       28
3        1    3       16
4        1    4       34
5        2    1       14
6        2    2       18
7        2    3       10
8        2    4       22
9        3    1       24
10       3    2       20
11       3    3       18
12       3    4       30
13       4    1       38
14       4    2       34
15       4    3       20
16       4    4       44
17       5    1       26
18       5    2       28
19       5    3       14
20       5    4       30
> write.csv(df, file="rep.meas.anova.csv")
> 
> 
> #fit repeated measures ANOVA model
> df$drug <- factor(df$drug)
> df$patient <- factor(df$patient)
> 
> # Error(patient) = patient error should be isolated
> m.aov <- aov(response ~ drug 
+              + Error(patient), 
+              data = df)
> #view model summary
> summary(m.aov)

Error: patient
          Df Sum Sq Mean Sq F value Pr(>F)
Residuals  4  680.8   170.2               

Error: Within
          Df Sum Sq Mean Sq F value   Pr(>F)    
drug       3  698.2   232.7   24.76 1.99e-05 ***
Residuals 12  112.8     9.4                     
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> 
> # Error(patient/drug) = patient error embedded in drug
> # the same thing
> # the latter should be preferred
> m2.aov <- aov(response ~ drug 
+               + Error(patient/drug), 
+               data = df)
> summary(m2.aov)

Error: patient
          Df Sum Sq Mean Sq F value Pr(>F)
Residuals  4  680.8   170.2               

Error: patient:drug
          Df Sum Sq Mean Sq F value   Pr(>F)    
drug       3  698.2   232.7   24.76 1.99e-05 ***
Residuals 12  112.8     9.4                     
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> 
> # check this 
> m3.aov <- aov(response ~ drug, data = df)
> summary(m3.aov)
            Df Sum Sq Mean Sq F value Pr(>F)  
drug         3  698.2   232.7   4.692 0.0155 *
Residuals   16  793.6    49.6                 
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> 
> # check probability level (pr)
> 1 - pf(24.75886525, 3, 12)
[1] 1.992501e-05
> # or 
> library(broom)
> fit <- tidy(m2.aov)
> fit
# A tibble: 3 × 7
  stratum      term     df sumsq meansq statistic  p.value
  <chr>        <chr> <dbl> <dbl>  <dbl>     <dbl>    <dbl>
1 patient      Resi…     4  681.  170.       NA   NA      
2 patient:drug drug      3  698.  233.       24.8  1.99e-5
3 patient:drug Resi…    12  113.    9.4      NA   NA      
> fit$statistic[2]
[1] 24.75887
> 1 - pf(fit$statistic[2], 3, 12)
[1] 1.992501e-05
> 
> 

E.g. 2

rep.meas.anova.eg.movie.review.csv

# the second
movrev <- data.frame(reviewer=rep(1:5, each=3),
                 movie=rep(1:3, times=5),
                 score=c(88, 84, 92,
                            76, 78, 90,
                            78, 94, 95,
                            80, 83, 88, 
                            82, 90, 99))

#view data
movrev
write.csv(movrev, file="rep.meas.anova.eg.movie.review.csv")

movrev$movie <- factor(movrev$movie)
movrev$reviewer <- factor(movrev$reviewer)

# Error(reviewer) = reviewer error should be isolated
# The above is the same as Error(reviewer/movie)
m.aov <- aov(score ~ movie 
             + Error(reviewer), 
             data = movrev)
m2.aov <- aov(score ~ movie
              + Error(reviewer/movie),
              data = movrev)

#view model summary
summary(m.aov)
summary(m2.aov)

# pairwise.t.test(movrev$score, movrev$movie, paired = T, p.adjust.method = "bonf")
attach(movrev)
pairwise.t.test(score, movie, paired = T, p.adjust.method = "bonf")
detach(movrev)
# or
with(movrev, 
     pairwise.t.test(score, movie, 
                     paired = T, 
                     p.adjust.method = "bonf"))
# the second
movrev <- data.frame(reviewer=rep(1:5, each=3),
                 movie=rep(1:3, times=5),
                 score=c(88, 84, 92,
                            76, 78, 90,
                            78, 94, 95,
                            80, 83, 88, 
                            82, 90, 99))

#view data
movrev
write.csv(movrev, file="rep.meas.anova.eg.movie.review.csv")

movrev$movie <- factor(movrev$movie)
movrev$reviewer <- factor(movrev$reviewer)

# Error(reviewer) = reviewer error should be isolated
# The above is the same as Error(reviewer/movie)
m.aov <- aov(score ~ movie 
             + Error(reviewer), 
             data = movrev)
m2.aov <- aov(score ~ movie
              + Error(reviewer/movie),
              data = movrev)

#view model summary
summary(m.aov)
summary(m2.aov)

# pairwise.t.test(movrev$score, movrev$movie, paired = T, p.adjust.method = "bonf")
attach(movrev)
pairwise.t.test(score, movie, paired = T, p.adjust.method = "bonf")
detach(movrev)
# or
with(movrev, 
     pairwise.t.test(score, movie, 
                     paired = T, 
                     p.adjust.method = "bonf"))
> # the second
> movrev <- data.frame(reviewer=rep(1:5, each=3),
+                  movie=rep(1:3, times=5),
+                  score=c(88, 84, 92,
+                             76, 78, 90,
+                             78, 94, 95,
+                             80, 83, 88, 
+                             82, 90, 99))
> 
> #view data
> movrev
   reviewer movie score
1         1     1    88
2         1     2    84
3         1     3    92
4         2     1    76
5         2     2    78
6         2     3    90
7         3     1    78
8         3     2    94
9         3     3    95
10        4     1    80
11        4     2    83
12        4     3    88
13        5     1    82
14        5     2    90
15        5     3    99
> write.csv(movrev, file="rep.meas.anova.eg.movie.review.csv")
> 
> movrev$movie <- factor(movrev$movie)
> movrev$reviewer <- factor(movrev$reviewer)
> 
> # Error(reviewer) = reviewer error should be isolated
> # The above is the same as Error(reviewer/movie)
> m.aov <- aov(score ~ movie 
+              + Error(reviewer), 
+              data = movrev)
> m2.aov <- aov(score ~ movie
+               + Error(reviewer/movie),
+               data = movrev)
> 
> #view model summary
> summary(m.aov)

Error: reviewer
          Df Sum Sq Mean Sq F value Pr(>F)
Residuals  4  173.7   43.43               

Error: Within
          Df Sum Sq Mean Sq F value  Pr(>F)   
movie      2  363.3  181.67   10.19 0.00632 **
Residuals  8  142.7   17.83                   
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> summary(m2.aov)

Error: reviewer
          Df Sum Sq Mean Sq F value Pr(>F)
Residuals  4  173.7   43.43               

Error: reviewer:movie
          Df Sum Sq Mean Sq F value  Pr(>F)   
movie      2  363.3  181.67   10.19 0.00632 **
Residuals  8  142.7   17.83                   
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> 
> # pairwise.t.test(movrev$score, movrev$movie, paired = T, p.adjust.method = "bonf")
> attach(movrev)
The following objects are masked from movrev (pos = 12):

    movie, reviewer, score

The following objects are masked from movrev (pos = 14):

    movie, reviewer, score

> pairwise.t.test(score, movie, paired = T, p.adjust.method = "bonf")

	Pairwise comparisons using paired t tests 

data:  score and movie 

  1     2    
2 0.628 -    
3 0.029 0.060

P value adjustment method: bonferroni 
> detach(movrev)
> # or
> with(movrev, 
+      pairwise.t.test(score, movie, 
+                      paired = T, 
+                      p.adjust.method = "bonf"))

	Pairwise comparisons using paired t tests 

data:  score and movie 

  1     2    
2 0.628 -    
3 0.029 0.060

P value adjustment method: bonferroni 
> 
> 

E.g.2 by hand

####
# by hand
####
movrev
tapply(movrev$score, list(reviewer, movie), mean) # 각 셀의 평균값
m.tot <- mean(movrev$score)


m.by.movie <- tapply(movrev$score, list(movie), mean)
m.by.er <- tapply(movrev$score, list(reviewer), mean)

ss.bet <- sum(5*(m.tot-m.by.movie)^2)
df.bet <- 3-1 # 영화 가짓수 - 1
ms.bet <- ss.bet / df.bet

var.by.movie <- tapply(movrev$score, list(movie), var)
ss.with <- sum(var.by.movie*4)
df.with <- 4 + 4 + 4
ms.with <- ss.with / df.with
ms.bet
ms.with

ss.sub <- sum(3 * (m.tot-m.by.er)^2) # 3 treatments (movies)
df.sub <- 5 - 1 # 5 persons - 1
ms.sub <- ss.sub/df.sub
ms.sub

ss.res <- ss.with - ss.sub
ss.res
df.res <- 4 * 2 # (N-1)*(k-1)
ms.res <- ss.res/df.res
ms.res

f.cal <- ms.bet/ms.res
f.cal
pf(f.cal, 2, 8, lower.tail = F)

ss.bet
ss.with
ss.sub
ss.res
df.bet
df.with
df.sub
df.res
ms.bet 
ms.with
ms.sub
ms.res

# check
ss.with == ss.sub + ss.res
df.with == df.sub + df.res
summary(m.aov)
#
# no embedded
# understand the meaning of embedded
m0.aov <- aov(score ~ movie, data = movrev)
summary(m0.aov)
summary(m.aov)

> ####
> # by hand
> ####
> movrev
   reviewer movie score
1         1     1    88
2         1     2    84
3         1     3    92
4         2     1    76
5         2     2    78
6         2     3    90
7         3     1    78
8         3     2    94
9         3     3    95
10        4     1    80
11        4     2    83
12        4     3    88
13        5     1    82
14        5     2    90
15        5     3    99
> tapply(movrev$score, list(reviewer, movie), mean) # 각 셀의 평균값
   1  2  3
1 88 84 92
2 76 78 90
3 78 94 95
4 80 83 88
5 82 90 99
> m.tot <- mean(movrev$score)
> 
> 
> m.by.movie <- tapply(movrev$score, list(movie), mean)
> m.by.er <- tapply(movrev$score, list(reviewer), mean)
> 
> ss.bet <- sum(5*(m.tot-m.by.movie)^2)
> df.bet <- 3-1 # 영화 가짓수 - 1
> ms.bet <- ss.bet / df.bet
> 
> var.by.movie <- tapply(movrev$score, list(movie), var)
> ss.with <- sum(var.by.movie*4)
> df.with <- 4 + 4 + 4
> ms.with <- ss.with / df.with
> ms.bet
[1] 181.6667
> ms.with
[1] 26.36667
> 
> ss.sub <- sum(3 * (m.tot-m.by.er)^2) # 3 treatments (movies)
> df.sub <- 5 - 1 # 5 persons - 1
> ms.sub <- ss.sub/df.sub
> ms.sub
[1] 43.43333
> 
> ss.res <- ss.with - ss.sub
> ss.res
[1] 142.6667
> df.res <- 4 * 2 # (N-1)*(k-1)
> ms.res <- ss.res/df.res
> ms.res
[1] 17.83333
> 
> f.cal <- ms.bet/ms.res
> f.cal
[1] 10.18692
> pf(f.cal, 2, 8, lower.tail = F)
[1] 0.006319577
> 
> ss.bet
[1] 363.3333
> ss.with
[1] 316.4
> ss.sub
[1] 173.7333
> ss.res
[1] 142.6667
> df.bet
[1] 2
> df.with
[1] 12
> df.sub
[1] 4
> df.res
[1] 8
> ms.bet 
[1] 181.6667
> ms.with
[1] 26.36667
> ms.sub
[1] 43.43333
> ms.res
[1] 17.83333
> 
> # check
> ss.with == ss.sub + ss.res
[1] TRUE
> df.with == df.sub + df.res
[1] TRUE
> summary(m.aov)

Error: reviewer
          Df Sum Sq Mean Sq F value Pr(>F)
Residuals  4  173.7   43.43               

Error: Within
          Df Sum Sq Mean Sq F value  Pr(>F)   
movie      2  363.3  181.67   10.19 0.00632 **
Residuals  8  142.7   17.83                   
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> #
> # no embedded
> # understand the meaning of embedded
> m0.aov <- aov(score ~ movie, data = movrev)
> summary(m0.aov)
            Df Sum Sq Mean Sq F value Pr(>F)  
movie        2  363.3  181.67    6.89 0.0102 *
Residuals   12  316.4   26.37                 
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> summary(m.aov)

Error: reviewer
          Df Sum Sq Mean Sq F value Pr(>F)
Residuals  4  173.7   43.43               

Error: Within
          Df Sum Sq Mean Sq F value  Pr(>F)   
movie      2  363.3  181.67   10.19 0.00632 **
Residuals  8  142.7   17.83                   
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> 
>
>