# Simulate or load the Latin square dataset
# Example dataset
data <- data.frame(
  Treatment = factor(rep(c("A", "B", "C"), each = 3)),
  Block1 = factor(rep(c("Block1_1", "Block1_2", "Block1_3"), 3)),
  Block2 = factor(c("Block2_1", "Block2_2", "Block2_3", 
                    "Block2_2", "Block2_3", "Block2_1",
                    "Block2_3", "Block2_1", "Block2_2")),
  Response = c(15, 18, 20, 14, 19, 22, 13, 17, 21)
)
head(data)
##   Treatment   Block1   Block2 Response
## 1         A Block1_1 Block2_1       15
## 2         A Block1_2 Block2_2       18
## 3         A Block1_3 Block2_3       20
## 4         B Block1_1 Block2_2       14
## 5         B Block1_2 Block2_3       19
## 6         B Block1_3 Block2_1       22
# Load library
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Fit the model
latin_square_model <- aov(Response ~ Treatment + Block1 + Block2, data = data)

# Display ANOVA table
summary(latin_square_model)
##             Df Sum Sq Mean Sq F value Pr(>F)  
## Treatment    2   2.67    1.33    1.00 0.5000  
## Block1       2  74.00   37.00   27.75 0.0348 *
## Block2       2   0.67    0.33    0.25 0.8000  
## Residuals    2   2.67    1.33                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Sum of squares calculations
SST <- sum((data$Response - mean(data$Response))^2)
SSTr <- sum((tapply(data$Response, data$Treatment, mean) - mean(data$Response))^2)
SSB1 <- sum((tapply(data$Response, data$Block1, mean) - mean(data$Response))^2)
SSB2 <- sum((tapply(data$Response, data$Block2, mean) - mean(data$Response))^2)
SSE <- SST - SSTr - SSB1 - SSB2

list(SST = SST, SSTr = SSTr, SSB1 = SSB1, SSB2 = SSB2, SSE = SSE)
## $SST
## [1] 80
## 
## $SSTr
## [1] 0.8888889
## 
## $SSB1
## [1] 24.66667
## 
## $SSB2
## [1] 0.2222222
## 
## $SSE
## [1] 54.22222
# F-ratio calculations
MS_T <- SSTr / (length(unique(data$Treatment)) - 1)
MS_B1 <- SSB1 / (length(unique(data$Block1)) - 1)
MS_B2 <- SSB2 / (length(unique(data$Block2)) - 1)
MSE <- SSE / ((length(unique(data$Treatment)) - 1) * 
              (length(unique(data$Treatment)) - 2))

F_T <- MS_T / MSE
F_B1 <- MS_B1 / MSE
F_B2 <- MS_B2 / MSE

list(F_T = F_T, F_B1 = F_B1, F_B2 = F_B2)
## $F_T
## [1] 0.01639344
## 
## $F_B1
## [1] 0.454918
## 
## $F_B2
## [1] 0.004098361