data(edwards.oats)
dat <- edwards.oats
str(dat)
## 'data.frame':    3694 obs. of  7 variables:
##  $ eid   : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ year  : int  1997 1997 1997 1997 1997 1997 1997 1997 1997 1997 ...
##  $ loc   : Factor w/ 5 levels "Ame","Cra","Lew",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ block : Factor w/ 3 levels "B1","B2","B3": 1 1 1 1 1 1 1 1 1 1 ...
##  $ gen   : Factor w/ 80 levels "ACStewart","Belle",..: 2 4 6 7 8 9 10 11 13 14 ...
##  $ yield : num  151 172 159 152 156 ...
##  $ testwt: num  32 33.3 33.7 32.7 34.4 34.6 33.9 36.9 33.1 34.3 ...
dat$year <- as.factor(dat$year)
head(dat)
##   eid year loc block      gen yield testwt
## 1   1 1997 Ame    B1    Belle 151.1   32.0
## 2   1 1997 Ame    B1    Brawn 171.9   33.3
## 3   1 1997 Ame    B1   Burton 158.9   33.7
## 4   1 1997 Ame    B1 Chairman 151.7   32.7
## 5   1 1997 Ame    B1    Chaps 155.6   34.4
## 6   1 1997 Ame    B1  Classic 153.8   34.6
model <- lmer(yield ~ gen + 
                (1|block:loc) + 
                (1|loc:year) + 
                (1|gen:loc:year), data = dat)
