Study Overview

The objective of this study was to determine whether energetic state constrains tail regeneration in adult female brown anoles (Anolis sagrei) and whether supplementation with insulin-like growth factor 1 (IGF1) or insulin-like growth factor 2 (IGF2) modifies this relationship.

  • Energetic state was quantified as percent body mass loss and analyzed as a continuous predictor of regenerative performance.
  • The primary response variable was cumulative percent tail regeneration measured weekly over eight weeks following tail autotomy.
  • Secondary analyses evaluated absolute regenerated tail length and weekly regeneration rate.
  • Linear mixed-effects models included animal identity as a random effect to account for repeated measurements.

The analysis proceeds in the same order as the manuscript:

  1. Verify successful randomization and dietary manipulation.
  2. Establish the relationship between energetic state and regeneration.
  3. Test whether IGF supplementation modifies that relationship.
  4. Evaluate robustness, alternative response variables, dose effects, and late-stage observations.
  5. Generate publication figures and supporting outputs.

1. Reproducibility Setup

1.1 Load packages

# Data manipulation
library(dplyr)
library(tidyr)

# Statistical modeling
library(lme4)
library(nlme)
library(car)
library(lmtest)
library(MuMIn)
library(bestNormalize)
library(multcomp)
library(emmeans)
library(performance)

# Model predictions and summaries
library(ggeffects)
library(Rmisc)

# Visualization
library(ggplot2)
library(patchwork)
library(plotly)
library(viridis)
library(hrbrthemes)

packageVersion("lmerTest")
## [1] '3.2.1'
search()
##  [1] ".GlobalEnv"            "package:hrbrthemes"    "package:viridis"      
##  [4] "package:viridisLite"   "package:plotly"        "package:patchwork"    
##  [7] "package:ggplot2"       "package:Rmisc"         "package:plyr"         
## [10] "package:lattice"       "package:ggeffects"     "package:performance"  
## [13] "package:emmeans"       "package:multcomp"      "package:TH.data"      
## [16] "package:MASS"          "package:survival"      "package:mvtnorm"      
## [19] "package:bestNormalize" "package:MuMIn"         "package:lmtest"       
## [22] "package:zoo"           "package:car"           "package:carData"      
## [25] "package:nlme"          "package:lme4"          "package:Matrix"       
## [28] "package:tidyr"         "package:dplyr"         "package:stats"        
## [31] "package:graphics"      "package:grDevices"     "package:utils"        
## [34] "package:datasets"      "package:methods"       "Autoloads"            
## [37] "package:base"
# Reproducible random-number generation for bootstrap analyses
set.seed(123)

1.2 Shared plotting objects and color palettes

# Position adjustments used in several figures
pd <- position_dodge(0.02)
dodge <- position_dodge(width = 0.6)

# Treatment colors used throughout the analysis
treatment_colors <- c(
  "AdLib"   = "grey40",
  "DR"      = "grey70",
  "DR.IGF1" = "#E87722",
  "DR.IGF2" = "#0C2340"
)

igf_colors <- c(
  "No_IGF" = "grey40",
  "IGF1"   = "#E87722",
  "IGF2"   = "#0C2340"
)

2. Data Import and Curation

2.1 Pre-experimental body-mass dataset

diet <- read.csv(
  "WL.analysis.csv",
  stringsAsFactors = FALSE,
  check.names = FALSE
)

# The source file contains a trailing space in the Week column name.
names(diet)[trimws(names(diet)) == "Week"] <- "Week"

# Standardize factor order for consistent output.
diet <- diet %>%
  mutate(
    Treatment = factor(
      Treatment,
      levels = c("AdLib", "DR", "DR.IGF1", "DR.IGF2")
    )
  )

str(diet)
## 'data.frame':    228 obs. of  14 variables:
##  $ Animal_ID         : chr  "BC039" "BC048" "BC099" "BC158" ...
##  $ ToeClip           : chr  "1455" "1513" "11-Jan" "2330" ...
##  $ BC_Cage           : int  32 28 9 28 8 36 39 39 28 15 ...
##  $ Treatment         : Factor w/ 4 levels "AdLib","DR","DR.IGF1",..: 3 1 1 4 1 3 2 2 3 4 ...
##  $ Diet              : chr  "DR" "Adlib" "Adlib" "DR" ...
##  $ Tail              : num  73 69 82 71 74 79.5 85 60 75.5 79 ...
##  $ SVL               : int  46 48 48 44 42 47 51 46 45 47 ...
##  $ Week              : int  -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 ...
##  $ Mass              : num  2.57 2.71 3.67 2.64 2.46 ...
##  $ Bcond             : num  0.0558 0.0565 0.0766 0.06 0.0586 ...
##  $ Perc_BC.change    : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Delta Mass_Initial: num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Perc_WL           : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Perc_Orig         : num  100 100 100 100 100 100 100 100 100 100 ...

2.2 Eight-week regeneration dataset

data <- read.csv(
  "R.analysis.currated.csv",
  stringsAsFactors = FALSE,
  check.names = FALSE
)

# Remove observations from four individuals following substantial secondary
# tail loss unrelated to the original experimental autotomy.
#
# This exclusion is retained here so that the reorganized file reproduces the
# same analytical dataset and results.
excluded_animals <- c("BC121", "BC144", "BC383", "BC561")

data <- data %>%
  filter(!Animal_ID %in% excluded_animals) %>%
  mutate(
    Treatment = factor(
      Treatment,
      levels = c("AdLib", "DR", "DR.IGF1", "DR.IGF2")
    ),
    Diet = case_when(
      Treatment == "AdLib" ~ "AdLib",
      Treatment %in% c("DR", "DR.IGF1", "DR.IGF2") ~ "Restricted",
      TRUE ~ NA_character_
    ),
    Diet = factor(Diet, levels = c("AdLib", "Restricted")),
    IGF = if_else(
      Treatment %in% c("DR.IGF1", "DR.IGF2"),
      "IGF",
      "No_IGF"
    ),
    IGF = factor(IGF, levels = c("No_IGF", "IGF")),
    IGF_type = case_when(
      Treatment %in% c("AdLib", "DR") ~ "No_IGF",
      Treatment == "DR.IGF1" ~ "IGF1",
      Treatment == "DR.IGF2" ~ "IGF2",
      TRUE ~ NA_character_
    ),
    IGF_type = factor(IGF_type, levels = c("No_IGF", "IGF1", "IGF2"))
  )

str(data)
## 'data.frame':    608 obs. of  18 variables:
##  $ Animal_ID        : chr  "BC039" "BC048" "BC099" "BC158" ...
##  $ ToeClip          : chr  "1455" "1513" "11-Jan" "2330" ...
##  $ BC_Cage          : int  32 28 9 28 8 36 39 39 28 15 ...
##  $ Treatment        : Factor w/ 4 levels "AdLib","DR","DR.IGF1",..: 3 1 1 4 1 3 2 2 3 4 ...
##  $ Tail             : num  73 69 82 71 74 79.5 85 60 75.5 79 ...
##  $ SVL              : int  46 48 48 44 42 47 51 46 45 47 ...
##  $ Week             : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Mass             : num  2.1 2.21 3.36 2.16 2.06 ...
##  $ Dose             : num  2.38 0 0 2.32 0 ...
##  $ Perc.WeightLoss  : num  18 18.36 8.49 18.2 16.17 ...
##  $ Regeneration     : num  0 0 0 0 0 0 0 0 NA 0 ...
##  $ Rate_Reg         : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Rate_Perc        : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Perc.Regeneration: num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Eggs             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Diet             : Factor w/ 2 levels "AdLib","Restricted": 2 1 1 2 1 2 2 2 2 2 ...
##  $ IGF              : Factor w/ 2 levels "No_IGF","IGF": 2 1 1 2 1 2 1 1 2 2 ...
##  $ IGF_type         : Factor w/ 3 levels "No_IGF","IGF1",..: 2 1 1 3 1 2 1 1 2 3 ...
table(data$Treatment, useNA = "ifany")
## 
##   AdLib      DR DR.IGF1 DR.IGF2 
##     160     136     160     152
length(unique(data$Animal_ID))
## [1] 76

3. Verification of Randomization

Animals should not differ systematically in body size or original tail length before treatment implementation.

3.1 Baseline subset

pre_diet <- diet %>%
  filter(Week == -4)

3.2 Initial snout–vent length

model_svl <- lm(SVL ~ Treatment, data = pre_diet)
anova(model_svl)
## Analysis of Variance Table
## 
## Response: SVL
##           Df  Sum Sq Mean Sq F value Pr(>F)
## Treatment  3   6.984  2.3279  0.6542 0.5829
## Residuals 72 256.214  3.5585
summary(model_svl)
## 
## Call:
## lm(formula = SVL ~ Treatment, data = pre_diet)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -3.900 -1.200 -0.200  1.100  4.706 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       45.9000     0.4218 108.816   <2e-16 ***
## TreatmentDR        0.3941     0.6223   0.633    0.529    
## TreatmentDR.IGF1   0.3000     0.5965   0.503    0.617    
## TreatmentDR.IGF2   0.8368     0.6043   1.385    0.170    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.886 on 72 degrees of freedom
## Multiple R-squared:  0.02653,    Adjusted R-squared:  -0.01403 
## F-statistic: 0.6542 on 3 and 72 DF,  p-value: 0.5829
plot_svl <- ggplot(
  pre_diet,
  aes(x = Treatment, y = SVL, fill = Treatment)
) +
  geom_violin(trim = FALSE, scale = "width") +
  geom_boxplot(width = 0.10, outlier.shape = NA) +
  geom_jitter(width = 0.10) +
  scale_fill_manual(values = treatment_colors) +
  labs(x = "Treatment", y = "Snout–vent length") +
  theme_classic() +
  theme(legend.position = "none")

plot_svl

ggsave(
  filename = "svl.png",
  plot = plot_svl,
  width = 5,
  height = 4,
  dpi = 600
)

Manuscript result: Initial snout–vent length did not differ among treatment groups, \(F_{3,72}=0.65\), \(p=0.58\).

3.3 Initial body mass

model_mass <- lm(Mass ~ Treatment, data = pre_diet)
anova(model_mass)
## Analysis of Variance Table
## 
## Response: Mass
##           Df  Sum Sq Mean Sq F value Pr(>F)
## Treatment  3  0.3761 0.12538  0.5547 0.6467
## Residuals 72 16.2743 0.22603
summary(model_mass)
## 
## Call:
## lm(formula = Mass ~ Treatment, data = pre_diet)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.8368 -0.3412 -0.0487  0.3016  1.2372 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       2.83280    0.10631  26.647   <2e-16 ***
## TreatmentDR       0.19896    0.15684   1.269    0.209    
## TreatmentDR.IGF1  0.12180    0.15034   0.810    0.421    
## TreatmentDR.IGF2  0.09694    0.15231   0.636    0.527    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4754 on 72 degrees of freedom
## Multiple R-squared:  0.02259,    Adjusted R-squared:  -0.01814 
## F-statistic: 0.5547 on 3 and 72 DF,  p-value: 0.6467
plot_mass <- ggplot(
  pre_diet,
  aes(x = Treatment, y = Mass, fill = Treatment)
) +
  geom_violin(trim = FALSE, scale = "width") +
  geom_boxplot(width = 0.10, outlier.shape = NA) +
  geom_jitter(width = 0.10) +
  scale_fill_manual(values = treatment_colors) +
  labs(x = "Treatment", y = "Initial body mass") +
  theme_classic() +
  theme(legend.position = "none")

