Comparison: Mandala vs lme4

Field trial analysis vs general-purpose mixed models

Overview

This tutorial compares the mandala package with lme4, the most widely-used R package for mixed models. While both can fit linear mixed models, they serve different purposes.

Background

Package Primary Focus Best For
lme4 General-purpose Any discipline
Mandala Agricultural trials Field experiments

Loading Packages

library(mandala)
library(lme4)
library(lmerTest)
library(dplyr)
library(ggplot2)

Example 1: Basic RCBD

Data Setup

set.seed(321)
n_genotypes <- 12
n_blocks <- 5

rcbd_data <- expand.grid(
  genotype = factor(paste0("G", sprintf("%02d", 1:n_genotypes))),
  block = factor(paste0("B", 1:n_blocks))
)

rcbd_data$yield <- 4500 +
  rnorm(n_genotypes, 0, 20)[as.numeric(rcbd_data$genotype)] +
  rnorm(n_blocks, 0, 10)[as.numeric(rcbd_data$block)] +
  rnorm(nrow(rcbd_data), 0, 15)

head(rcbd_data)
  genotype block    yield
1      G01    B1 4542.286
2      G02    B1 4496.306
3      G03    B1 4503.019
4      G04    B1 4513.249
5      G05    B1 4497.798
6      G06    B1 4522.072

Syntax Comparison

Mandala:

mandala(
  fixed  = yield ~ genotype,
  random = ~ block,
  data   = rcbd_data
)

lme4:

lmer(
  yield ~ genotype + (1|block),
  data = rcbd_data
)

lme4 Analysis

lme4_model <- lmer(
  yield ~ genotype + (1|block),
  data = rcbd_data,
  REML = TRUE
)

summary(lme4_model)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: yield ~ genotype + (1 | block)
   Data: rcbd_data

REML criterion at convergence: 423

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.9341 -0.7533  0.1652  0.6741  1.7233 

Random effects:
 Groups   Name        Variance Std.Dev.
 block    (Intercept) 125.5    11.20   
 Residual             221.6    14.89   
Number of obs: 60, groups:  block, 5

Fixed effects:
            Estimate Std. Error       df t value Pr(>|t|)    
(Intercept) 4529.901      8.333   19.684 543.637  < 2e-16 ***
genotypeG02  -47.166      9.415   44.000  -5.010 9.34e-06 ***
genotypeG03  -33.401      9.415   44.000  -3.548 0.000938 ***
genotypeG04  -19.832      9.415   44.000  -2.106 0.040913 *  
genotypeG05  -28.048      9.415   44.000  -2.979 0.004693 ** 
genotypeG06  -16.668      9.415   44.000  -1.770 0.083595 .  
genotypeG07  -13.595      9.415   44.000  -1.444 0.155835    
genotypeG08  -24.406      9.415   44.000  -2.592 0.012896 *  
genotypeG09  -17.345      9.415   44.000  -1.842 0.072182 .  
genotypeG10  -43.653      9.415   44.000  -4.636 3.17e-05 ***
genotypeG11  -25.541      9.415   44.000  -2.713 0.009488 ** 
genotypeG12   -1.386      9.415   44.000  -0.147 0.883608    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) gntG02 gntG03 gntG04 gntG05 gntG06 gntG07 gntG08 gntG09
genotypeG02 -0.565                                                        
genotypeG03 -0.565  0.500                                                 
genotypeG04 -0.565  0.500  0.500                                          
genotypeG05 -0.565  0.500  0.500  0.500                                   
genotypeG06 -0.565  0.500  0.500  0.500  0.500                            
genotypeG07 -0.565  0.500  0.500  0.500  0.500  0.500                     
genotypeG08 -0.565  0.500  0.500  0.500  0.500  0.500  0.500              
genotypeG09 -0.565  0.500  0.500  0.500  0.500  0.500  0.500  0.500       
genotypeG10 -0.565  0.500  0.500  0.500  0.500  0.500  0.500  0.500  0.500
genotypeG11 -0.565  0.500  0.500  0.500  0.500  0.500  0.500  0.500  0.500
genotypeG12 -0.565  0.500  0.500  0.500  0.500  0.500  0.500  0.500  0.500
            gntG10 gntG11