summary(model)
## Linear mixed model fit by REML ['lmerMod']
## Formula: yield ~ gen + (1 | block:loc) + (1 | loc:year) + (1 | gen:loc:year)
##    Data: dat
## 
## REML criterion at convergence: 29079.9
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -4.4692 -0.5328  0.0155  0.5502  3.8282 
## 
## Random effects:
##  Groups       Name        Variance Std.Dev.
##  gen:loc:year (Intercept)  54.365   7.373  
##  loc:year     (Intercept) 793.383  28.167  
##  block:loc    (Intercept)   6.216   2.493  
##  Residual                 121.744  11.034  
## Number of obs: 3694, groups:  gen:loc:year, 1235; loc:year, 34; block:loc, 15
## 
## Fixed effects:
##                    Estimate Std. Error t value
## (Intercept)        119.6767     7.7884  15.366
## genBelle            -6.9627     6.3009  -1.105
## genBlaze            10.5086     6.3009   1.668
## genBrawn            10.7049     6.3009   1.699
## genBuff            -30.0823     7.5414  -3.989
## genBurton           -5.2953     6.4636  -0.819
## genChairman         -5.0141     7.4325  -0.675
## genChaps             8.9295     6.3009   1.417
## genClassic           6.3055     6.3009   1.001
## genDane             -0.6115     6.3009  -0.097
## genDon              -5.3498     6.3009  -0.849
## genEbeltoft          5.7662     6.4779   0.890
## genGem               1.9641     6.3009   0.312
## genHazel           -16.4270     8.2378  -1.994
## genHyproBlend      -18.2222     8.4685  -2.152
## genIA91462-4-1-6    -3.2949     6.6018  -0.499
## genIA91483-7-18-2   -8.5516     7.5237  -1.137
## genIA93227-2-1       2.8359     7.5414   0.376
## genIA93359-3         6.9674     6.8485   1.017
## genIAACE2-16-1       6.3702     7.5414   0.845
## genIAH61-3-3-4       3.1297     7.5237   0.416
## genIAK993-7-5      -24.0677    11.2543  -2.139
## genIAL24-5-1        -8.3777     8.2198  -1.019
## genIAN979-5-1-22    -1.7646     6.5940  -0.268
## genIAR56-5           5.9555     6.4985   0.916
## genIAR56-8          -0.6991     7.8412  -0.089
## genIAR66-6          12.0140     6.9349   1.732
## genIL95-1241        20.8310     6.8524   3.040
## genIN09201           7.2628     6.3020   1.152
## genIda              -0.3243     6.6338  -0.049
## genJay               8.4748     6.2931   1.347
## genJerry             0.8321     6.3009   0.132
## genJim               6.6048     6.3020   1.048
## genJud               4.0873     6.3009   0.649
## genKilldeer          8.9962     6.4028   1.405
## genLeonard           7.9280     6.8524   1.157
## genLoyal            -4.0575     6.6018  -0.615
## genMN 93272         -6.0007     7.4325  -0.807
## genMN98236          10.2224     7.5414   1.356
## genMO1022-1          4.0502     6.8485   0.591
## genMO8701            0.2635     6.8485   0.038
## genMilton           -1.6920     6.4636  -0.262
## genMoraine          -2.3979     6.4028  -0.375
## genND9816784        -6.0029     7.5414  -0.796
## genNewdak           -0.3296     7.4325  -0.044
## genOA1021-1         14.5421     7.5414   1.928
## genOA21-2            9.3174     7.5296   1.237
## genOH1086           -4.0418     7.8412  -0.515
## genOH1087           -5.4430     7.4325  -0.732
## genOH1128           -6.5585     7.8412  -0.836
## genOH1149          -12.8409     6.8628  -1.871
## genOgle              5.7586     6.3009   0.914
## genP9213A2-2-4-4-3   7.5660     6.8579   1.103
## genP971A9-7-4-1     15.9820     7.5414   2.119
## genP973A38-3-6       6.2070     7.5296   0.824
## genP976A6-9-6       16.7725     7.5296   2.228
## genPal             -25.0325     7.4325  -3.368
## genPrairie           8.1847     6.8628   1.193
## genPremier         -11.7215     7.4325  -1.577
## genReeves           -3.8906     6.6075  -0.589
## genRichard          -5.7073     6.3584  -0.898
## genRiser           -15.3922     6.3009  -2.443
## genRodeo             8.9898     6.3365   1.419
## genSD0000731        -3.6779     7.5414  -0.488
## genSD96024          12.0065     6.6075   1.817
## genSesqui            8.3360     6.4804   1.286
## genSheldon          -5.5488     6.3365  -0.876
## genStarter         -14.2558     6.3009  -2.262
## genStarter/Amag      2.1059     7.8412   0.269
## genTroy             -5.6983     6.3009  -0.904
## genValley           -5.4289     6.4636  -0.840
## genVista            -3.9432     6.3365  -0.622
## genWIX6356-1        -3.7290     6.8628  -0.543
## genWIX7541-3         6.8116     7.5272   0.905
## genWIX7822-3        10.7024     7.5414   1.419
## genWIX8177-1         5.2981     7.5414   0.703
## genWIX8179-2        21.5484     7.5414   2.857
## genWabasha           2.0297     6.4837   0.313
## genWebster          -0.4745     8.2378  -0.058
## genYoungs            0.1839     6.4779   0.028
## 
## Correlation matrix not shown by default, as p = 80 > 12.
## Use print(value, correlation=TRUE)  or
##     vcov(value)        if you need it
print(model, correlation=TRUE)
## Linear mixed model fit by REML ['lmerMod']
## Formula: yield ~ gen + (1 | block:loc) + (1 | loc:year) + (1 | gen:loc:year)
##    Data: dat
## REML criterion at convergence: 29079.87
## Random effects:
##  Groups       Name        Std.Dev.
##  gen:loc:year (Intercept)  7.373  
##  loc:year     (Intercept) 28.167  
##  block:loc    (Intercept)  2.493  
##  Residual                 11.034  
## Number of obs: 3694, groups:  gen:loc:year, 1235; loc:year, 34; block:loc, 15
## Fixed Effects:
##        (Intercept)            genBelle            genBlaze            genBrawn  
##           119.6767             -6.9627             10.5086             10.7049  
##            genBuff           genBurton         genChairman            genChaps  
##           -30.0823             -5.2953             -5.0141              8.9295  
##         genClassic             genDane              genDon         genEbeltoft  
##             6.3055             -0.6115             -5.3498              5.7662  
##             genGem            genHazel       genHyproBlend    genIA91462-4-1-6  
##             1.9641            -16.4270            -18.2222             -3.2949  
##  genIA91483-7-18-2      genIA93227-2-1        genIA93359-3      genIAACE2-16-1  
##            -8.5516              2.8359              6.9674              6.3702  
##     genIAH61-3-3-4       genIAK993-7-5        genIAL24-5-1    genIAN979-5-1-22  
##             3.1297            -24.0677             -8.3777             -1.7646  
##         genIAR56-5          genIAR56-8          genIAR66-6        genIL95-1241  
##             5.9555             -0.6991             12.0140             20.8310  
##         genIN09201              genIda              genJay            genJerry  
##             7.2628             -0.3243              8.4748              0.8321  
##             genJim              genJud         genKilldeer          genLeonard  
##             6.6048              4.0873              8.9962              7.9280  
##           genLoyal         genMN 93272          genMN98236         genMO1022-1  
##            -4.0575             -6.0007             10.2224              4.0502  
##          genMO8701           genMilton          genMoraine        genND9816784  
##             0.2635             -1.6920             -2.3979             -6.0029  
##          genNewdak         genOA1021-1           genOA21-2           genOH1086  
##            -0.3296             14.5421              9.3174             -4.0418  
##          genOH1087           genOH1128           genOH1149             genOgle  
##            -5.4430             -6.5585            -12.8409              5.7586  
## genP9213A2-2-4-4-3     genP971A9-7-4-1      genP973A38-3-6       genP976A6-9-6  
##             7.5660             15.9820              6.2070             16.7725  
##             genPal          genPrairie          genPremier           genReeves  
##           -25.0325              8.1847            -11.7215             -3.8906  
##         genRichard            genRiser            genRodeo        genSD0000731  
##            -5.7073            -15.3922              8.9898             -3.6779  
##         genSD96024           genSesqui          genSheldon          genStarter  
##            12.0065              8.3360             -5.5488            -14.2558  
##    genStarter/Amag             genTroy           genValley            genVista  
##             2.1059             -5.6983             -5.4289             -3.9432  
##       genWIX6356-1        genWIX7541-3        genWIX7822-3        genWIX8177-1  
##            -3.7290              6.8116             10.7024              5.2981  
##       genWIX8179-2          genWabasha          genWebster           genYoungs  
##            21.5484              2.0297             -0.4745              0.1839
# Residual vs Fitted plot
residuals <- resid(model)
fitted_values <- fitted(model)