plot_mass

ggsave(
  filename = "mass.png",
  plot = plot_mass,
  width = 5,
  height = 4,
  dpi = 600
)

Manuscript result: Initial body mass did not differ among treatment groups, \(F_{3,72}=0.55\), \(p=0.64\).

3.4 Original tail length

model_tail_baseline <- lm(Tail ~ Treatment, data = pre_diet)
anova(model_tail_baseline)
## Analysis of Variance Table
## 
## Response: Tail
##           Df Sum Sq Mean Sq F value Pr(>F)  
## Treatment  3  420.0 139.994  2.3623 0.0795 .
## Residuals 64 3792.7  59.262                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(model_tail_baseline)
## 
## Call:
## lm(formula = Tail ~ Treatment, data = pre_diet)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -19.000  -4.250   0.875   4.292  20.500 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        73.000      1.814  40.232   <2e-16 ***
## TreatmentDR         1.500      2.743   0.547   0.5864    
## TreatmentDR.IGF1    5.250      2.566   2.046   0.0449 *  
## TreatmentDR.IGF2    5.778      2.566   2.252   0.0278 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.698 on 64 degrees of freedom
##   (8 observations deleted due to missingness)
## Multiple R-squared:  0.09969,    Adjusted R-squared:  0.05749 
## F-statistic: 2.362 on 3 and 64 DF,  p-value: 0.0795

Manuscript result: Original tail length did not differ significantly among treatment groups, \(F_{3,72}=2.36\), \(p=0.08\).

4. Verification of the Dietary Manipulation

4.1 Percent body-mass loss after acclimation

diet_final_acclimation <- diet %>%
  filter(Week == -1)

model_diet_loss <- lm(Perc_WL ~ Diet, data = diet_final_acclimation)
anova(model_diet_loss)
## Analysis of Variance Table
## 
## Response: Perc_WL
##           Df  Sum Sq Mean Sq F value    Pr(>F)    
## Diet       1  608.22  608.22  13.854 0.0004068 ***
## Residuals 67 2941.39   43.90                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(model_diet_loss)
## 
## Call:
## lm(formula = Perc_WL ~ Diet, data = diet_final_acclimation)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -18.1313  -4.6672   0.7973   4.0723  20.1000 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    1.104      1.562   0.707 0.482225    
## DietDR         6.761      1.817   3.722 0.000407 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.626 on 67 degrees of freedom
##   (7 observations deleted due to missingness)
## Multiple R-squared:  0.1713, Adjusted R-squared:  0.159 
## F-statistic: 13.85 on 1 and 67 DF,  p-value: 0.0004068
diet_group_summary <- diet_final_acclimation %>%
  group_by(Diet) %>%
  summarise(
    n = sum(!is.na(Perc_WL)),
    mean_percent_loss = mean(Perc_WL, na.rm = TRUE),
    sd_percent_loss = sd(Perc_WL, na.rm = TRUE),
    mean_percent_original_mass = mean(Perc_Orig, na.rm = TRUE),
    .groups = "drop"
  )

diet_group_summary
## # A tibble: 2 × 5
##   Diet      n mean_percent_loss sd_percent_loss mean_percent_original_mass
##   <chr> <int>             <dbl>           <dbl>                      <dbl>
## 1 Adlib    18              1.10            7.58                       98.9
## 2 DR       51              7.86            6.27                       92.1

Manuscript result: Diet-restricted females lost significantly more body mass than ad libitum-fed females, \(F_{1,67}=13.85\), \(p=0.0004\).

4.2 Figure 1A: energetic manipulation

plot_diet <- ggplot(
  diet_final_acclimation,
  aes(x = Diet, y = Perc_Orig)
) +
  geom_violin(
    fill = "grey75",
    color = "black",
    trim = FALSE,
    scale = "width",
    alpha = 0.8
  ) +
  geom_boxplot(
    width = 0.12,
    outlier.shape = NA,
    fill = "white",
    color = "black"
  ) +
  geom_jitter(
    width = 0.08,
    size = 1.8,
    shape = 21,
    fill = "white",
    color = "black",
    alpha = 0.8
  ) +
  labs(
    x = "Diet",
    y = "Percent of original body mass"
  ) +
  theme_classic(base_size = 12)

plot_diet

ggsave(
  filename = "diet.png",
  plot = plot_diet,
  width = 5,
  height = 4,
  dpi = 600
)

4.3 Body-mass trajectories during acclimation

These plots are retained from the original analysis to document how body mass changed before tail autotomy.

plot_mass_by_week_violin <- ggplot(
  diet,
  aes(x = factor(Week), y = Mass, fill = Diet)
) +
  geom_violin(
    trim = FALSE,
    position = dodge,
    scale = "width",
    width = 0.5
  ) +
  geom_boxplot(
    width = 0.10,
    position = dodge,
    outlier.shape = NA
  ) +
  geom_jitter(position = dodge) +
  scale_fill_manual(values = c("Adlib" = "slategrey", "DR" = "lemonchiffon2")) +
  labs(x = "Week", y = "Body mass") +
  theme_classic()

plot_mass_by_week <- ggplot(
  diet,
  aes(x = Week, y = Mass, color = Diet)
) +
  geom_smooth() +
  scale_color_manual(values = c("Adlib" = "slategrey", "DR" = "lemonchiffon2")) +
  theme_classic()

plot_loss_by_week <- ggplot(
  diet,
  aes(x = Week, y = Perc_WL, color = Diet)
) +
  geom_smooth() +
  scale_color_manual(values = c("Adlib" = "slategrey", "DR" = "lemonchiffon2")) +
  theme_classic()

plot_percent_original_by_week <- ggplot(
  diet,
  aes(x = Week, y = Perc_Orig, color = Diet)
) +
  geom_smooth() +
  scale_color_manual(values = c("Adlib" = "slategrey", "DR" = "lemonchiffon2")) +
  theme_classic()

plot_mass_by_week_violin

plot_mass_by_week

plot_loss_by_week

plot_percent_original_by_week

ggsave(
  filename = "diet2.png",
  plot = plot_mass_by_week_violin,
  width = 5,
  height = 4,
  dpi = 600
)

ggsave(
  filename = "diet4.png",
  plot = plot_percent_original_by_week,
  width = 4.75,
  height = 4,
  dpi = 600
)

5. Establishing the Energetic Trade-off

5.1 Primary cumulative-percent-regeneration model

model_weightloss <- lmerTest::lmer(
  Perc.Regeneration ~ Week * Perc.WeightLoss + Tail +
    (1 | Animal_ID),
  data = data
)

summary(model_weightloss)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss + Tail + (1 | Animal_ID)
##    Data: data
## 
## REML criterion at convergence: 2747.8
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.1896 -0.5652  0.0844  0.5744  3.1799 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 15.69    3.961   
##  Residual              21.76    4.665   
## Number of obs: 443, groups:  Animal_ID, 65
## 
## Fixed effects:
##                       Estimate Std. Error        df t value Pr(>|t|)    
## (Intercept)           13.15695    5.28435  68.47431   2.490  0.01521 *  
## Week                   4.84774    0.19428 399.39842  24.953  < 2e-16 ***
## Perc.WeightLoss        0.10361    0.05420 436.49430   1.912  0.05657 .  
## Tail                  -0.25817    0.06936  68.87768  -3.722  0.00040 ***
## Week:Perc.WeightLoss  -0.03020    0.01021 403.58612  -2.958  0.00327 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) Week   Prc.WL Tail  
## Week        -0.144                     
## Prc.WghtLss -0.047  0.632              
## Tail        -0.977 -0.003 -0.123       
## Wk:Prc.WghL  0.135 -0.848 -0.742 -0.012
anova(model_weightloss)
## Type III Analysis of Variance Table with Satterthwaite's method
##                       Sum Sq Mean Sq NumDF  DenDF  F value    Pr(>F)    
## Week                 13550.0 13550.0     1 399.40 622.6418 < 2.2e-16 ***
## Perc.WeightLoss         79.5    79.5     1 436.49   3.6544 0.0565742 .  
## Tail                   301.5   301.5     1  68.88  13.8548 0.0003996 ***
## Week:Perc.WeightLoss   190.5   190.5     1 403.59   8.7518 0.0032750 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Manuscript results:

  • Week: \(\beta=4.86\), \(t=25.31\), \(p<0.0001\)
  • Percent body-mass loss: \(\beta=0.074\), \(t=1.39\), \(p=0.165\)
  • Week × percent body-mass loss: \(\beta=-0.030\), \(t=-3.01\), \(p=0.0028\)

A negative Week × Percent Weight Loss interaction indicates that animals experiencing greater energetic deficits regenerated progressively less tail tissue over time.

5.2 Alternative regeneration metrics

These models retain the same fixed- and random-effect structure while replacing the response variable.

model_weightloss_rate <- lmerTest::lmer(
  Rate_Reg ~ Week * Perc.WeightLoss + Tail +
    (1 | Animal_ID),
  data = data
)

model_weightloss_absolute <- lmerTest::lmer(
  Regeneration ~ Week * Perc.WeightLoss + Tail +
    (1 | Animal_ID),
  data = data
)

summary(model_weightloss_rate)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Rate_Reg ~ Week * Perc.WeightLoss + Tail + (1 | Animal_ID)
##    Data: data
## 
## REML criterion at convergence: 1857.2
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.4619 -0.7154 -0.2113  0.5768  6.0827 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 0.01256  0.1121  
##  Residual              7.32539  2.7065  
## Number of obs: 380, groups:  Animal_ID, 64
## 
## Fixed effects:
##                        Estimate Std. Error         df t value Pr(>|t|)   
## (Intercept)            4.621180   1.490139  64.189086   3.101  0.00286 **
## Week                  -0.017850   0.123697 359.321003  -0.144  0.88534   
## Perc.WeightLoss        0.061746   0.035109 374.665891   1.759  0.07944 . 
## Tail                  -0.028967   0.018671  48.287838  -1.551  0.12732   
## Week:Perc.WeightLoss  -0.007433   0.006688 359.705939  -1.111  0.26716   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) Week   Prc.WL Tail  
## Week        -0.382                     
## Prc.WghtLss -0.248  0.732              
## Tail        -0.902 -0.007 -0.117       
## Wk:Prc.WghL  0.337 -0.817 -0.900 -0.020
anova(model_weightloss_rate)
## Type III Analysis of Variance Table with Satterthwaite's method
##                       Sum Sq Mean Sq NumDF  DenDF F value  Pr(>F)  
## Week                  0.1525  0.1525     1 359.32  0.0208 0.88534  
## Perc.WeightLoss      22.6578 22.6578     1 374.67  3.0931 0.07944 .
## Tail                 17.6323 17.6323     1  48.29  2.4070 0.12732  
## Week:Perc.WeightLoss  9.0474  9.0474     1 359.71  1.2351 0.26716  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(model_weightloss_absolute)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Regeneration ~ Week * Perc.WeightLoss + Tail + (1 | Animal_ID)
##    Data: data
## 
## REML criterion at convergence: 2330.5
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.90525 -0.61605  0.07588  0.59909  2.96424 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 6.839    2.615   
##  Residual              8.366    2.892   
## Number of obs: 442, groups:  Animal_ID, 65
## 
## Fixed effects:
##                        Estimate Std. Error         df t value Pr(>|t|)    
## (Intercept)            0.005838   3.446978  68.149514   0.002    0.999    
## Week                   2.964134   0.120670 396.631276  24.564   <2e-16 ***
## Perc.WeightLoss        0.017058   0.033812 434.412764   0.505    0.614    
## Tail                  -0.045651   0.045234  68.663816  -1.009    0.316    
## Week:Perc.WeightLoss  -0.005878   0.006342 400.910833  -0.927    0.355    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) Week   Prc.WL Tail  
## Week        -0.137                     
## Prc.WghtLss -0.044  0.629              
## Tail        -0.979 -0.003 -0.120       
## Wk:Prc.WghL  0.128 -0.847 -0.738 -0.011
anova(model_weightloss_absolute)
## Type III Analysis of Variance Table with Satterthwaite's method
##                      Sum Sq Mean Sq NumDF  DenDF  F value Pr(>F)    
## Week                 5047.8  5047.8     1 396.63 603.3913 <2e-16 ***
## Perc.WeightLoss         2.1     2.1     1 434.41   0.2545 0.6142    
## Tail                    8.5     8.5     1  68.66   1.0185 0.3164    
## Week:Perc.WeightLoss    7.2     7.2     1 400.91   0.8593 0.3545    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