genotypeG02              
genotypeG03              
genotypeG04              
genotypeG05              
genotypeG06              
genotypeG07              
genotypeG08              
genotypeG09              
genotypeG10              
genotypeG11  0.500       
genotypeG12  0.500  0.500
# Variance components
as.data.frame(VarCorr(lme4_model))
       grp        var1 var2     vcov    sdcor
1    block (Intercept) <NA> 125.5453 11.20470
2 Residual        <NA> <NA> 221.6143 14.88671

Example 2: Nested Design

set.seed(654)
n_genotypes <- 30
n_complete <- 3

nested_data <- expand.grid(
  genotype = factor(paste0("G", sprintf("%02d", 1:n_genotypes))),
  complete_block = factor(1:n_complete)
)

nested_data$incomplete_block <- factor(
  paste0(nested_data$complete_block, ".",
         rep(1:5, length.out = nrow(nested_data)))
)

nested_data$yield <- 5500 +
  rnorm(n_genotypes, 0, 30)[as.numeric(nested_data$genotype)] +
  rnorm(n_complete, 0, 15)[as.numeric(nested_data$complete_block)] +
  rnorm(nrow(nested_data), 0, 20)
lme4_nested <- lmer(
  yield ~ genotype + (1|complete_block) + (1|complete_block:incomplete_block),
  data = nested_data,
  REML = TRUE
)

as.data.frame(VarCorr(lme4_nested))
                              grp        var1 var2       vcov      sdcor
1 complete_block:incomplete_block (Intercept) <NA>  24.484816  4.9482134
2                  complete_block (Intercept) <NA>   0.717081  0.8468063
3                        Residual        <NA> <NA> 301.014419 17.3497671

Example 3: Spatial Models

One key difference is spatial modeling support. Mandala has built-in spatial structures, while lme4 requires extensions.

Mandala Spatial

# AR1 spatial correlation
spatial_ar1 <- mandala(
  fixed  = yield ~ genotype,
  random = ~ block + ar1(row) + ar1(col),
  data   = field_data
)
Initial data rows: 400 
Final data rows after NA handling: 400 
Explicit param_df Check:
          name  type vc_idx      init    lower upper origin
1        block   var      1  9077.445  1.0e-06   Inf      G
2     ar1(row)   var      2  9077.445  1.0e-06   Inf      G
3 rho.ar1(row)   rho      2     0.500 -9.5e-01  0.95      G
4     ar1(col)   var      3  9077.445  1.0e-06   Inf      G
5 rho.ar1(col)   rho      3     0.500 -9.5e-01  0.95      G
6     R.sigma2 R_var      0 11346.807  1.0e-06   Inf      R
--- Starting EM Warmup ---
EM Warmup: starting theta:
 block 9077 ar1(row) 9077 rho.ar1(row) 0.5 ar1(col) 9077 rho.ar1(col) 0.5 R.sigma2 11350 
EM iter 1: logLik=-2191.7556; theta: block 5706 ar1(row) 6221 rho.ar1(row) 0.5 ar1(col) 5612 rho.ar1(col) 0.5 R.sigma2 5527 
EM iter 2: logLik=-2082.1793; theta: block 3624 ar1(row) 4875 rho.ar1(row) 0.5 ar1(col) 3969 rho.ar1(col) 0.5 R.sigma2 5689 
EM iter 3 : logLik decreased or failed. Stopping EM.
EM Warmup: ending theta:
 block 3624 ar1(row) 4875 rho.ar1(row) 0.5 ar1(col) 3969 rho.ar1(col) 0.5 R.sigma2 5689 
--- EM Warmup Complete. Starting AI-REML ---
Starting AI-REML logLik = -2090.6822
 Iter     LogLik   Sigma2  DF     wall    Restrained
    1 -2045.1982  4323.264  370  09:46:39  ( 2 restrained)
    2 -2010.6540  3285.681  370  09:46:39  ( 0 restrained)
    3 -1914.0161  1636.124  370  09:46:39  ( 2 restrained)
    4 -1817.2993   449.800  370  09:46:40  ( 0 restrained)
    5 -1817.2993   449.800  370  09:46:40  ( 0 restrained)
