library(asreml)
library(data.table)
library(dplyr)
library(plyr)
library(tictoc)
library(stringr)

Pheno_data <- readRDS("...")

str(Pheno_data)

#### Levels for the iterations #####
Envs   <- levels(Pheno_data$Year)

#### Make a list to store Stage 1 Results #####
stgI_list <- matrix(data = list(), nrow = length(Envs), ncol = 1, 
                    dimnames = list(Envs, c("lsmeans")))

asreml.options(trace = T,maxit = 100, workspace = "2gb",pworkspace = "2gb", ai.sing = T)

options(scipen = 999, digits = 5, max.print = 999999)

tic()
for (i in Envs) {
  
  Edat <- droplevels(subset(Pheno_data, Year == i))
  
  Edat <- Edat[order(Edat$Loc),]
  
  print(i)
  print(nlevels(Edat$EntryName))
  
  mod.1 <- asreml(fixed       = value ~ EntryName,
                  random      = ~Tester + Loc + EntryName:Tester + EntryName:Loc + 
                    Trial2:Loc + Trial2:Rep:Block:Loc + 
                    Trial2:Rep:Loc,
                  residual     = ~dsum(~(units)|Loc),
                  data         = Edat)
  
  
  mod.1 <- update.asreml(mod.1)
  mod.1 <- update.asreml(mod.1)
  
  # print(summary.asreml(mod.1)$varcomp) # in case to check the varcomps
  
  blue <- predict(mod.1, classify = "EntryName",vcov = TRUE) # get the lsmeans
  blue.1 <- data.table(blue$pvals)[, c(1:3)] 
  names(blue.1) <- c("EntryName","Yield_LSM", "se")
  blue.1[ , ':='(var = se^2, smith.w = diag(solve(blue$vcov)))] # calculate the Smith's weight
  
  stgI_list[[i, "lsmeans" ]] <- blue.1 # put the results of Stage 1 in the list
  
  rm(Edat,mod.1, blue, blue.1)
}
toc()

#### Collapse the results #####
stgII_data <- data.table(ldply(stgI_list[, "lsmeans"], data.frame, .id = "Year"))

str(stgII_data)

head(stgII_data)

#### The Checks ####
checks <- readRDS(file = "...")
checks

#### This is done to remove the Checks after Stage 1 finished #####
stgII_data.II <- stgII_data[!(stgII_data$EntryName) %in% checks,]
stgII_data.II <- droplevels(stgII_data.II)

str(stgII_data.II)
head(stgII_data.II)

#### Save to RDS #####
#saveRDS(stgII_data, file = "StageII_SPData_Cyc1_2016_2018_with_Checks.rds")
#saveRDS(stgII_data.II, file = "StageII_SPData_Cyc1_2016_2018_No_Checks.rds")