5.3 Exploratory visualization by energetic-state category

The primary analyses treat percent body-mass loss continuously. The following three-category plot is retained only as a descriptive visualization.

data <- data %>%
  mutate(
    WL_group = cut(Perc.WeightLoss, breaks = 3)
  )

ggplot(
  data,
  aes(
    x = Week,
    y = Perc.Regeneration,
    color = WL_group,
    group = WL_group
  )
) +
  stat_summary(fun = mean, geom = "line", linewidth = 1.2) +
  stat_summary(fun = mean, geom = "point") +
  labs(
    x = "Week",
    y = "Cumulative percent regeneration",
    color = "Weight-loss category"
  ) +
  theme_classic()

6. Testing Rescue by IGF Supplementation

6.1 Primary IGF1-versus-IGF2 rescue model

model_igf_split <- lmerTest::lmer(
  Perc.Regeneration ~
    Week * Perc.WeightLoss * IGF_type + 
    Tail +
    (1 | Animal_ID),
  data = data
)

summary(model_igf_split)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * IGF_type + Tail +  
##     (1 | Animal_ID)
##    Data: data
## 
## REML criterion at convergence: 2717.5
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -3.05240 -0.58328  0.07647  0.53288  3.14152 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 15.52    3.940   
##  Residual              19.87    4.457   
## Number of obs: 443, groups:  Animal_ID, 65
## 
## Fixed effects:
##                                    Estimate Std. Error        df t value
## (Intercept)                         8.95632    5.37444  66.82767   1.666
## Week                                5.57153    0.22507 390.98913  24.755
## Perc.WeightLoss                     0.16173    0.06336 418.47176   2.553
## IGF_typeIGF1                        6.23221    2.90106 308.60824   2.148
## IGF_typeIGF2                        4.86116    3.88987 361.49614   1.250
## Tail                               -0.22402    0.07251  66.89851  -3.090
## Week:Perc.WeightLoss               -0.05150    0.01184 388.69919  -4.350
## Week:IGF_typeIGF1                  -1.60695    0.50288 411.98772  -3.196
## Week:IGF_typeIGF2                  -2.61979    0.61694 399.53650  -4.246
## Perc.WeightLoss:IGF_typeIGF1       -0.25717    0.14183 423.73347  -1.813
## Perc.WeightLoss:IGF_typeIGF2       -0.23525    0.17665 422.61347  -1.332
## Week:Perc.WeightLoss:IGF_typeIGF1   0.03935    0.02919 424.77894   1.348
## Week:Perc.WeightLoss:IGF_typeIGF2   0.11330    0.02987 393.97138   3.793
##                                   Pr(>|t|)    
## (Intercept)                       0.100302    
## Week                               < 2e-16 ***
## Perc.WeightLoss                   0.011041 *  
## IGF_typeIGF1                      0.032472 *  
## IGF_typeIGF2                      0.212219    
## Tail                              0.002919 ** 
## Week:Perc.WeightLoss              1.74e-05 ***
## Week:IGF_typeIGF1                 0.001503 ** 
## Week:IGF_typeIGF2                 2.70e-05 ***
## Perc.WeightLoss:IGF_typeIGF1      0.070503 .  
## Perc.WeightLoss:IGF_typeIGF2      0.183676    
## Week:Perc.WeightLoss:IGF_typeIGF1 0.178340    
## Week:Perc.WeightLoss:IGF_typeIGF2 0.000172 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(model_igf_split)
## Type III Analysis of Variance Table with Satterthwaite's method
##                               Sum Sq Mean Sq NumDF  DenDF  F value    Pr(>F)
## Week                          5315.5  5315.5     1 405.93 267.5724 < 2.2e-16
## Perc.WeightLoss                  0.0     0.0     1 419.69   0.0011 0.9735115
## IGF_type                       107.4    53.7     2 336.71   2.7031 0.0684535
## Tail                           189.6   189.6     1  66.90   9.5458 0.0029187
## Week:Perc.WeightLoss             0.0     0.0     1 413.66   0.0021 0.9634575
## Week:IGF_type                  486.0   243.0     2 406.02  12.2327 6.939e-06
## Perc.WeightLoss:IGF_type        87.4    43.7     2 422.06   2.1996 0.1121193
## Week:Perc.WeightLoss:IGF_type  296.9   148.5     2 412.47   7.4732 0.0006484
##                                  
## Week                          ***
## Perc.WeightLoss                  
## IGF_type                      .  
## Tail                          ** 
## Week:Perc.WeightLoss             
## Week:IGF_type                 ***
## Perc.WeightLoss:IGF_type         
## Week:Perc.WeightLoss:IGF_type ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Manuscript interpretation: IGF2 significantly altered the increasingly negative relationship between energetic deficit and regeneration, whereas IGF1 did not.

6.2 Model-based predictions

predicted_all_weeks <- ggpredict(
  model_igf_split,
  terms = c(
    "Perc.WeightLoss",
    "IGF_type",
    "Week [2,4,6,8]"
  )
)

predicted_early_weeks <- ggpredict(
  model_igf_split,
  terms = c(
    "Perc.WeightLoss",
    "IGF_type",
    "Week [2,4]"
  )
)

predicted_all_weeks
## # Predicted values of Perc.Regeneration
## 
## IGF_type: No_IGF
## Week: 2
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     -0.54 | -7.95,  6.87
##             -35 |      0.93 | -4.17,  6.02
##              -5 |      2.69 |  0.13,  5.25
##              50 |      5.92 |  2.18,  9.66
## 
## IGF_type: No_IGF
## Week: 4
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     16.78 | 10.10, 23.46
##             -35 |     15.67 | 11.04, 20.30
##              -5 |     14.35 | 11.96, 16.73
##              50 |     11.91 |  8.62, 15.21
## 
## IGF_type: No_IGF
## Week: 6
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     34.10 | 26.42, 41.78
##             -35 |     30.42 | 25.11, 35.73
##              -5 |     26.00 | 23.33, 28.68
##              50 |     17.91 | 14.19, 21.62
## 
## IGF_type: No_IGF
## Week: 8
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     51.42 | 41.52, 61.33
##             -35 |     45.17 | 38.37, 51.96
##              -5 |     37.66 | 34.36, 40.97
##              50 |     23.90 | 19.12, 28.68
## 
## IGF_type: IGF1
## Week: 2
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     13.18 | -0.91, 27.28
##             -35 |     10.19 |  0.49, 19.90
##              -5 |      6.60 |  1.95, 11.25
##              50 |      0.01 | -6.19,  6.21
## 
## IGF_type: IGF1
## Week: 4
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     22.57 | 10.39, 34.75
##             -35 |     18.97 | 10.59, 27.35
##              -5 |     14.65 | 10.60, 18.70
##              50 |      6.73 |  1.18, 12.28
## 
## IGF_type: IGF1
## Week: 6
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     31.96 | 17.01, 46.91
##             -35 |     27.75 | 17.61, 37.89
##              -5 |     22.70 | 18.08, 27.32
##              50 |     13.44 |  6.29, 20.59
## 
## IGF_type: IGF1
## Week: 8
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     41.34 | 20.75, 61.94
##             -35 |     36.53 | 22.67, 50.38
##              -5 |     30.75 | 24.72, 36.78
##              50 |     20.16 | 10.19, 30.13
## 
## IGF_type: IGF2
## Week: 2
## 
## Perc.WeightLoss | Predicted |        95% CI
## -------------------------------------------
##             -60 |     -0.40 | -20.36, 19.55
##             -35 |      0.85 | -13.01, 14.71
##              -5 |      2.35 |  -4.34,  9.04
##              50 |      5.11 |  -2.43, 12.65
## 
## IGF_type: IGF2
## Week: 4
## 
## Perc.WeightLoss | Predicted |        95% CI
## -------------------------------------------
##             -60 |     -1.92 | -17.92, 14.09
##             -35 |      2.43 |  -8.71, 13.56
##              -5 |      7.64 |   2.20, 13.07
##              50 |     17.19 |  11.02, 23.36
## 
## IGF_type: IGF2
## Week: 6
## 
## Perc.WeightLoss | Predicted |        95% CI
## -------------------------------------------
##             -60 |     -3.43 | -19.66, 12.80
##             -35 |      4.00 |  -7.25, 15.26
##              -5 |     12.92 |   7.47, 18.37
##              50 |     29.28 |  22.83, 35.72
## 
## IGF_type: IGF2
## Week: 8
## 
## Perc.WeightLoss | Predicted |        95% CI
## -------------------------------------------
##             -60 |     -4.94 | -25.43, 15.54
##             -35 |      5.58 |  -8.57, 19.73
##              -5 |     18.21 |  11.48, 24.94
##              50 |     41.36 |  33.15, 49.56
## 
## Adjusted for:
## *      Tail = 76.41
## * Animal_ID = 0 (population-level)
predicted_early_weeks
## # Predicted values of Perc.Regeneration
## 
## IGF_type: No_IGF
## Week: 2
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     -0.54 | -7.95,  6.87
##             -35 |      0.93 | -4.17,  6.02
##              -5 |      2.69 |  0.13,  5.25
##              50 |      5.92 |  2.18,  9.66
## 
## IGF_type: No_IGF
## Week: 4
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     16.78 | 10.10, 23.46
##             -35 |     15.67 | 11.04, 20.30
##              -5 |     14.35 | 11.96, 16.73
##              50 |     11.91 |  8.62, 15.21
## 
## IGF_type: IGF1
## Week: 2
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     13.18 | -0.91, 27.28
##             -35 |     10.19 |  0.49, 19.90
##              -5 |      6.60 |  1.95, 11.25
##              50 |      0.01 | -6.19,  6.21
## 
## IGF_type: IGF1
## Week: 4
## 
## Perc.WeightLoss | Predicted |       95% CI
## ------------------------------------------
##             -60 |     22.57 | 10.39, 34.75
##             -35 |     18.97 | 10.59, 27.35
##              -5 |     14.65 | 10.60, 18.70
##              50 |      6.73 |  1.18, 12.28
## 
## IGF_type: IGF2
## Week: 2
## 
## Perc.WeightLoss | Predicted |        95% CI
## -------------------------------------------
##             -60 |     -0.40 | -20.36, 19.55
##             -35 |      0.85 | -13.01, 14.71
##              -5 |      2.35 |  -4.34,  9.04
##              50 |      5.11 |  -2.43, 12.65
## 
## IGF_type: IGF2
## Week: 4
## 
## Perc.WeightLoss | Predicted |        95% CI
## -------------------------------------------
##             -60 |     -1.92 | -17.92, 14.09
##             -35 |      2.43 |  -8.71, 13.56
##              -5 |      7.64 |   2.20, 13.07
##              50 |     17.19 |  11.02, 23.36
## 
## Adjusted for:
## *      Tail = 76.41
## * Animal_ID = 0 (population-level)
plot_predictions <- ggplot(
  predicted_all_weeks,
  aes(
    x = x,
    y = predicted,
    color = group,
    fill = group
  )
) +
  geom_ribbon(
    aes(ymin = conf.low, ymax = conf.high),
    alpha = 0.15,
    color = NA
  ) +
  geom_line(linewidth = 1.2) +
  facet_wrap(~facet) +
  scale_color_manual(values = igf_colors) +
  scale_fill_manual(values = igf_colors) +
  labs(
    x = "Percent body-mass loss",
    y = "Predicted cumulative percent regeneration",
    color = "IGF treatment",
    fill = "IGF treatment"
  ) +
  theme_classic()