Converged at iter 5 by tolerance(s): delta_theta=0.00e+00, delta_loglik=0.00e+00
Main AI-REML Loop finished. Combining results.
solveMME_cpp: adding nugget 4.5665e-08 to MME diagonal (scaled from median diag)
# P-spline spatial (like SpATS)
spatial_spline <- mandala(
  fixed  = yield ~ genotype,
  random = ~ pspline2D(row.num, col.num, nseg = c(10, 10)),
  data   = field_data
)
Initial data rows: 400 
Final data rows after NA handling: 400 
Explicit param_df Check:
                     name  type vc_idx      init lower upper origin
1             sf(row.num)   var      1  9077.445 1e-06   Inf      G
2             sf(col.num)   var      2  9077.445 1e-06   Inf      G
3 sf(row.num):sf(col.num)   var      3  9077.445 1e-06   Inf      G
4                R.sigma2 R_var      0 11346.807 1e-06   Inf      R
--- Starting EM Warmup ---
EM Warmup: starting theta:
 sf(row.num) 9077 sf(col.num) 9077 sf(row.num):sf(col.num) 9077 R.sigma2 11350 
EM iter 1: logLik=-2195.7708; theta: sf(row.num) 4637 sf(col.num) 5088 sf(row.num):sf(col.num) 84040 R.sigma2 5354 
EM iter 2: logLik=-2190.9536; theta: sf(row.num) 3189 sf(col.num) 3472 sf(row.num):sf(col.num) 69630 R.sigma2 5543 
EM iter 3 : logLik decreased or failed. Stopping EM.
EM Warmup: ending theta:
 sf(row.num) 3189 sf(col.num) 3472 sf(row.num):sf(col.num) 69630 R.sigma2 5543 
--- EM Warmup Complete. Starting AI-REML ---
Starting AI-REML logLik = -2204.2015
 Iter     LogLik   Sigma2  DF     wall    Restrained
[STABILIZING] Adding nugget 80785 to V diagonal...
    1 -2189.1852  4212.527  370  09:46:42  ( 0 restrained)
[STABILIZING] Adding nugget 61398 to V diagonal...
    2 -2185.4598  3201.520  370  09:46:43  ( 0 restrained)
[STABILIZING] Adding nugget 46663 to V diagonal...
    3 -2185.4598  3201.520  370  09:46:43  ( 0 restrained)
Converged at iter 3 by tolerance(s): delta_theta=0.00e+00, delta_loglik=0.00e+00
Main AI-REML Loop finished. Combining results.
solveMME_cpp: adding nugget 4.32972e-10 to MME diagonal (scaled from median diag)
# Variogram diagnostics
mandala_variogram(spatial_ar1, data = field_data, plot_type = "3d")

$variogram_grid
          [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]
 [1,]   0.0000 355.5844 361.6032 381.7681 382.7147 379.9571 337.1248 359.5623
 [2,] 347.9895 351.6894 365.3962 344.3001 321.6875 356.6724 322.2316 324.6279
 [3,] 378.7237 360.3272 357.4521 377.8825 360.6535 365.5304 367.0741 333.9328
 [4,] 404.6727 363.3130 372.8068 399.2616 359.9228 362.0562 352.7973 352.9689
 [5,] 397.4511 352.6807 373.0921 362.2365 371.5875 375.2162 330.9416 320.7431
 [6,] 353.8009 370.2667 371.3818 356.5063 380.6897 369.7193 319.7332 356.9936
 [7,] 359.5572 345.8470 340.3978 365.5048 416.8611 359.1009 377.0356 338.1400
 [8,] 395.9552 368.8571 340.5346 360.7343 344.4998 359.8088 354.5798 333.8950
 [9,] 344.9271 333.9406 366.0959 369.0670 342.2571 365.8749 386.0688 344.5511
