linetester <- function(replications, lines, testers, y) {
replications <- as.factor(replications)
lines <- as.factor(lines)
testers <- as.factor(testers)
datos <- data.frame(
Replications = replications,
Lines = lines,
Testers = testers,
Y = y
)
n_r <- nlevels(datos$Replications)
n_l <- nlevels(datos$Lines)
n_t <- nlevels(datos$Testers)
# ---- crosses (complete rows) and parents (line or tester absent) ----
datos2 <- na.omit(datos) # crosses
datos3 <- subset(datos, is.na(datos$Lines) | is.na(datos$Testers)) # parents
# ---- ANOVA with parents: Replications, Treatments, Error ----
Treatments <- as.factor(paste(datos$Lines, datos$Testers))
modelo1 <- aov(Y ~ Replications + Treatments, data = datos)
matriz1 <- as.matrix(anova(modelo1))
# ---- Lines, Testers, Lines x Testers: fitted on the CROSSES only ----
modelo4 <- aov(Y ~ Lines * Testers, data = datos2)
matriz4 <- as.matrix(anova(modelo4))
# ---- Parents ----
Parents <- as.factor(paste(datos3$Lines, datos3$Testers))
modelo2 <- aov(Y ~ Parents, data = datos3)
matriz2 <- as.matrix(anova(modelo2))
# ---- Crosses ----
Crosses <- as.factor(paste(datos2$Lines, datos2$Testers))
modelo3 <- aov(Y ~ Crosses, data = datos2)
matriz3 <- as.matrix(anova(modelo3))
# ---- cell means of the crosses ----
mm_cross <- tapply(datos2$Y, datos2[, c("Lines", "Testers")], mean, na.rm = TRUE)
gm_cell <- mean(mm_cross, na.rm = TRUE)
# ---- SCA: cell - line marginal - tester marginal + grand ----
SCA <- round(
mm_cross -
outer(rowMeans(mm_cross, na.rm = TRUE),
colMeans(mm_cross, na.rm = TRUE), "+") +
gm_cell,
3
)
# ---- GCA of lines and testers, from the cell means ----
GCA.lines <- round(rowMeans(mm_cross, na.rm = TRUE) - gm_cell, 3)
GCA.testers <- round(colMeans(mm_cross, na.rm = TRUE) - gm_cell, 3)
# ---- assemble the ten-line table ----
# Parents vs. Crosses by subtraction: Treatments - Parents - Crosses.
# Only df and SS are meaningful here; columns 3-5 are recomputed below.
matriz5 <- matriz1[2, ] - matriz2[1, ] - matriz3[1, ]
matriz <- rbind(
matriz1[1:2, ], # Replications, Treatments
matriz2[1, ], # Parents
matriz5, # Parents vs. Crosses
matriz3[1, ], # Crosses
matriz4[1:3, ], # Lines, Testers, Lines x Testers
matriz1[3, ] # Error
)
matriz <- rbind(matriz, c(sum(matriz1[, 1]), sum(matriz1[, 2]), NA, NA, NA))
rownames(matriz) <- c(
"Replications", "Treatments", "Parents", "Parents vs. Crosses",
"Crosses", "Lines", "Testers", "Lines x Testers", "Error", "Total"
)
# ---- F-tests: Lines (6) and Testers (7) against Lines x Testers (8);
# every other source against Error (9) ----
for (i in 1:9) {
matriz[i, 3] <- matriz[i, 2] / matriz[i, 1]
matriz[i, 4] <- matriz[i, 3] / matriz[9, 3]
matriz[i, 5] <- 1 - pf(matriz[i, 4], matriz[i, 1], matriz[9, 1])
if (i == 6 || i == 7) {
matriz[i, 4] <- matriz[i, 3] / matriz[8, 3]
matriz[i, 5] <- 1 - pf(matriz[i, 4], matriz[i, 1], matriz[8, 1])
}
}
# ---- standard errors, with Me the Error mean square of the full table ----
Me <- matriz[9, 3]
SE <- list(
gca_line = sqrt(Me / (n_r * n_t)),
gca_tester = sqrt(Me / (n_r * n_l)),
sca = sqrt(Me / n_r),
gi_gj_line = sqrt(2 * Me / (n_r * n_t)),
gi_gj_tester = sqrt(2 * Me / (n_r * n_l)),
sij_skl = sqrt(2 * Me / n_r)
)
# ---- genetic components ----
MS_l <- matriz[6, 3]
MS_t <- matriz[7, 3]
MS_lt <- matriz[8, 3]
cov1 <- (MS_l - MS_lt) / (n_r * n_t) # Cov HS, lines
cov2 <- (MS_t - MS_lt) / (n_r * n_l) # Cov HS, testers
cov3 <- (((n_l - 1) * MS_l + (n_t - 1) * MS_t) / (n_l + n_t - 2) - MS_lt) /
(n_r * (2 * n_l * n_t - n_l - n_t)) # Cov HS, average
cov4 <- ((MS_l - Me) + (MS_t - Me) + (MS_lt - Me)) / (3 * n_r) # Cov FS, average
Fcoef <- 0
varA0 <- cov3 * (4 / (1 + Fcoef))
varD0 <- ((MS_lt - Me) / n_r) * (2 / (1 + Fcoef))
Fcoef <- 1
varA1 <- cov3 * (4 / (1 + Fcoef))
varD1 <- ((MS_lt - Me) / n_r) * (2 / (1 + Fcoef))
Genetic <- list(
Cov_HS_line = cov1,
Cov_HS_tester = cov2,
Cov_HS_avg = cov3,
Cov_FS_avg = cov4,
VarA_F0 = varA0, VarA_F1 = varA1,
VarD_F0 = varD0, VarD_F1 = varD1
)
# ---- proportional contribution to the Crosses sum of squares ----
Contributions <- list(
lines = matriz[6, 2] * 100 / matriz[5, 2],
testers = matriz[7, 2] * 100 / matriz[5, 2],
lxt = matriz[8, 2] * 100 / matriz[5, 2]
)
return(list(
ANOVA_with_parents = matriz1,
ANOVA_LxT = matriz4,
ANOVA_full = matriz,
GCA_lines = GCA.lines,
GCA_testers = GCA.testers,
SCA = SCA,
SE = SE,
Genetic = Genetic,
Contribution = Contributions
))
}