plot_predictions

6.3 Week-specific energetic-state slopes

week_specific_slopes <- emtrends(
  model_igf_split,
  ~ IGF_type | Week,
  var = "Perc.WeightLoss",
  at = list(Week = c(2, 4, 6, 8))
)

summary(week_specific_slopes, infer = TRUE)
## Week = 2:
##  IGF_type Perc.WeightLoss.trend     SE  df lower.CL upper.CL t.ratio p.value
##  No_IGF                  0.0587 0.0491 430  -0.0377   0.1552   1.197  0.2321
##  IGF1                   -0.1197 0.0915 392  -0.2996   0.0602  -1.308  0.1915
##  IGF2                    0.0501 0.1260 366  -0.1976   0.2978   0.398  0.6911
## 
## Week = 4:
##  IGF_type Perc.WeightLoss.trend     SE  df lower.CL upper.CL t.ratio p.value
##  No_IGF                 -0.0442 0.0437 414  -0.1301   0.0416  -1.013  0.3116
##  IGF1                   -0.1440 0.0796 408  -0.3004   0.0124  -1.810  0.0710
##  IGF2                    0.1737 0.1010 307  -0.0255   0.3729   1.716  0.0872
## 
## Week = 6:
##  IGF_type Perc.WeightLoss.trend     SE  df lower.CL upper.CL t.ratio p.value
##  No_IGF                 -0.1472 0.0503 422  -0.2461  -0.0484  -2.928  0.0036
##  IGF1                   -0.1683 0.1000 430  -0.3650   0.0284  -1.682  0.0933
##  IGF2                    0.2973 0.1030 367   0.0943   0.5003   2.880  0.0042
## 
## Week = 8:
##  IGF_type Perc.WeightLoss.trend     SE  df lower.CL upper.CL t.ratio p.value
##  No_IGF                 -0.2502 0.0654 430  -0.3787  -0.1217  -3.828  0.0001
##  IGF1                   -0.1926 0.1390 425  -0.4665   0.0813  -1.382  0.1677
##  IGF2                    0.4209 0.1310 430   0.1639   0.6780   3.218  0.0014
## 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95
test(week_specific_slopes)
## Week = 2:
##  IGF_type Perc.WeightLoss.trend     SE  df t.ratio p.value
##  No_IGF                  0.0587 0.0491 430   1.197  0.2321
##  IGF1                   -0.1197 0.0915 392  -1.308  0.1915
##  IGF2                    0.0501 0.1260 366   0.398  0.6911
## 
## Week = 4:
##  IGF_type Perc.WeightLoss.trend     SE  df t.ratio p.value
##  No_IGF                 -0.0442 0.0437 414  -1.013  0.3116
##  IGF1                   -0.1440 0.0796 408  -1.810  0.0710
##  IGF2                    0.1737 0.1010 307   1.716  0.0872
## 
## Week = 6:
##  IGF_type Perc.WeightLoss.trend     SE  df t.ratio p.value
##  No_IGF                 -0.1472 0.0503 422  -2.928  0.0036
##  IGF1                   -0.1683 0.1000 430  -1.682  0.0933
##  IGF2                    0.2973 0.1030 367   2.880  0.0042
## 
## Week = 8:
##  IGF_type Perc.WeightLoss.trend     SE  df t.ratio p.value
##  No_IGF                 -0.2502 0.0654 430  -3.828  0.0001
##  IGF1                   -0.1926 0.1390 425  -1.382  0.1677
##  IGF2                    0.4209 0.1310 430   3.218  0.0014
## 
## Degrees-of-freedom method: kenward-roger
week_specific_slopes_df <- as.data.frame(
  summary(week_specific_slopes, infer = TRUE)
)

6.4 Pairwise comparisons of slopes

The manuscript describes Tukey-adjusted comparisons among supplementation groups. Both the full pairwise comparisons and treatment-versus-control contrasts are retained.

# All pairwise comparisons within week, Tukey adjusted
pairwise_slopes_tukey <- pairs(
  week_specific_slopes,
  adjust = "tukey"
)

pairwise_slopes_tukey
## Week = 2:
##  contrast      estimate     SE  df t.ratio p.value
##  No_IGF - IGF1  0.17847 0.1040 408   1.713  0.2014
##  No_IGF - IGF2  0.00865 0.1350 379   0.064  0.9977
##  IGF1 - IGF2   -0.16982 0.1560 376  -1.090  0.5206
## 
## Week = 4:
##  contrast      estimate     SE  df t.ratio p.value
##  No_IGF - IGF1  0.09976 0.0911 412   1.095  0.5176
##  No_IGF - IGF2 -0.21795 0.1100 325  -1.980  0.1189
##  IGF1 - IGF2   -0.31771 0.1290 350  -2.467  0.0375
## 
## Week = 6:
##  contrast      estimate     SE  df t.ratio p.value
##  No_IGF - IGF1  0.02106 0.1120 430   0.188  0.9808
##  No_IGF - IGF2 -0.44454 0.1150 379  -3.876  0.0004
##  IGF1 - IGF2   -0.46560 0.1440 412  -3.238  0.0037
## 
## Week = 8:
##  contrast      estimate     SE  df t.ratio p.value
##  No_IGF - IGF1 -0.05765 0.1540 426  -0.374  0.9258
##  No_IGF - IGF2 -0.67114 0.1460 430  -4.594 <0.0001
##  IGF1 - IGF2   -0.61349 0.1910 429  -3.210  0.0041
## 
## Degrees-of-freedom method: kenward-roger 
## P value adjustment: tukey method for comparing a family of 3 estimates
# Treatment-versus-control contrasts retained from the original figure workflow
contrasts_vs_control <- contrast(
  week_specific_slopes,
  method = "trt.vs.ctrl",
  ref = "No_IGF",
  adjust = "none"
)

contrasts_vs_control
## Week = 2:
##  contrast      estimate     SE  df t.ratio p.value
##  IGF1 - No_IGF -0.17847 0.1040 408  -1.713  0.0874
##  IGF2 - No_IGF -0.00865 0.1350 379  -0.064  0.9490
## 
## Week = 4:
##  contrast      estimate     SE  df t.ratio p.value
##  IGF1 - No_IGF -0.09976 0.0911 412  -1.095  0.2741
##  IGF2 - No_IGF  0.21795 0.1100 325   1.980  0.0486
## 
## Week = 6:
##  contrast      estimate     SE  df t.ratio p.value
##  IGF1 - No_IGF -0.02106 0.1120 430  -0.188  0.8513
##  IGF2 - No_IGF  0.44454 0.1150 379   3.876  0.0001
## 
## Week = 8:
##  contrast      estimate     SE  df t.ratio p.value
##  IGF1 - No_IGF  0.05765 0.1540 426   0.374  0.7085
##  IGF2 - No_IGF  0.67114 0.1460 430   4.594 <0.0001
## 
## Degrees-of-freedom method: kenward-roger

6.5 Figure 2A: week-specific rescue slopes

# Prepare plotting data
rescue_plot_data <- week_specific_slopes_df %>%
  mutate(
    significance = case_when(
      IGF_type == "IGF2" & Week == 4 ~ "\u2020",
      IGF_type == "IGF2" & Week == 6 ~ "**",
      IGF_type == "IGF2" & Week == 8 ~ "***",
      TRUE ~ ""
    )
  )

plot_rescue <- ggplot(
  rescue_plot_data,
  aes(
    x = Week,
    y = Perc.WeightLoss.trend,
    color = IGF_type
  )
) +

  # Background shading
  annotate(
    "rect",
    xmin = -Inf,
    xmax = Inf,
    ymin = -Inf,
    ymax = 0,
    fill = "#E87722",
    alpha = 0.12
  ) +
  annotate(
    "rect",
    xmin = -Inf,
    xmax = Inf,
    ymin = 0,
    ymax = Inf,
    fill = "#0C2340",
    alpha = 0.12
  ) +

  # Zero line
  geom_hline(
    yintercept = 0,
    linetype = "dashed",
    color = "black"
  ) +

  # Confidence intervals
  geom_errorbar(
    aes(ymin = lower.CL, ymax = upper.CL),
    width = 0.15,
    position = position_dodge(width = 0.25),
    linewidth = 0.8
  ) +

  # Point estimates
  geom_point(
    size = 4,
    position = position_dodge(width = 0.25)
  ) +

  # Significance symbols
  geom_text(
    aes(
      y = upper.CL + 0.05,
      label = significance
    ),
    position = position_dodge(width = 0.25),
    size = 8,
    fontface = "bold",
    show.legend = FALSE
  ) +

  # Region labels
  annotate(
    "label",
    x = 4.6,
    y = 0.72,
    label = "Energetic Rescue",
    hjust = 0,
    color = "#0C2340",
    fill = "white",
    fontface = "bold",
    size = 6,
    label.size = 0.5,
    label.padding = grid::unit(0.15, "lines")
  ) +

  annotate(
    "label",
    x = 4.6,
    y = -0.46,
    label = "Energetic Trade-off",
    hjust = 0,
    color = "#E87722",
    fill = "white",
    fontface = "bold",
    size = 6,
    label.size = 0.5,
    label.padding = grid::unit(0.15, "lines")
  ) +

  scale_color_manual(
    values = c(
      "IGF1" = "#E87722",
      "IGF2" = "#0C2340",
      "No_IGF" = "grey40"
    ),
    labels = c(
      "IGF1" = "IGF1",
      "IGF2" = "IGF2",
      "No_IGF" = "None"
    )
  ) +

  labs(
    title = "IGF2 Progressively Reduces the Constraint on Regeneration",
    subtitle = "Change in regeneration per 1% increase in weight loss",
    x = "Week",
    y = "Slope of Regeneration vs. Weight Loss",
    color = "Supplementation"
  ) +

  theme_classic(base_size = 12) +
  theme(
    axis.title = element_text(face = "bold"),
    axis.text = element_text(face = "bold"),
    plot.title = element_text(face = "bold"),
    plot.subtitle = element_text(face = "bold"),
    legend.position = "bottom",
    legend.title = element_text(face = "bold")
  )

plot_rescue

ggsave(
  filename = "IGF2_energetic_rescue_figure.png",
  plot = plot_rescue,
  width = 7,
  height = 5,
  dpi = 600
)