[10,] 357.3428 367.7026 373.7245 343.9861 338.4057 359.5870 312.9947 316.2253
[11,] 339.2200 348.4145 353.5787 367.9297 352.8397 354.1340 356.1588 333.3702
[12,] 369.3673 340.8823 349.8764 333.8020 388.7670 331.9575 364.1015 339.2789
[13,] 335.5056 338.7429 310.7402 331.2562 348.4698 321.3879 317.3459 307.4377
[14,] 313.4712 300.5438 333.9186 298.8817 367.8028 328.9913 310.5807 313.3008
[15,] 352.6354 324.8132 302.2188 295.1411 352.5412 330.5114 335.1618 301.6898
[16,] 388.8019 306.2171 295.4263 340.2208 310.6522 332.5873 272.7431 313.0413
[17,] 418.9894 302.1247 332.6062 308.8234 325.5908 338.2082 308.4058 307.3361
[18,] 265.3884 260.2049 267.7542 271.4679 296.3420 316.3267 264.1340 251.7843
[19,] 252.2820 275.2954 291.1004 255.0350 243.6807 262.3019 233.8085 279.1208
[20,] 244.4341 351.9538 218.6718 244.7218 351.0687 289.6907 344.0927 261.4927
          [,9]    [,10]    [,11]    [,12]    [,13]    [,14]    [,15]    [,16]
 [1,] 340.1506 379.3093 355.4858 379.7839 330.9003 411.8732 403.6736 348.3158
 [2,] 347.9306 390.2099 376.8022 354.3857 322.1243 359.9945 409.0841 338.2805
 [3,] 323.4425 349.3430 337.9407 340.7461 373.3889 373.9389 365.4323 319.5539
 [4,] 346.6209 344.3701 343.7865 333.9007 370.6289 362.8362 332.2872 346.1389
 [5,] 355.2172 326.5175 362.2429 357.2891 374.9297 385.5752 364.1155 296.7475
 [6,] 393.0636 364.3055 369.3757 329.2090 336.6165 349.7404 350.6253 313.4338
 [7,] 348.2321 330.9347 339.4475 362.2733 379.1089 367.4268 362.8258 313.7278
 [8,] 349.3773 360.8034 383.9056 347.8381 406.0388 442.4326 380.6709 323.5402
 [9,] 333.0091 360.7358 341.1594 350.0319 329.9129 406.8976 425.1001 346.5570
[10,] 299.3399 356.2518 362.0160 357.2685 347.5804 427.9291 371.2712 277.3185
[11,] 326.9958 331.6337 355.5128 325.2180 370.2294 406.4655 328.5168 331.5832
[12,] 314.6410 366.9146 379.1604 303.1218 385.5815 285.6354 357.4575 338.2756
[13,] 346.9350 388.8369 316.7714 362.1776 319.4279 346.9270 363.2506 311.6717
[14,] 390.9135 342.0304 250.3340 322.3713 304.6549 320.5554 286.9520 230.8790
[15,] 371.8093 281.5493 284.9477 337.5972 302.5873 358.2381 341.5831 284.2900
[16,] 325.2214 343.4749 273.2758 284.6864 358.8715 389.1868 286.0603 350.3332
[17,] 322.2934 304.8651 332.6387 228.4612 321.6942 282.5205 249.4250 303.2814
[18,] 260.4672 247.1949 282.2658 282.6514 330.3324 324.1857 289.4195 187.8139
[19,] 267.1919 221.9043 279.6216 307.6188 234.4703 333.9107 267.3115 279.6170
[20,] 214.0049 384.3724 259.1912 478.1344 290.3291 345.0417 338.3152 207.3991
         [,17]    [,18]    [,19]    [,20]
 [1,] 302.8967 325.9168 323.1332 381.7119
 [2,] 289.1642 323.0647 339.7898 365.8393
 [3,] 329.6576 284.0945 315.0045 326.7257
 [4,] 299.7980 309.1581 222.7484 281.4843
 [5,] 262.6339 260.8143 280.6553 228.0663
 [6,] 303.0905 253.0096 300.8841 247.1592
 [7,] 321.3523 285.5197 279.2960 292.1153
 [8,] 319.1517 284.4815 377.7277 348.8573
 [9,] 338.2770 360.9371 294.0159 348.1294
[10,] 245.8147 292.8994 274.7369 339.0107
[11,] 235.1054 310.4802 291.6911 279.2963
[12,] 356.1252 309.9818 282.9170 354.6665
[13,] 282.4063 219.0632 289.3670 251.5588
[14,] 260.5664 364.8574 260.1917 449.7901
[15,] 451.6144 295.1720 235.4910 260.5914
[16,] 240.5888 285.2420 264.1028 220.1449
[17,] 314.8592 372.7135 285.8267 339.1800
[18,] 215.0838 340.4045 245.9681 235.9557
[19,] 218.2486 293.0099 260.9140       NA
[20,] 269.2260 157.2349       NA       NA