res_fit_plot <- ggplot(data = data.frame(fitted = fitted_values,
                                         residuals = residuals), 
                       aes(x = fitted, y = residuals)) +
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  labs(title = "Residual vs Fitted Plot", x = "Fitted Values", y = "Residuals") +
  theme_minimal()
res_fit_plot

# Extract random effects from model
ranef_model <- ranef(model)$loc

# Plotting random effects
ranef_plot <- ggplot(data = data.frame(location = rownames(ranef_model), 
                                       effect = ranef_model[,1]), 
                     aes(x = location, y = effect)) +
  geom_bar(stat = "identity") +
  labs(title = "Random Effects of Location By Year", x = "Location x Year", y = "Random Effect") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
ranef_plot

# Predicted values (fitted values)
predicted_values <- predict(model)

pred_val <- ggplot(dat, aes(x = loc, y = yield)) +
  geom_point(aes(color = year), size = 3) +
  geom_line(aes(y = predicted_values, group = gen), 
            linetype = "dashed", color = "blue") +
  labs(title = "Observed vs Predicted yield by Genotype", 
       x = "Location", y = "Number Kernel Ears") +
  theme_minimal()
pred_val

plt_mdl11 <- plot_model(model, type = "diag")  # For fixed effects "diag"
plt_mdl11
## [[1]]
## `geom_smooth()` using formula = 'y ~ x'

## 
## [[2]]
## [[2]]$`gen:loc:year`
## `geom_smooth()` using formula = 'y ~ x'

## 
## [[2]]$`loc:year`
## `geom_smooth()` using formula = 'y ~ x'

## 
## [[2]]$`block:loc`
## `geom_smooth()` using formula = 'y ~ x'

## 
## 
## [[3]]

## 
## [[4]]
## `geom_smooth()` using formula = 'y ~ x'

plt_mdl <- plot_model(model, type = "re")  # For random effects
plt_mdl
## [[1]]

## 
## [[2]]

## 
## [[3]]