7. Bootstrap Evaluation of the Rescue Effect

The July analysis contains two bootstrap procedures. Both are retained here because they address different purposes:

  1. A parametric bootstrap of the full rescue model for visualizing fixed-effect distributions.
  2. A late-stage bootstrap used in the sensitivity analysis of weeks 5–8.

7.1 Parametric bootstrap of the full rescue model

boot_fixed_effects <- function(fit) {
  fixef(fit)
}

bootstrap_full <- bootMer(
  model_igf_split,
  FUN = boot_fixed_effects,
  nsim = 500,
  type = "parametric"
)

bootstrap_full_df <- as.data.frame(bootstrap_full$t)
names(bootstrap_full_df) <- names(fixef(model_igf_split))

bootstrap_full_long <- bootstrap_full_df %>%
  select(
    `Week:Perc.WeightLoss`,
    `Week:Perc.WeightLoss:IGF_typeIGF1`,
    `Week:Perc.WeightLoss:IGF_typeIGF2`
  ) %>%
  pivot_longer(
    cols = everything(),
    names_to = "term",
    values_to = "estimate"
  )

bootstrap_plot <- ggplot(
  bootstrap_full_long,
  aes(x = estimate, fill = term)
) +
  geom_density(alpha = 0.9) +
  geom_vline(xintercept = 0, linetype = "dashed") +
  scale_fill_manual(
    values = c("grey40", "#E87722", "#0C2340")
  ) +
  labs(
    x = "Bootstrap estimate",
    y = "Density",
    fill = "Model term"
  ) +
  theme_classic() +
  theme(legend.position = "none")

bootstrap_plot

ggsave(
  filename = "bootstrapConfid.png",
  plot = bootstrap_plot,
  width = 2.5,
  height = 2,
  dpi = 600
)

8. Additional and Sensitivity Analyses

8.1 Administered hormone dose

igf_data <- data %>%
  filter(Treatment %in% c("DR.IGF1", "DR.IGF2")) %>%
  mutate(
    IGF_type = factor(
      Treatment,
      levels = c("DR.IGF1", "DR.IGF2")
    )
  ) %>%
  group_by(Animal_ID) %>%
  fill(Dose, .direction = "downup") %>%
  ungroup()

model_dose <- lmerTest::lmer(
  Rate_Reg ~ Week * Dose * IGF_type +
    Tail +
    (1 | Animal_ID),
  data = igf_data
)

summary(model_dose)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Rate_Reg ~ Week * Dose * IGF_type + Tail + (1 | Animal_ID)
##    Data: igf_data
## 
## REML criterion at convergence: 906.1
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.3103 -0.6481 -0.1996  0.4690  5.9740 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 0.000    0.000   
##  Residual              7.638    2.764   
## Number of obs: 187, groups:  Animal_ID, 31
## 
## Fixed effects:
##                            Estimate Std. Error        df t value Pr(>|t|)
## (Intercept)                -0.35795    7.35585 178.00000  -0.049    0.961
## Week                        0.12632    1.34847 178.00000   0.094    0.925
## Dose                        2.26232    3.14891 178.00000   0.718    0.473
## IGF_typeDR.IGF2             4.49745    9.18831 178.00000   0.489    0.625
## Tail                       -0.01696    0.03966 178.00000  -0.428    0.669
## Week:Dose                  -0.11446    0.63399 178.00000  -0.181    0.857
## Week:IGF_typeDR.IGF2       -0.63618    1.81952 178.00000  -0.350    0.727
## Dose:IGF_typeDR.IGF2       -2.11952    4.22733 178.00000  -0.501    0.617
## Week:Dose:IGF_typeDR.IGF2   0.30019    0.83719 178.00000   0.359    0.720
## 
## Correlation of Fixed Effects:
##             (Intr) Week   Dose   IGF_DR Tail   Wek:Ds W:IGF_ D:IGF_
## Week        -0.824                                                 
## Dose        -0.901  0.912                                          
## IGF_DR.IGF2 -0.658  0.669  0.723                                   
## Tail        -0.415 -0.027 -0.006 -0.011                            
## Week:Dose    0.821 -0.994 -0.919 -0.665  0.022                     
## W:IGF_DR.IG  0.617 -0.741 -0.676 -0.922  0.004  0.736              
## D:IGF_DR.IG  0.669 -0.680 -0.745 -0.993  0.011  0.685  0.916       
## W:D:IGF_DR. -0.628  0.752  0.696  0.916 -0.003 -0.757 -0.993 -0.922
## optimizer (nloptwrap) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
anova(model_dose)
## Type III Analysis of Variance Table with Satterthwaite's method
##                     Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## Week               0.33898 0.33898     1   178  0.0444 0.8334
## Dose               2.47268 2.47268     1   178  0.3237 0.5701
## IGF_type           1.82996 1.82996     1   178  0.2396 0.6251
## Tail               1.39625 1.39625     1   178  0.1828 0.6695
## Week:Dose          0.05532 0.05532     1   178  0.0072 0.9323
## Week:IGF_type      0.93374 0.93374     1   178  0.1222 0.7270
## Dose:IGF_type      1.92009 1.92009     1   178  0.2514 0.6167
## Week:Dose:IGF_type 0.98201 0.98201     1   178  0.1286 0.7203

Interpretation: Modest individual variation in administered dose did not detectably influence regeneration rate or explain the different responses to IGF1 and IGF2.

8.2 Absolute regenerated tail length

model_rescue_absolute <- lmerTest::lmer(
  Regeneration ~
    Week * Perc.WeightLoss * IGF +
    Tail +
    (1 | Animal_ID),
  data = data
)

summary(model_rescue_absolute)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Regeneration ~ Week * Perc.WeightLoss * IGF + Tail + (1 | Animal_ID)
##    Data: data
## 
## REML criterion at convergence: 2325.5
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.76231 -0.57470  0.07425  0.58648  2.89556 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 6.865    2.620   
##  Residual              8.086    2.844   
## Number of obs: 442, groups:  Animal_ID, 65
## 
## Fixed effects:
##                               Estimate Std. Error         df t value Pr(>|t|)
## (Intercept)                  -2.254751   3.542504  67.662280  -0.636 0.526608
## Week                          3.286947   0.143723 391.488312  22.870  < 2e-16
## Perc.WeightLoss               0.048973   0.040530 419.013263   1.208 0.227606
## IGFIGF                        2.865083   1.602655 332.067962   1.788 0.074735
## Tail                         -0.023917   0.047788  67.811485  -0.500 0.618353
## Week:Perc.WeightLoss         -0.016619   0.007559 389.281873  -2.199 0.028491
## Week:IGFIGF                  -1.011934   0.262631 400.604340  -3.853 0.000136
## Perc.WeightLoss:IGFIGF       -0.150642   0.074106 432.958368  -2.033 0.042684
## Week:Perc.WeightLoss:IGFIGF   0.042042   0.013760 405.312744   3.056 0.002395
##                                
## (Intercept)                    
## Week                        ***
## Perc.WeightLoss                
## IGFIGF                      .  
## Tail                           
## Week:Perc.WeightLoss        *  
## Week:IGFIGF                 ***
## Perc.WeightLoss:IGFIGF      *  
## Week:Perc.WeightLoss:IGFIGF ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) Week   Prc.WL IGFIGF Tail   Wk:P.WL W:IGFI P.WL:I
## Week        -0.167                                                  
## Prc.WghtLss -0.037  0.526                                           
## IGFIGF       0.081  0.332  0.378                                    
## Tail        -0.971  0.016 -0.126 -0.213                             
## Wk:Prc.WghL  0.141 -0.764 -0.726 -0.254 -0.024                      
## Week:IGFIGF  0.085 -0.547 -0.289 -0.691 -0.002  0.418               
## P.WL:IGFIGF  0.002 -0.287 -0.549 -0.819  0.087  0.397   0.675       
## W:P.WL:IGFI -0.068  0.420  0.400  0.597  0.004 -0.549  -0.873 -0.760
anova(model_rescue_absolute)
## Type III Analysis of Variance Table with Satterthwaite's method
##                          Sum Sq Mean Sq NumDF  DenDF  F value    Pr(>F)    
## Week                     3625.7  3625.7     1 400.55 448.4051 < 2.2e-16 ***
## Perc.WeightLoss             4.1     4.1     1 432.84   0.5083 0.4762687    
## IGF                        25.8    25.8     1 332.07   3.1959 0.0747345 .  
## Tail                        2.0     2.0     1  67.81   0.2505 0.6183533    
## Week:Perc.WeightLoss        3.3     3.3     1 405.14   0.4093 0.5226983    
## Week:IGF                  120.0   120.0     1 400.60  14.8461 0.0001358 ***
## Perc.WeightLoss:IGF        33.4    33.4     1 432.96   4.1322 0.0426844 *  
## Week:Perc.WeightLoss:IGF   75.5    75.5     1 405.31   9.3361 0.0023954 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Manuscript results:

  • Week: \(\beta=3.29\), \(t=22.87\), \(p<0.0001\)
  • Week × percent body-mass loss: \(\beta=-0.0166\), \(t=-2.20\), \(p=0.028\)
  • Week × percent body-mass loss × IGF: \(\beta=0.0420\), \(t=3.06\), \(p=0.0026\)

8.3 Endpoint covariance between energetic state and regeneration

final_regeneration_data <- data %>%
  group_by(Animal_ID) %>%
  summarise(
    final_regeneration = max(Regeneration, na.rm = TRUE),
    weight_loss = first(Perc.WeightLoss),
    Treatment = first(Treatment),
    .groups = "drop"
  )

cor.test(
  final_regeneration_data$weight_loss,
  final_regeneration_data$final_regeneration
)
## 
##  Pearson's product-moment correlation
## 
## data:  final_regeneration_data$weight_loss and final_regeneration_data$final_regeneration
## t = 0.56258, df = 61, p-value = 0.5758
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.1791079  0.3140206
## sample estimates:
##       cor 
## 0.0718454
model_endpoint_tradeoff <- lm(
  final_regeneration ~ weight_loss * Treatment,
  data = final_regeneration_data
)

summary(model_endpoint_tradeoff)
## 
## Call:
## lm(formula = final_regeneration ~ weight_loss * Treatment, data = final_regeneration_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -13.0612  -3.8851  -0.1858   3.8499  13.4936 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  17.65763    3.43266   5.144  3.7e-06 ***
## weight_loss                   0.03591    0.21771   0.165    0.870    
## TreatmentDR                  -5.52370    4.36111  -1.267    0.211    
## TreatmentDR.IGF1              1.13593    5.18537   0.219    0.827    
## TreatmentDR.IGF2             -9.61449    6.61079  -1.454    0.152    
## weight_loss:TreatmentDR       0.14270    0.24926   0.572    0.569    
## weight_loss:TreatmentDR.IGF1 -0.36936    0.28830  -1.281    0.206    
## weight_loss:TreatmentDR.IGF2  0.38573    0.33340   1.157    0.252    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.379 on 55 degrees of freedom
##   (13 observations deleted due to missingness)
## Multiple R-squared:  0.2204, Adjusted R-squared:  0.1212 
## F-statistic: 2.222 on 7 and 55 DF,  p-value: 0.04612
anova(model_endpoint_tradeoff)
## Analysis of Variance Table
## 
## Response: final_regeneration
##                       Df  Sum Sq Mean Sq F value  Pr(>F)  
## weight_loss            1   14.82  14.821  0.3642 0.54868  
## Treatment              3  320.43 106.809  2.6245 0.05954 .
## weight_loss:Treatment  3  297.71  99.238  2.4385 0.07418 .
## Residuals             55 2238.30  40.696                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