$counts
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
 [1,]    1  380  360  340  320  300  280  260  240   220   200   180   160
 [2,]  380  722  684  646  608  570  532  494  456   418   380   342   304
 [3,]  360  684  648  612  576  540  504  468  432   396   360   324   288
 [4,]  340  646  612  578  544  510  476  442  408   374   340   306   272
 [5,]  320  608  576  544  512  480  448  416  384   352   320   288   256
 [6,]  300  570  540  510  480  450  420  390  360   330   300   270   240
 [7,]  280  532  504  476  448  420  392  364  336   308   280   252   224
 [8,]  260  494  468  442  416  390  364  338  312   286   260   234   208
 [9,]  240  456  432  408  384  360  336  312  288   264   240   216   192
[10,]  220  418  396  374  352  330  308  286  264   242   220   198   176
[11,]  200  380  360  340  320  300  280  260  240   220   200   180   160
[12,]  180  342  324  306  288  270  252  234  216   198   180   162   144
[13,]  160  304  288  272  256  240  224  208  192   176   160   144   128
[14,]  140  266  252  238  224  210  196  182  168   154   140   126   112
[15,]  120  228  216  204  192  180  168  156  144   132   120   108    96
[16,]  100  190  180  170  160  150  140  130  120   110   100    90    80
[17,]   80  152  144  136  128  120  112  104   96    88    80    72    64
[18,]   60  114  108  102   96   90   84   78   72    66    60    54    48
[19,]   40   76   72   68   64   60   56   52   48    44    40    36    32
[20,]   20   38   36   34   32   30   28   26   24    22    20    18    16
      [,14] [,15] [,16] [,17] [,18] [,19] [,20]
 [1,]   140   120   100    80    60    40    20
 [2,]   266   228   190   152   114    76    38
 [3,]   252   216   180   144   108    72    36
 [4,]   238   204   170   136   102    68    34
 [5,]   224   192   160   128    96    64    32
 [6,]   210   180   150   120    90    60    30
 [7,]   196   168   140   112    84    56    28
 [8,]   182   156   130   104    78    52    26
 [9,]   168   144   120    96    72    48    24
[10,]   154   132   110    88    66    44    22
[11,]   140   120   100    80    60    40    20
[12,]   126   108    90    72    54    36    18
[13,]   112    96    80    64    48    32    16
[14,]    98    84    70    56    42    28    14
[15,]    84    72    60    48    36    24    12
[16,]    70    60    50    40    30    20    10
[17,]    56    48    40    32    24    16     8
[18,]    42    36    30    24    18    12     6
[19,]    28    24    20    16    12     8     4
[20,]    14    12    10     8     6     4     2

$row_lags
 [1]  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19

$col_lags
 [1]  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19
mandala_variogram(spatial_ar1, data = field_data, plot_type = "2d")

   lag_distance semivariance n_pairs
1           0.5     351.7870     760
2           1.5     360.9136    1442
3           2.5     369.2187    2696
4           3.5     369.5161    3156
5           4.5     361.7628    4634
6           5.5     362.7269    4312
7           6.5     358.1627    4504
8           7.5     351.5907    5474
9           8.5     350.5858    5804
10          9.5     356.7752    5938
11         10.5     352.5508    5060
12         11.5     347.4710    4860
13         12.5     344.4080    5814
14         13.5     347.2194    4824
15         14.5     350.8377    4688
16         15.5     340.3996    3634
17         16.5     325.7296    3508
18         17.5     305.5346    2876
19         18.5     290.5413    2306
20         19.5     304.9089    1660
21         20.5     279.9320     704
22         21.5     320.7736     566
23         22.5     275.6160     300
24         23.5     309.2576     140
25         24.5     270.9355     110
26         25.5     222.3228      20
27         26.5     260.6703      10
# Spatial fitted value plots
plot_mandala_spatial(spatial_ar1, field_data,
                     response = "yield", geno = "genotype",
                     row = "row", col = "col")

Notes:
- The predictions are obtained by averaging across the hypertable
  calculated from model terms constructed solely from factors in
  the averaging and classify sets.
- The simple averaging set: (none)
- The ignored set: block, ar1(row), ar1(col)