This endpoint analysis is retained because it demonstrates that the longitudinal mixed-effects model is more sensitive to changes in regenerative dynamics than a single final-time-point comparison.

8.4 Final percent body-mass loss among treatment groups

final_weight_loss <- data %>%
  ungroup() %>%
  group_by(Animal_ID) %>%
  summarise(
    final_weight_loss = max(Perc.WeightLoss, na.rm = TRUE),
    Treatment = first(na.omit(Treatment)),
    .groups = "drop"
  ) %>%
  filter(
    !is.na(final_weight_loss),
    is.finite(final_weight_loss),
    !is.na(Treatment)
  ) %>%
  mutate(
    Treatment = droplevels(as.factor(Treatment))
  )

model_final_weight_loss <- lm(
  final_weight_loss ~ Treatment,
  data = final_weight_loss
)

anova(model_final_weight_loss)
## Analysis of Variance Table
## 
## Response: final_weight_loss
##           Df Sum Sq Mean Sq F value  Pr(>F)  
## Treatment  3  602.9 200.972   2.953 0.03951 *
## Residuals 61 4151.5  68.057                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
final_weight_loss_emmeans <- emmeans(
  model_final_weight_loss,
  pairwise ~ Treatment,
  adjust = "tukey"
)

final_weight_loss_emmeans
## $emmeans
##  Treatment emmean   SE df lower.CL upper.CL
##  AdLib       17.9 1.94 61     14.0     21.7
##  DR          25.6 2.29 61     21.0     30.2
##  DR.IGF1     23.1 2.00 61     19.1     27.1
##  DR.IGF2     24.7 2.00 61     20.7     28.7
## 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast          estimate   SE df t.ratio p.value
##  AdLib - DR          -7.765 3.00 61  -2.586  0.0571
##  AdLib - DR.IGF1     -5.257 2.79 61  -1.884  0.2456
##  AdLib - DR.IGF2     -6.841 2.79 61  -2.452  0.0781
##  DR - DR.IGF1         2.508 3.04 61   0.825  0.8423
##  DR - DR.IGF2         0.924 3.04 61   0.304  0.9901
##  DR.IGF1 - DR.IGF2   -1.584 2.83 61  -0.560  0.9435
## 
## P value adjustment: tukey method for comparing a family of 4 estimates

Manuscript interpretation: Final percent body-mass loss did not differ among the three diet-restricted groups, supporting the conclusion that the IGF2 rescue effect was not explained by reduced energetic deficit.

ggplot(
  final_weight_loss,
  aes(
    x = Treatment,
    y = final_weight_loss,
    fill = Treatment
  )
) +
  geom_violin(alpha = 0.3, trim = FALSE) +
  geom_jitter(width = 0.1, alpha = 0.7, size = 2) +
  stat_summary(
    fun = mean,
    geom = "point",
    size = 4,
    color = "black"
  ) +
  stat_summary(
    fun.data = mean_cl_normal,
    geom = "errorbar",
    width = 0.15,
    color = "black"
  ) +
  scale_fill_manual(values = treatment_colors) +
  labs(
    x = "Treatment",
    y = "Final percent body-mass loss"
  ) +
  theme_classic() +
  theme(legend.position = "none")

9. Evaluation of Weeks 5–8

9.1 Visual inspection of individual regeneration trajectories

regeneration_raw <- read.csv(
  "R.analysis.currated.csv",
  stringsAsFactors = FALSE
)

regeneration_after_week_2 <- regeneration_raw %>%
  filter(Week > 2)

plot_length_loss_all <- ggplot(
  regeneration_raw,
  aes(
    x = Week,
    y = Regeneration,
    color = Animal_ID,
    group = Animal_ID
  )
) +
  geom_line() +
  geom_text(
    aes(label = Animal_ID),
    hjust = 0,
    vjust = 0,
    size = 2
  ) +
  facet_wrap(
    ~Treatment,
    scales = "free",
    ncol = 2
  ) +
  theme(legend.position = "none")

plot_length_loss_late <- ggplot(
  regeneration_after_week_2,
  aes(
    x = Week,
    y = Regeneration,
    color = Animal_ID,
    group = Animal_ID
  )
) +
  geom_line() +
  geom_text(
    aes(label = Animal_ID),
    hjust = 0,
    vjust = 0,
    size = 2
  ) +
  facet_wrap(
    ~Treatment,
    scales = "free",
    ncol = 2
  ) +
  theme(legend.position = "none")

plot_length_loss_all

plot_length_loss_late

ggsave(
  filename = "length_loss.png",
  plot = plot_length_loss_all,
  width = 8,
  height = 8,
  dpi = 600
)

ggsave(
  filename = "length_loss_sub.png",
  plot = plot_length_loss_late,
  width = 8,
  height = 8,
  dpi = 600
)

9.2 Early-only versus full eight-week model

model_early <- lmerTest::lmer(
  Perc.Regeneration ~
    Week * Perc.WeightLoss * IGF_type +
    Tail +
    (1 | Animal_ID),
  data = data %>%
    filter(Week <= 4)
)

model_full <- lmerTest::lmer(
  Perc.Regeneration ~
    Week * Perc.WeightLoss * IGF_type +
    Tail +
    (1 | Animal_ID),
  data = data
)

summary(model_early)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * IGF_type + Tail +  
##     (1 | Animal_ID)
##    Data: data %>% filter(Week <= 4)
## 
## REML criterion at convergence: 1398.1
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.3603 -0.6766  0.0364  0.5755  3.6846 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept)  2.109   1.452   
##  Residual              13.084   3.617   
## Number of obs: 250, groups:  Animal_ID, 65
## 
## Fixed effects:
##                                    Estimate Std. Error        df t value
## (Intercept)                        -1.03249    3.28353  88.26216  -0.314
## Week                                6.51706    0.61407 214.47588  10.613
## Perc.WeightLoss                     0.13154    0.07686 203.94379   1.711
## IGF_typeIGF1                        5.00021    3.16573 232.96815   1.579
## IGF_typeIGF2                        2.41231    4.08500 229.06413   0.591
## Tail                               -0.12144    0.04048  63.90994  -3.000
## Week:Perc.WeightLoss               -0.04154    0.03320 216.92163  -1.251
## Week:IGF_typeIGF1                  -2.72621    1.30759 221.65809  -2.085
## Week:IGF_typeIGF2                  -2.28603    1.51661 194.62876  -1.507
## Perc.WeightLoss:IGF_typeIGF1       -0.17276    0.16381 230.81261  -1.055
## Perc.WeightLoss:IGF_typeIGF2       -0.04365    0.19071 228.74930  -0.229
## Week:Perc.WeightLoss:IGF_typeIGF1   0.08865    0.07167 232.22843   1.237
## Week:Perc.WeightLoss:IGF_typeIGF2   0.06108    0.07022 197.01077   0.870
##                                   Pr(>|t|)    
## (Intercept)                        0.75393    
## Week                               < 2e-16 ***
## Perc.WeightLoss                    0.08852 .  
## IGF_typeIGF1                       0.11558    
## IGF_typeIGF2                       0.55542    
## Tail                               0.00385 ** 
## Week:Perc.WeightLoss               0.21227    
## Week:IGF_typeIGF1                  0.03822 *  
## Week:IGF_typeIGF2                  0.13335    
## Perc.WeightLoss:IGF_typeIGF1       0.29270    
## Perc.WeightLoss:IGF_typeIGF2       0.81917    
## Week:Perc.WeightLoss:IGF_typeIGF1  0.21739    
## Week:Perc.WeightLoss:IGF_typeIGF2  0.38547    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(model_full)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * IGF_type + Tail +  
##     (1 | Animal_ID)
##    Data: data
## 
## REML criterion at convergence: 2717.5
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -3.05240 -0.58328  0.07647  0.53288  3.14152 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 15.52    3.940   
##  Residual              19.87    4.457   
## Number of obs: 443, groups:  Animal_ID, 65
## 
## Fixed effects:
##                                    Estimate Std. Error        df t value
## (Intercept)                         8.95632    5.37444  66.82767   1.666
## Week                                5.57153    0.22507 390.98913  24.755
## Perc.WeightLoss                     0.16173    0.06336 418.47176   2.553
## IGF_typeIGF1                        6.23221    2.90106 308.60824   2.148
## IGF_typeIGF2                        4.86116    3.88987 361.49614   1.250
## Tail                               -0.22402    0.07251  66.89851  -3.090
## Week:Perc.WeightLoss               -0.05150    0.01184 388.69919  -4.350
## Week:IGF_typeIGF1                  -1.60695    0.50288 411.98772  -3.196
## Week:IGF_typeIGF2                  -2.61979    0.61694 399.53650  -4.246
## Perc.WeightLoss:IGF_typeIGF1       -0.25717    0.14183 423.73347  -1.813
## Perc.WeightLoss:IGF_typeIGF2       -0.23525    0.17665 422.61347  -1.332
## Week:Perc.WeightLoss:IGF_typeIGF1   0.03935    0.02919 424.77894   1.348
## Week:Perc.WeightLoss:IGF_typeIGF2   0.11330    0.02987 393.97138   3.793
##                                   Pr(>|t|)    
## (Intercept)                       0.100302    
## Week                               < 2e-16 ***
## Perc.WeightLoss                   0.011041 *  
## IGF_typeIGF1                      0.032472 *  
## IGF_typeIGF2                      0.212219    
## Tail                              0.002919 ** 
## Week:Perc.WeightLoss              1.74e-05 ***
## Week:IGF_typeIGF1                 0.001503 ** 
## Week:IGF_typeIGF2                 2.70e-05 ***
## Perc.WeightLoss:IGF_typeIGF1      0.070503 .  
## Perc.WeightLoss:IGF_typeIGF2      0.183676    
## Week:Perc.WeightLoss:IGF_typeIGF1 0.178340    
## Week:Perc.WeightLoss:IGF_typeIGF2 0.000172 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Reported comparison:

  • Weeks 1–4: IGF2 interaction \(\beta=0.088\), \(p=0.213\)
  • Weeks 1–8: IGF2 interaction \(\beta=0.114\), \(p=0.000138\)

9.3 Within-individual repeatability

icc(model_full)
## # Intraclass Correlation Coefficient
## 
##     Adjusted ICC: 0.439
##   Unadjusted ICC: 0.114

Reported result: Adjusted ICC approximately 0.47, indicating moderate within-individual repeatability across the full eight-week dataset.

9.4 Residual variation across weeks

full_model_residual_data <- model.frame(model_full) %>%
  mutate(
    residual = residuals(model_full),
    absolute_residual = abs(residual)
  )

model_absolute_residuals <- lm(
  absolute_residual ~ factor(Week),
  data = full_model_residual_data
)

anova(model_absolute_residuals)
## Analysis of Variance Table
## 
## Response: absolute_residual
##               Df  Sum Sq Mean Sq F value    Pr(>F)    
## factor(Week)   7  279.36  39.909  6.1601 6.937e-07 ***
## Residuals    435 2818.18   6.479                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

9.5 Late-stage bootstrap

late_data <- data %>%
  filter(Week >= 5)

model_late <- lmerTest::lmer(
  Perc.Regeneration ~
    Week * Perc.WeightLoss * IGF_type +
    Tail +
    (1 | Animal_ID),
  data = late_data
)