lme4 Spatial

# lme4 does not natively support AR1 or spatial covariance
# You need extensions like nlme or spaMM
# Basic approximation with row/col as random:
lme4_spatial <- lmer(
  yield ~ genotype + (1|row) + (1|col),
  data = field_data
)
# This treats row/col as independent - no correlation structure

Diagnostics

lme4 Diagnostics

diag_data <- data.frame(
  Fitted = fitted(lme4_model),
  Residuals = residuals(lme4_model)
)

p1 <- ggplot(diag_data, aes(x = Fitted, y = Residuals)) +
  geom_point(alpha = 0.6, color = "#5D4E6D") +
  geom_hline(yintercept = 0, linetype = "dashed", color = "#9B5B5B") +
  geom_smooth(se = FALSE, color = "#8B9A6D") +
  theme_minimal() +
  labs(title = "Residuals vs Fitted")

p2 <- ggplot(diag_data, aes(sample = Residuals)) +
  stat_qq(color = "#5D4E6D") +
  stat_qq_line(color = "#9B5B5B") +
  theme_minimal() +
  labs(title = "Normal Q-Q Plot")

gridExtra::grid.arrange(p1, p2, ncol = 2)

Mandala Diagnostics

# Built-in diagnostic plots
mandala_diagnostic_plots(model, response = "yield")

# Includes:
# - Residuals vs fitted
# - Q-Q plot
# - Histogram of residuals
# - Observed vs predicted

Key Differences

Task Mandala lme4
Random intercept random = ~ block (1\|block)
Variance components $varcomp VarCorr()
BLUPs mandala_predict() ranef()
Heritability Built-in h2_estimates() Manual calculation
AR1 spatial ar1(row) + ar1(col) Not supported
P-spline spatial pspline2D() Not supported
Variograms mandala_variogram() Not supported
Diagnostics mandala_diagnostic_plots() Manual with ggplot2
Genomic models GM() Not supported

When to Use Each

Use Mandala for:

  • Agricultural field trials
  • Spatial correlation modeling (AR1, P-splines)
  • Variogram diagnostics
  • Quick heritability estimates
  • Genomic prediction (GBLUP)

Use lme4 for:

  • General mixed models outside agriculture
  • Complex random effect structures
  • Generalized linear mixed models (GLMMs)
  • Large documentation and community support

Session Information

sessionInfo()
R version 4.5.2 (2025-10-31)
Platform: aarch64-apple-darwin20
Running under: macOS Tahoe 26.2

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: America/New_York
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggplot2_4.0.2  dplyr_1.2.0    lmerTest_3.2-0 lme4_1.1-38    Matrix_1.7-4  
[6] mandala_1.0.1 

loaded via a namespace (and not attached):
 [1] generics_0.1.4      lattice_0.22-7      digest_0.6.39      
 [4] magrittr_2.0.4      evaluate_1.0.5      grid_4.5.2         
 [7] RColorBrewer_1.1-3  splines2_0.5.4      fastmap_1.2.0      
[10] maps_3.4.3          jsonlite_2.0.0      gridExtra_2.3      
[13] mgcv_1.9-3          spam_2.11-3         viridisLite_0.4.2  
[16] scales_1.4.0        numDeriv_2016.8-1.1 reformulas_0.4.4   
[19] Rdpack_2.6.5        cli_3.6.5           rlang_1.1.7        
[22] rbibutils_2.4.1     splines_4.5.2       withr_3.0.2        
[25] yaml_2.3.12         tools_4.5.2         nloptr_2.2.1       
[28] minqa_1.2.8         boot_1.3-32         vctrs_0.7.1        
[31] R6_2.6.1            lifecycle_1.0.5     MASS_7.3-65        
[34] pkgconfig_2.0.3     pillar_1.11.1       gtable_0.3.6       
[37] glue_1.8.0          Rcpp_1.1.1          fields_17.1        
[40] xfun_0.56           tibble_3.3.1        tidyselect_1.2.1   
[43] knitr_1.51          farver_2.1.2        htmltools_0.5.9    
[46] nlme_3.1-168        labeling_0.4.3      rmarkdown_2.30     
[49] dotCall64_1.2       compiler_4.5.2      S7_0.2.1