late_boot_function <- function(fit) {
  fixef(fit)["Week:Perc.WeightLoss:IGF_typeIGF2"]
}

bootstrap_late <- bootMer(
  model_late,
  FUN = late_boot_function,
  nsim = 1000
)

late_bootstrap_interval <- quantile(
  bootstrap_late$t,
  c(0.025, 0.5, 0.975),
  na.rm = TRUE
)

late_bootstrap_interval
##       2.5%        50%      97.5% 
## 0.07039122 0.15367184 0.23979299

Reported result: Median \(=0.142\), 95% bootstrap interval \(=0.051\) to \(0.231\).

10. Evaluation of Original Tail Length as a Covariate

Models are fitted with maximum likelihood for valid AIC comparison.

model_rescue_without_tail <- lmerTest::lmer(
  Perc.Regeneration ~
    Week * Perc.WeightLoss * IGF_type +
    (1 | Animal_ID),
  data = data,
  REML = FALSE
)

model_rescue_with_tail <- lmerTest::lmer(
  Perc.Regeneration ~
    Week * Perc.WeightLoss * IGF_type +
    Tail +
    (1 | Animal_ID),
  data = data,
  REML = FALSE
)

AIC(
  model_rescue_without_tail,
  model_rescue_with_tail
)
##                           df      AIC
## model_rescue_without_tail 14 2723.345
## model_rescue_with_tail    15 2715.726
summary(model_rescue_with_tail)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
##   method [lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * IGF_type + Tail +  
##     (1 | Animal_ID)
##    Data: data
## 
##       AIC       BIC    logLik -2*log(L)  df.resid 
##    2715.7    2777.1   -1342.9    2685.7       428 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.0681 -0.5929  0.0779  0.5390  3.1805 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 14.17    3.764   
##  Residual              19.44    4.409   
## Number of obs: 443, groups:  Animal_ID, 65
## 
## Fixed effects:
##                                    Estimate Std. Error        df t value
## (Intercept)                         8.95617    5.17142  72.03897   1.732
## Week                                5.57428    0.22248 400.21150  25.056
## Perc.WeightLoss                     0.16235    0.06253 429.96459   2.596
## IGF_typeIGF1                        6.18235    2.84050 331.02943   2.177
## IGF_typeIGF2                        4.88263    3.81574 378.73717   1.280
## Tail                               -0.22414    0.06977  72.01932  -3.213
## Week:Perc.WeightLoss               -0.05169    0.01170 397.72469  -4.417
## Week:IGF_typeIGF1                  -1.60184    0.49654 422.19869  -3.226
## Week:IGF_typeIGF2                  -2.62240    0.60958 409.23309  -4.302
## Perc.WeightLoss:IGF_typeIGF1       -0.25435    0.13957 438.29668  -1.822
## Perc.WeightLoss:IGF_typeIGF2       -0.23644    0.17381 436.11440  -1.360
## Week:Perc.WeightLoss:IGF_typeIGF1   0.03902    0.02879 436.27083   1.355
## Week:Perc.WeightLoss:IGF_typeIGF2   0.11350    0.02952 403.28249   3.844
##                                   Pr(>|t|)    
## (Intercept)                        0.08758 .  
## Week                               < 2e-16 ***
## Perc.WeightLoss                    0.00974 ** 
## IGF_typeIGF1                       0.03022 *  
## IGF_typeIGF2                       0.20147    
## Tail                               0.00197 ** 
## Week:Perc.WeightLoss              1.29e-05 ***
## Week:IGF_typeIGF1                  0.00135 ** 
## Week:IGF_typeIGF2                 2.12e-05 ***
## Perc.WeightLoss:IGF_typeIGF1       0.06908 .  
## Perc.WeightLoss:IGF_typeIGF2       0.17443    
## Week:Perc.WeightLoss:IGF_typeIGF1  0.17609    
## Week:Perc.WeightLoss:IGF_typeIGF2  0.00014 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(model_rescue_with_tail)
## Type III Analysis of Variance Table with Satterthwaite's method
##                               Sum Sq Mean Sq NumDF  DenDF  F value    Pr(>F)
## Week                          5341.3  5341.3     1 415.87 274.7259 < 2.2e-16
## Perc.WeightLoss                  0.0     0.0     1 433.80   0.0003 0.9860797
## IGF_type                       108.4    54.2     2 356.60   2.7887 0.0628429
## Tail                           200.7   200.7     1  72.02  10.3213 0.0019675
## Week:Perc.WeightLoss             0.1     0.1     1 424.05   0.0042 0.9484235
## Week:IGF_type                  487.0   243.5     2 415.99  12.5230 5.233e-06
## Perc.WeightLoss:IGF_type        87.2    43.6     2 436.27   2.2438 0.1072814
## Week:Perc.WeightLoss:IGF_type  298.2   149.1     2 422.81   7.6681 0.0005355
##                                  
## Week                          ***
## Perc.WeightLoss                  
## IGF_type                      .  
## Tail                          ** 
## Week:Perc.WeightLoss             
## Week:IGF_type                 ***
## Perc.WeightLoss:IGF_type         
## Week:Perc.WeightLoss:IGF_type ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Reported result: Inclusion of original tail length improved model fit by \(\Delta AIC=6.9\), so Tail was retained as an additive covariate in the primary rescue model.

11. Publication Figures

11.1 Figure 1: dietary restriction and the energetic trade-off

figure1_weight_data <- diet_final_acclimation %>%
  mutate(
    Diet_display = case_when(
      Treatment == "AdLib" ~ "High",
      Treatment %in% c("DR", "DR.IGF1", "DR.IGF2") ~ "Low",
      TRUE ~ NA_character_
    ),
    Diet_display = factor(
      Diet_display,
      levels = c("High", "Low")
    )
  )

figure1_regeneration_data <- data %>%
  mutate(
    Diet_display = case_when(
      Treatment == "AdLib" ~ "High",
      Treatment %in% c("DR", "DR.IGF1", "DR.IGF2") ~ "Low",
      TRUE ~ NA_character_
    ),
    Diet_display = factor(
      Diet_display,
      levels = c("High", "Low")
    )
  )

panel_1a <- ggplot(
  figure1_weight_data,
  aes(x = Diet_display, y = Perc_Orig)
) +
  geom_violin(
    fill = "grey75",
    color = "black",
    trim = FALSE,
    scale = "width",
    alpha = 0.8
  ) +
  geom_boxplot(
    width = 0.12,
    outlier.shape = NA,
    fill = "white",
    color = "black"
  ) +
  geom_jitter(
    width = 0.08,
    size = 1.8,
    shape = 21,
    fill = "white",
    color = "black",
    alpha = 0.8
  ) +
  labs(
    title = "Dietary restriction increased weight loss",
    x = "Diet",
    y = "Percent of original body mass"
  ) +
  theme_classic(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold"),
    axis.title = element_text(face = "bold"),
    axis.text = element_text(face = "bold")
  )

panel_1b <- ggplot(
  figure1_regeneration_data,
  aes(
    x = Week,
    y = Perc.Regeneration,
    shape = Diet_display,
    linetype = Diet_display,
    group = Diet_display
  )
) +
  stat_summary(
    fun = mean,
    geom = "line",
    linewidth = 1.2,
    color = "black"
  ) +
  stat_summary(
    fun = mean,
    geom = "point",
    size = 3,
    color = "black"
  ) +
  stat_summary(
    fun.data = mean_se,
    geom = "errorbar",
    width = 0.15,
    color = "black"
  ) +
  scale_shape_manual(
    values = c("High" = 16, "Low" = 17)
  ) +
  scale_linetype_manual(
    values = c("High" = "solid", "Low" = "dashed")
  ) +
  labs(
    title = "Dietary restriction reduced regeneration",
    x = "Week",
    y = "Percent regeneration",
    shape = "Diet",
    linetype = "Diet"
  ) +
  theme_classic(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold"),
    axis.title = element_text(face = "bold"),
    axis.text = element_text(face = "bold"),
    legend.position = "bottom"
  )

tradeoff_no_igf <- data %>%
  filter(IGF_type == "No_IGF")

model_tradeoff_no_igf <- lmerTest::lmer(
  Perc.Regeneration ~
    Week * Perc.WeightLoss +
    (1 | Animal_ID),
  data = tradeoff_no_igf
)

tradeoff_slopes <- emtrends(
  model_tradeoff_no_igf,
  ~ Week,
  var = "Perc.WeightLoss",
  at = list(Week = c(2, 4, 6, 8))
)

tradeoff_slopes_df <- as.data.frame(
  summary(tradeoff_slopes, infer = TRUE)
) %>%
  mutate(
    sig_zero = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01  ~ "**",
      p.value < 0.05  ~ "*",
      p.value < 0.10  ~ "†",
      TRUE            ~ ""
    )
  )

panel_1c <- ggplot(
  tradeoff_slopes_df,
  aes(
    x = Week,
    y = Perc.WeightLoss.trend
  )
) +
  geom_hline(
    yintercept = 0,
    linetype = "dashed",
    color = "black",
    linewidth = 0.7
  ) +
  geom_errorbar(
    aes(ymin = lower.CL, ymax = upper.CL),
    width = 0.18,
    linewidth = 0.8,
    color = "grey30"
  ) +
  geom_point(
    size = 4.5,
    color = "grey30"
  ) +
  geom_text(
    aes(
      y = lower.CL - 0.035,
      label = sig_zero
    ),
    size = 5,
    fontface = "bold",
    color = "grey30"
  ) +
  scale_x_continuous(
    breaks = c(2, 4, 6, 8)
  ) +
  scale_y_continuous(
    breaks = seq(-0.4, 0.1, by = 0.1),
    limits = c(-0.43, 0.15),
    labels = scales::number_format(accuracy = 0.1),
    expand = expansion(mult = c(0.04, 0.05))
  ) +
  labs(
    title = "Energetic trade-off strengthened over time",
    subtitle = "Change in regeneration per 1% increase in weight loss",
    x = "Week",
    y = "Slope of Regeneration\nvs. Weight Loss"
  ) +
  theme_classic(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    plot.subtitle = element_text(face = "bold", size = 12),
    axis.title = element_text(face = "bold", size = 13),
    axis.text = element_text(face = "bold", size = 12),
    axis.title.y = element_text(margin = margin(r = 10))
  )

figure_1 <- (panel_1a + panel_1b) / panel_1c +
  plot_layout(heights = c(1, 0.9)) +
  plot_annotation(
    title = "Dietary Restriction Establishes an Energetic Trade-Off",
    tag_levels = "A"
  ) &
  theme(
    plot.tag = element_text(face = "bold", size = 20)
  )

figure_1

ggsave(
  filename = "dietary_restriction_tradeoff_multiplot.png",
  plot = figure_1,
  width = 10,
  height = 7,
  dpi = 600
)

11.2 Figure 2B: cumulative change in slope

cumulative_slope_change <- week_specific_slopes_df %>%
  filter(Week %in% c(2, 8)) %>%
  select(
    IGF_type,
    Week,
    Perc.WeightLoss.trend
  ) %>%
  pivot_wider(
    names_from = Week,
    values_from = Perc.WeightLoss.trend,
    names_prefix = "Week_"
  ) %>%
  mutate(
    change = Week_8 - Week_2
  )

plot_cumulative_effect <- ggplot(
  cumulative_slope_change,
  aes(
    x = IGF_type,
    y = change,
    fill = IGF_type
  )
) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  geom_col(width = 0.65) +
  scale_fill_manual(values = igf_colors) +
  scale_x_discrete(
    labels = c(
      "No_IGF" = "None",
      "IGF1" = "IGF1",
      "IGF2" = "IGF2"
    )
  ) +
  labs(
    title = "Cumulative Effects",
    x = "Supplementation",
    y = expression(Delta ~ slope ~ relative ~ to ~ control),
    fill = "IGF supplementation"
  ) +
  theme_classic() +
  theme(legend.position = "none")

plot_cumulative_effect

ggsave(
  filename = "IGF2_means.png",
  plot = plot_cumulative_effect,
  width = 2.5,
  height = 2,
  dpi = 600
)

11.3 Regeneration and body-mass-loss trajectories

plot_regeneration_trajectories <- ggplot(
  data,
  aes(
    x = Week,
    y = Perc.Regeneration,
    color = Treatment,
    group = Treatment
  )
) +
  stat_summary(fun = mean, geom = "line", linewidth = 1.2) +
  stat_summary(fun = mean, geom = "point", size = 2.8) +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.15) +
  scale_color_manual(
    values = treatment_colors,
    labels = c(
      "AdLib" = "AdLib",
      "DR" = "DR",
      "DR.IGF1" = "DR + IGF1",
      "DR.IGF2" = "DR + IGF2"
    )
  ) +
  labs(
    title = "Regeneration diverged among treatments",
    x = "Week",
    y = "Percent regeneration",
    color = "Treatment"
  ) +
  theme_classic(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold"),
    axis.title = element_text(face = "bold"),
    axis.text = element_text(face = "bold"),
    legend.position = "bottom"
  )

plot_weightloss_trajectories <- ggplot(
  data,
  aes(
    x = Week,
    y = Perc.WeightLoss,
    color = Treatment,
    group = Treatment
  )
) +
  stat_summary(fun = mean, geom = "line", linewidth = 1.2) +
  stat_summary(fun = mean, geom = "point", size = 2.8) +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.15) +
  scale_color_manual(
    values = treatment_colors,
    labels = c(
      "AdLib" = "AdLib",
      "DR" = "DR",
      "DR.IGF1" = "DR + IGF1",
      "DR.IGF2" = "DR + IGF2"
    )
  ) +
  labs(
    title = "Weight loss did not separate similarly",
    x = "Week",
    y = "Percent weight loss",
    color = "Treatment"
  ) +
  theme_classic(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold"),
    axis.title = element_text(face = "bold"),
    axis.text = element_text(face = "bold"),
    legend.position = "bottom"
  )

combined_regeneration_weightloss <- (
  plot_regeneration_trajectories /
    plot_weightloss_trajectories
) +
  plot_layout(guides = "collect") +
  plot_annotation(
    title = "IGF2 altered regeneration without broadly reducing energetic deficit"
  ) &
  theme(
    legend.position = "bottom",
    plot.title = element_text(face = "bold")
  )

combined_regeneration_weightloss

11.4 Restricted-group biology figure

restricted_data <- data %>%
  filter(
    Treatment %in% c("DR", "DR.IGF1", "DR.IGF2")
  ) %>%
  mutate(
    Treatment = factor(
      Treatment,
      levels = c("DR", "DR.IGF1", "DR.IGF2")
    )
  )

model_restricted_rescue <- lmerTest::lmer(
  Perc.Regeneration ~
    Week * Perc.WeightLoss * Treatment +
    (1 | Animal_ID),
  data = restricted_data
)

restricted_slopes <- emtrends(
  model_restricted_rescue,
  ~ Treatment | Week,
  var = "Perc.WeightLoss",
  at = list(Week = c(2, 4, 6, 8))
)

restricted_slopes_df <- as.data.frame(
  summary(restricted_slopes, infer = TRUE)
)

restricted_colors <- c(
  "DR" = "grey40",
  "DR.IGF1" = "#E87722",
  "DR.IGF2" = "#0C2340"
)

restricted_labels <- c(
  "DR" = "DR",
  "DR.IGF1" = "DR + IGF1",
  "DR.IGF2" = "DR + IGF2"
)

restricted_panel_a <- ggplot(
  restricted_slopes_df,
  aes(
    x = Week,
    y = Perc.WeightLoss.trend,
    color = Treatment,
    group = Treatment
  )
) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  geom_errorbar(
    aes(ymin = lower.CL, ymax = upper.CL),
    width = 0.15,
    position = position_dodge(width = 0.25)
  ) +
  geom_point(
    size = 3.5,
    position = position_dodge(width = 0.25)
  ) +
  geom_line(
    linewidth = 1,
    position = position_dodge(width = 0.25)
  ) +
  scale_color_manual(
    values = restricted_colors,
    labels = restricted_labels,
    name = "Treatment"
  ) +
  labs(
    title = "IGF2 changed the regeneration response to weight loss",
    x = "Week",
    y = "Change in regeneration per 1% weight loss"
  ) +
  theme_classic(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold"),
    axis.title = element_text(face = "bold"),
    axis.text = element_text(face = "bold"),
    legend.position = "bottom"
  )

restricted_final_weight_loss <- final_weight_loss %>%
  filter(
    Treatment %in% c("DR", "DR.IGF1", "DR.IGF2")
  ) %>%
  mutate(
    Treatment = factor(
      Treatment,
      levels = c("DR", "DR.IGF1", "DR.IGF2")
    )
  )

restricted_panel_b <- ggplot(
  restricted_final_weight_loss,
  aes(
    x = Treatment,
    y = final_weight_loss,
    fill = Treatment
  )
) +
  geom_violin(trim = FALSE, alpha = 0.25, color = NA) +
  geom_jitter(width = 0.08, alpha = 0.6, size = 1.8) +
  stat_summary(
    fun = mean,
    geom = "point",
    size = 3.5,
    color = "black"
  ) +
  stat_summary(
    fun.data = mean_cl_normal,
    geom = "errorbar",
    width = 0.15,
    color = "black"
  ) +
  scale_fill_manual(
    values = restricted_colors,
    labels = restricted_labels,
    name = "Treatment"
  ) +
  scale_x_discrete(labels = restricted_labels) +
  labs(
    title = "IGF2 did not reduce body mass loss",
    x = "Treatment",
    y = "Final percent body-mass loss"
  ) +
  theme_classic(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold"),
    axis.title = element_text(face = "bold"),
    axis.text = element_text(face = "bold"),
    legend.position = "none"
  )

restricted_biology_figure <- (
  restricted_panel_a |
    restricted_panel_b
) +
  plot_layout(widths = c(1.5, 1)) +
  plot_annotation(
    title = "IGF2 altered regeneration biology without reducing energetic deficit",
    tag_levels = "A"
  ) &
  theme(
    plot.title = element_text(face = "bold"),
    plot.tag = element_text(face = "bold", size = 16)
  )

restricted_biology_figure

12. Session Information

Including session information documents the versions of R and all attached packages used to render the analysis.

sessionInfo()
## R version 4.5.2 (2025-10-31)
## Platform: aarch64-apple-darwin20
## Running under: macOS Sequoia 15.7.4
## 
## 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] hrbrthemes_0.9.3    viridis_0.6.5       viridisLite_0.4.3  
##  [4] plotly_4.12.0       patchwork_1.3.2     ggplot2_4.0.2      
##  [7] Rmisc_1.5.1         plyr_1.8.9          lattice_0.22-7     
## [10] ggeffects_2.3.2     performance_0.16.0  emmeans_2.0.2      
## [13] multcomp_1.4-30     TH.data_1.1-5       MASS_7.3-65        
## [16] survival_3.8-3      mvtnorm_1.3-5       bestNormalize_1.9.2
## [19] MuMIn_1.48.19       lmtest_0.9-40       zoo_1.8-15         
## [22] car_3.1-5           carData_3.0-6       nlme_3.1-168       
## [25] lme4_2.0-6          Matrix_1.7-4        tidyr_1.3.2        
## [28] dplyr_1.2.1        
## 
## loaded via a namespace (and not attached):
##   [1] RColorBrewer_1.1-3  rstudioapi_0.18.0   jsonlite_2.0.0     
##   [4] datawizard_1.3.1    magrittr_2.0.4      estimability_1.5.1 
##   [7] farver_2.1.2        nloptr_2.2.1        rmarkdown_2.30     
##  [10] ragg_1.5.2          vctrs_0.7.1         minqa_1.2.8        
##  [13] base64enc_0.1-6     butcher_0.4.0       htmltools_0.5.9    
##  [16] forcats_1.0.1       progress_1.2.3      haven_2.5.5        
##  [19] broom_1.0.12        Formula_1.2-5       sass_0.4.10        
##  [22] parallelly_1.47.0   bslib_0.10.0        htmlwidgets_1.6.4  
##  [25] pbkrtest_0.5.5      sandwich_3.1-1      lubridate_1.9.5    
##  [28] cachem_1.1.0        lifecycle_1.0.5     iterators_1.0.14   
##  [31] pkgconfig_2.0.3     sjlabelled_1.2.0    R6_2.6.1           
##  [34] fastmap_1.2.0       rbibutils_2.4.1     future_1.70.0      
##  [37] digest_0.6.39       numDeriv_2016.8-1.1 colorspace_2.1-2   
##  [40] textshaping_1.0.5   Hmisc_5.2-5         labeling_0.4.3     
##  [43] timechange_0.4.0    httr_1.4.8          abind_1.4-8        
##  [46] mgcv_1.9-3          compiler_4.5.2      rngtools_1.5.2     
##  [49] withr_3.0.2         doParallel_1.0.17   htmlTable_2.5.0    
##  [52] S7_0.2.1            backports_1.5.0     lava_1.9.0         
##  [55] tools_4.5.2         foreign_0.8-90      otel_0.2.0         
##  [58] future.apply_1.20.2 nnet_7.3-20         glue_1.8.1         
##  [61] grid_4.5.2          checkmate_2.3.4     cluster_2.1.8.2    
##  [64] generics_0.1.4      recipes_1.3.2       gtable_0.3.6       
##  [67] class_7.3-23        data.table_1.18.2.1 hms_1.1.4          
##  [70] utf8_1.2.6          stringr_1.6.0       foreach_1.5.2      
##  [73] pillar_1.11.1       splines_4.5.2       tidyselect_1.2.1   
##  [76] knitr_1.51          reformulas_0.4.4    gridExtra_2.3      
##  [79] stats4_4.5.2        xfun_0.56           hardhat_1.4.3      
##  [82] timeDate_4052.112   stringi_1.8.7       lazyeval_0.2.2     
##  [85] yaml_2.3.12         boot_1.3-32         evaluate_1.0.5     
##  [88] codetools_0.2-20    tibble_3.3.1        cli_3.6.5          
##  [91] rpart_4.1.24        xtable_1.8-8        systemfonts_1.3.2  
##  [94] Rdpack_2.6.6        jquerylib_0.1.4     Rcpp_1.1.2         
##  [97] globals_0.19.1      coda_0.19-4.1       parallel_4.5.2     
## [100] gower_1.0.2         prettyunits_1.2.0   doRNG_1.8.6.3      
## [103] listenv_0.10.1      ipred_0.9-15        lmerTest_3.2-1     
## [106] scales_1.4.0        prodlim_2026.03.11  insight_1.5.1      
## [109] purrr_1.2.2         crayon_1.5.3        rlang_1.3.0