Overview and Setup

Main takeaways

  • Dietary restriction successfully produced a difference in pre-autotomy body-mass loss. Restricted females lost more body mass than ad libitum-fed females before autotomy.
  • During regeneration, energetic state and cumulative regenerative performance became increasingly associated over time. Because these variables were measured concurrently, this result is interpreted as energetic-state/regeneration coupling, not as evidence that energetic state caused subsequent regeneration.
  • Temporal validation asks whether the same relationship is detectable when energetic state precedes the regenerative response. These analyses distinguish a prospective energetic effect from the concurrent association observed during regeneration.
  • IGF analyses are restricted to diet-restricted animals so that Vehicle, IGF1, and IGF2 are compared while holding diet constant. Week-specific slopes and pairwise contrasts are used to determine whether supplementation modifies energetic-state/regeneration coupling.
  • Post-autotomy body-mass trajectories did not differ significantly among supplementation groups, so the IGF-associated regeneration patterns are not explained by a uniquely different body-mass trajectory in the IGF2 group.
  • Overall, the analyses support an association between ongoing energetic state and regenerative performance that develops as regeneration proceeds. They do not establish the direction of causality.

Purpose: Provide the complete analysis and figure-generation workflow accompanying the manuscript on energetic state, IGF supplementation, and tail regeneration in adult female brown anoles (Anolis sagrei).

Approach: Cumulative percent tail regeneration is the primary response. Percent body-mass loss is treated as a continuous measure of energetic state; positive values indicate mass loss and negative values indicate mass gain. The primary analysis evaluates the concurrent association between energetic state and cumulative regeneration. Temporal validation evaluates energetic state before autotomy and before subsequent regeneration intervals. IGF comparisons are restricted to diet-restricted animals because IGF1 and IGF2 were administered only within that diet treatment.

Result/Decision: The concurrent analysis is retained as the primary energetic-state analysis. Pre-autotomy and lagged analyses are retained as temporal validation. IGF effects are interpreted from Restricted + Vehicle versus Restricted + IGF1 versus Restricted + IGF2 comparisons so that diet is held constant.

Analysis group map

For clarity, analyses use one of three group structures:

  • All four groups: AdLib, Restricted + Vehicle, Restricted + IGF1, and Restricted + IGF2. Used for baseline checks and broad questions about energetic state.
  • Restricted-diet IGF comparison: Restricted + Vehicle, Restricted + IGF1, and Restricted + IGF2. Used whenever the question is whether IGF1 or IGF2 modifies regeneration. This holds diet constant.
  • IGF-treated animals only: Restricted + IGF1 and Restricted + IGF2. Used only for dose analyses.

This distinction is important because the High Diet/AdLib group received Vehicle but did not share the same diet treatment as the IGF groups. It should therefore not be pooled with Restricted + Vehicle when estimating the experimental effect of IGF supplementation.

Document organization

This reproducibility file is organized into four major sections:

  1. Published Analyses — primary statistical analyses reported in the manuscript.
  2. Publication Figures — code used to create and export each manuscript figure panel separately for assembly in BioRender.
  3. Validation — temporal, alternative-outcome, tail-length, dose, and post-autotomy mass sensitivity analyses.
  4. Exploration — model-structure checks, full-period diagnostics, descriptive trajectories, sample sizes, and session information.

Week-specific regeneration estimates are evaluated across Weeks 1–8 where those observations are available. The body-mass trajectory displays Week 0 explicitly. Lagged analyses use consecutive one-week intervals from Week 1→2 through Week 7→8.

Packages and plotting settings

Purpose: Load the packages used for data manipulation, mixed models, estimated trends, model checks, and figure construction, and define the shared IGF plotting colors.

Approach: Packages and plotting settings are loaded once so that the analyses and figures below use the same environment and treatment definitions.

Result/Decision: These settings are used throughout the reproducibility file.

library(tidyverse)
library(lme4)
library(lmerTest)
library(emmeans)
library(performance)
library(patchwork)
set.seed(123)

igf_colors <- c("Vehicle"="grey40", "IGF1"="#E66101", "IGF2"="#0B1F3A")

Data import and preparation

Purpose: Import the pre-autotomy/diet dataset and regeneration dataset and reconstruct the analysis groups used throughout the paper.

Approach: The two analysis files are imported, animals with substantial secondary tail loss are excluded, treatment factors are reconstructed explicitly, and the restricted-diet IGF dataset is created. The code also prints the weeks and sample counts represented in each dataset.

Result/Decision: All later analyses use these cleaned datasets and explicit group definitions. IGF comparisons use Restricted + Vehicle, Restricted + IGF1, and Restricted + IGF2 so that diet is held constant.

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

# Animals experiencing substantial secondary tail loss were excluded entirely.
excluded_animals <- c("BC121", "BC144", "BC383", "BC561")
data <- data %>% filter(!Animal_ID %in% excluded_animals)

# Reconstruct analysis factors explicitly.
data <- data %>%
  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_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"))
  )

# IGF analyses: restricted-diet animals only.
igf_data <- data %>%
  filter(Diet=="Restricted") %>%
  mutate(
    Supplementation=case_when(Treatment=="DR" ~ "Vehicle",
                              Treatment=="DR.IGF1" ~ "IGF1",
                              Treatment=="DR.IGF2" ~ "IGF2"),
    Supplementation=factor(Supplementation, levels=c("Vehicle","IGF1","IGF2"))
  )

str(data)
## 'data.frame':    608 obs. of  17 variables:
##  $ Animal_ID        : chr  "BC039" "BC039" "BC039" "BC039" ...
##  $ ToeClip          : chr  "1455" "1455" "1455" "1455" ...
##  $ BC_Cage          : int  32 32 32 32 32 32 32 32 28 28 ...
##  $ Treatment        : Factor w/ 4 levels "AdLib","DR","DR.IGF1",..: 3 3 3 3 3 3 3 3 1 1 ...
##  $ Tail             : num  73 73 73 73 73 73 73 73 69 69 ...
##  $ SVL              : int  46 46 46 46 46 46 46 46 48 48 ...
##  $ Week             : int  1 2 3 4 5 6 7 8 1 2 ...
##  $ Mass             : num  2.1 2.07 2.1 2.1 2.24 ...
##  $ Dose             : num  2.38 2.38 2.38 2.38 2.38 ...
##  $ Perc.WeightLoss  : num  18 19.3 18.2 18.2 12.7 ...
##  $ Regeneration     : num  0 0.15 6 11 16 20 22 24 0 0.1 ...
##  $ Rate_Reg         : num  NA 0.15 5.85 5 5 4 2 2 NA 0.1 ...
##  $ Rate_Perc        : num  NA 0.217 8.478 7.246 7.246 ...
##  $ Perc.Regeneration: num  0 0.217 8.696 15.942 23.188 ...
##  $ Eggs             : int  0 1 0 0 0 0 0 0 0 0 ...
##  $ Diet             : Factor w/ 2 levels "AdLib","Restricted": 2 2 2 2 2 2 2 2 1 1 ...
##  $ IGF_type         : Factor w/ 3 levels "No_IGF","IGF1",..: 2 2 2 2 2 2 2 2 1 1 ...
table(data$Treatment, useNA="ifany")
## 
##   AdLib      DR DR.IGF1 DR.IGF2 
##     160     136     160     152
table(igf_data$Supplementation, useNA="ifany")
## 
## Vehicle    IGF1    IGF2 
##     136     160     152
# Confirm which weeks are actually represented in each dataset.
sort(unique(diet$Week))
## [1] -4 -2 -1  0
sort(unique(data$Week))
## [1] 1 2 3 4 5 6 7 8
data %>% count(Week)
igf_data %>% count(Week)

Published Analyses

Analyses corresponding directly to the primary statistical tests reported in the manuscript.

Baseline characteristics and dietary manipulation

Purpose: Determine whether animals were comparable before the experiment and confirm that the feeding manipulation produced the intended difference in energetic state.

Approach: All four randomized treatment groups are compared for initial SVL, initial body mass, and original tail length. Pre-autotomy percent mass lost is then compared between High Diet/AdLib and Low Diet/Restricted animals.

Result/Decision: Initial size measures did not show evidence of meaningful pre-existing treatment differences. The feeding manipulation successfully altered energetic state: restricted females lost significantly more body mass before autotomy than ad libitum-fed females. Pre-autotomy percent mass loss is retained as the manipulation check and prospective energetic-state measure.

pre_diet <- diet %>% filter(Week==-4)
diet_preautotomy <- diet %>% filter(Week==-1)
model_baseline_svl  <- lm(SVL  ~ Treatment, data=pre_diet)
model_baseline_mass <- lm(Mass ~ Treatment, data=pre_diet)
model_baseline_tail <- lm(Tail ~ Treatment, data=pre_diet)

anova(model_baseline_svl);  summary(model_baseline_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
anova(model_baseline_mass); summary(model_baseline_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
anova(model_baseline_tail); summary(model_baseline_tail)
## 
## 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
model_diet_loss <- lm(Perc_WL ~ Diet, data=diet_preautotomy)
anova(model_diet_loss); summary(model_diet_loss)
## 
## Call:
## lm(formula = Perc_WL ~ Diet, data = diet_preautotomy)
## 
## 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_preautotomy %>% group_by(Diet) %>%
  summarise(n=sum(!is.na(Perc_WL)), mean=mean(Perc_WL,na.rm=TRUE),
            sd=sd(Perc_WL,na.rm=TRUE), min=min(Perc_WL,na.rm=TRUE),
            max=max(Perc_WL,na.rm=TRUE), .groups="drop")

Primary analysis: concurrent energetic state and regeneration

Purpose: Test whether energetic state during regeneration is associated with cumulative tail regeneration and whether that association changes as regeneration proceeds.

Approach: All animals with concurrent percent-mass-loss and percent-regeneration measurements are included. Cumulative percent regeneration is modeled as a function of Week, concurrent percent body-mass loss, and their interaction. Week-specific energetic-state slopes are estimated with emtrends. Original tail length is not included because percent regeneration already standardizes regenerated length by original tail length.

Result/Decision: The Week × percent-mass-loss interaction is the key test of whether energetic-state/regeneration coupling changes over time. Week-specific slopes identify when the concurrent association becomes detectable. Because energetic state and cumulative regeneration are measured during the same sampling period, this is interpreted as a contemporaneous association rather than evidence of temporal direction.

model_concurrent <- lmerTest::lmer(
  Perc.Regeneration ~
    Week * Perc.WeightLoss +
    (0 + Week | Animal_ID),
  data = data,
  REML = TRUE
)

summary(model_concurrent)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss + (0 + Week | Animal_ID)
##    Data: data
## 
## REML criterion at convergence: 2466.9
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.1043 -0.5528  0.0326  0.5991  4.1094 
## 
## Random effects:
##  Groups    Name Variance Std.Dev.
##  Animal_ID Week 1.842    1.357   
##  Residual       9.317    3.052   
## Number of obs: 443, groups:  Animal_ID, 65
## 
## Fixed effects:
##                        Estimate Std. Error         df t value Pr(>|t|)    
## (Intercept)           -5.733687   0.605632 380.631393  -9.467   <2e-16 ***
## Week                   4.194725   0.241281 176.014403  17.385   <2e-16 ***
## Perc.WeightLoss        0.039747   0.031454 384.895061   1.264    0.207    
## Week:Perc.WeightLoss   0.015209   0.009393 425.001317   1.619    0.106    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) Week   Prc.WL
## Week        -0.482              
## Prc.WghtLss -0.847  0.408       
## Wk:Prc.WghL  0.540 -0.631 -0.661
# Check random-effects structure
lme4::isSingular(
  model_concurrent,
  tol = 1e-4
)
## [1] FALSE
lme4::VarCorr(model_concurrent)
##  Groups    Name Std.Dev.
##  Animal_ID Week 1.3571  
##  Residual       3.0523
# Type III tests
anova(
  model_concurrent,
  type = 3
)
concurrent_slopes <- emmeans::emtrends(
  model_concurrent, ~ Week, var="Perc.WeightLoss", at=list(Week=1:8))
summary(concurrent_slopes, infer=TRUE)

IGF modification of the concurrent association

Purpose: Test whether IGF1 or IGF2 modifies the concurrent relationship between energetic state and regeneration.

Approach: Only Restricted + Vehicle, Restricted + IGF1, and Restricted + IGF2 animals are included. Cumulative percent regeneration is modeled as Week × concurrent percent body-mass loss × supplementation. Week-specific emtrends estimate the energetic-state slope within each supplementation group, and Tukey-adjusted pairwise contrasts test whether slopes differ among Vehicle, IGF1, and IGF2.

Result/Decision: The three-way interaction is the overall test of whether energetic-state/regeneration coupling develops differently among supplementation groups. Week-specific pairwise slope contrasts identify when groups diverge. A slope that differs from zero within an IGF group is not, by itself, evidence that the group differs from Vehicle.

model_concurrent_igf <- lmerTest::lmer(
  Perc.Regeneration ~
    Week * Perc.WeightLoss * Supplementation +
    (0 + Week | Animal_ID),
  data = igf_data,
  REML = TRUE
)

summary(model_concurrent_igf)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * Supplementation +  
##     (0 + Week | Animal_ID)
##    Data: igf_data
## 
## REML criterion at convergence: 1770
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.8675 -0.5192  0.0242  0.5533  4.2062 
## 
## Random effects:
##  Groups    Name Variance Std.Dev.
##  Animal_ID Week 1.481    1.217   
##  Residual       8.469    2.910   
## Number of obs: 323, groups:  Animal_ID, 47
## 
## Fixed effects:
##                                            Estimate Std. Error         df
## (Intercept)                               -4.817918   1.348654 273.117271
## Week                                       4.107748   0.606744 198.661666
## Perc.WeightLoss                            0.017091   0.062352 271.483238
## SupplementationIGF1                        1.148264   1.907778 280.700833
## SupplementationIGF2                        0.649132   2.336884 274.490113
## Week:Perc.WeightLoss                       0.004442   0.022035 307.871357
## Week:SupplementationIGF1                  -0.512792   0.772174 185.343989
## Week:SupplementationIGF2                  -1.397426   0.805884 207.515649
## Perc.WeightLoss:SupplementationIGF1       -0.058274   0.097326 290.958591
## Perc.WeightLoss:SupplementationIGF2       -0.068238   0.108575 272.625667
## Week:Perc.WeightLoss:SupplementationIGF1   0.011664   0.031131 304.606042
## Week:Perc.WeightLoss:SupplementationIGF2   0.068538   0.030933 302.035891
##                                          t value Pr(>|t|)    
## (Intercept)                               -3.572 0.000418 ***
## Week                                       6.770 1.42e-10 ***
## Perc.WeightLoss                            0.274 0.784206    
## SupplementationIGF1                        0.602 0.547736    
## SupplementationIGF2                        0.278 0.781393    
## Week:Perc.WeightLoss                       0.202 0.840376    
## Week:SupplementationIGF1                  -0.664 0.507459    
## Week:SupplementationIGF2                  -1.734 0.084398 .  
## Perc.WeightLoss:SupplementationIGF1       -0.599 0.549804    
## Perc.WeightLoss:SupplementationIGF2       -0.628 0.530207    
## Week:Perc.WeightLoss:SupplementationIGF1   0.375 0.708157    
## Week:Perc.WeightLoss:SupplementationIGF2   2.216 0.027456 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##              (Intr) Week   Prc.WL SpIGF1 SpIGF2 Wk:P.WL W:SIGF1 W:SIGF2
## Week         -0.537                                                    
## Prc.WghtLss  -0.859  0.422                                             
## SpplmntIGF1  -0.707  0.379  0.607                                      
## SpplmntIGF2  -0.577  0.310  0.496  0.408                               
## Wk:Prc.WghL   0.583 -0.787 -0.598 -0.412 -0.337                        
## Wk:SpplIGF1   0.422 -0.786 -0.332 -0.537 -0.243  0.618                 
## Wk:SpplIGF2   0.404 -0.753 -0.318 -0.286 -0.549  0.592   0.592         
## Pr.WL:SIGF1   0.550 -0.271 -0.641 -0.872 -0.318  0.383   0.439   0.204 
## Pr.WL:SIGF2   0.493 -0.243 -0.574 -0.349 -0.920  0.343   0.191   0.498 
## W:P.WL:SIGF1 -0.413  0.557  0.423  0.617  0.238 -0.708  -0.735  -0.419 
## W:P.WL:SIGF2 -0.415  0.560  0.426  0.294  0.596 -0.712  -0.440  -0.789 
##              P.WL:SIGF1 P.WL:SIGF2 W:P.WL:SIGF1
## Week                                           
## Prc.WghtLss                                    
## SpplmntIGF1                                    
## SpplmntIGF2                                    
## Wk:Prc.WghL                                    
## Wk:SpplIGF1                                    
## Wk:SpplIGF2                                    
## Pr.WL:SIGF1                                    
## Pr.WL:SIGF2   0.368                            
## W:P.WL:SIGF1 -0.677     -0.243                 
## W:P.WL:SIGF2 -0.273     -0.647      0.504
lme4::isSingular(
  model_concurrent_igf,
  tol = 1e-4
)
## [1] FALSE
lme4::VarCorr(model_concurrent_igf)
##  Groups    Name Std.Dev.
##  Animal_ID Week 1.2170  
##  Residual       2.9101
anova(
  model_concurrent_igf,
  type = 3
)
concurrent_igf_slopes <- emmeans::emtrends(
  model_concurrent_igf, ~ Supplementation | Week, var="Perc.WeightLoss",
  at=list(Week=1:8))
concurrent_igf_slopes_df <- as.data.frame(summary(concurrent_igf_slopes, infer=TRUE))
concurrent_igf_slopes_df
concurrent_igf_contrasts <- pairs(concurrent_igf_slopes, adjust="tukey")
concurrent_igf_contrasts_df <- as.data.frame(concurrent_igf_contrasts)
concurrent_igf_contrasts_df

Publication Figures

Code used to generate the manuscript figures and their individual publication panels.

Figure 1: dietary manipulation and concurrent association

Purpose: Generate the panels showing the dietary manipulation, regeneration through time, and the overall concurrent energetic-state/regeneration relationship.

Approach: Panel A displays pre-autotomy percent body-mass loss by diet. Panel B displays descriptive percent-regeneration trajectories for High versus Low Diet animals. The remaining panels visualize week-specific energetic-state slopes from the primary concurrent model and the model-predicted relationship at Week 6.

Result/Decision: Figure 1 shows the dietary manipulation and the development of energetic-state/regeneration coupling across regeneration. The pooled Low Diet trajectory includes Vehicle, IGF1, and IGF2 animals and is descriptive; it should not be interpreted as an isolated causal effect of dietary restriction after supplementation begins.

fig1a_data <- diet_preautotomy %>%
  mutate(Diet_display=factor(Diet,levels=c("AdLib","Restricted"),
                             labels=c("High Diet","Low Diet")))
fig1a <- ggplot(fig1a_data,aes(Diet_display,Perc_WL)) +
  geom_violin(fill="grey80",trim=FALSE) +
  geom_boxplot(width=.12,outlier.shape=NA,fill="white") +
  geom_jitter(width=.08,shape=21,fill="white",size=1.8,alpha=.8) +
  labs(title="Dietary restriction increased mass loss",x="Diet treatment",
       y="Percent body-mass loss") + theme_classic(base_size=12)

fig1a

fig1b_data <- data %>%
  mutate(Diet_display=factor(Diet,levels=c("AdLib","Restricted"),
                             labels=c("High Diet","Low Diet")))
fig1b <- ggplot(fig1b_data,aes(Week,Perc.Regeneration,group=Diet_display,
                               shape=Diet_display,linetype=Diet_display)) +
  stat_summary(fun=mean,geom="line",linewidth=1.1,color="black") +
  stat_summary(fun=mean,geom="point",size=3,color="black") +
  stat_summary(fun.data=mean_se,geom="errorbar",width=.15,color="black") +
  labs(title="Regeneration across the experiment",x="Week",y="Percent regeneration",
       shape="Diet",linetype="Diet") + theme_classic(base_size=12)

fig1b

week6 <- data %>% filter(Week==6,!is.na(Perc.WeightLoss),!is.na(Perc.Regeneration))
week6_grid <- data.frame(Week=6,Perc.WeightLoss=seq(min(week6$Perc.WeightLoss),
                                                    max(week6$Perc.WeightLoss),length.out=100))
week6_grid$Predicted <- predict(model_concurrent,newdata=week6_grid,re.form=NA)
fig1c <- ggplot() +
  geom_point(data=week6,aes(Perc.WeightLoss,Perc.Regeneration),shape=21,fill="white",alpha=.7) +
  geom_line(data=week6_grid,aes(Perc.WeightLoss,Predicted),linewidth=1.2) +
  labs(title="Concurrent relationship at Week 6",x="Percent body-mass loss",
       y="Percent regeneration") + theme_classic(base_size=12)

fig1c

concurrent_slopes_df <- as.data.frame(summary(concurrent_slopes,infer=TRUE)) %>%
  mutate(sig=case_when(p.value<.001~"***",p.value<.01~"**",p.value<.05~"*",
                       p.value<.10~"†",TRUE~""))
fig1d <- ggplot(concurrent_slopes_df,aes(Week,Perc.WeightLoss.trend)) +
  geom_hline(yintercept=0,linetype="dashed") +
  geom_errorbar(aes(ymin=lower.CL,ymax=upper.CL),width=.15) + geom_point(size=4) +
  geom_text(aes(y=upper.CL+.04,label=sig),fontface="bold",size=5) +
  scale_x_continuous(breaks=1:8) +
  labs(title="Concurrent association across time",x="Week",
       y="Slope of regeneration vs.\npercent mass lost") + theme_classic(base_size=12)

fig1d

# Panels are exported separately below for assembly in BioRender.
# Export Figure 1 panels separately for assembly in BioRender
ggsave(
  "Figure1A_Diet_mass_loss.png",
  fig1a,
  width = 3.5, height = 3,
  units = "in", dpi = 600, bg = "white"
)

ggsave(
  "Figure1B_Diet_regeneration.png",
  fig1b,
  width = 4, height = 3,
  units = "in", dpi = 600, bg = "white"
)

ggsave(
  "Figure1C_Energetic_state_slopes.png",
  fig1d,
  width = 4.5, height = 3.2,
  units = "in", dpi = 600, bg = "white"
)

ggsave(
  "Figure1_Week6_popout.png",
  fig1c,
  width = 2.4, height = 2.6,
  units = "in", dpi = 600, bg = "grey90"
)

Figure 2: IGF modification of the concurrent relationship

Purpose: Generate the panels used to visualize how the energetic-state/regeneration relationship differs among Vehicle, IGF1, and IGF2 animals.

Approach: Figure 2 is generated from the restricted-diet concurrent IGF model and its emtrends results. The code creates week-specific slopes and confidence intervals, a Week 6 model-based visualization, the change in slope from Week 2 to Week 8, and bootstrap distributions used to visualize uncertainty.

Result/Decision: Figure 2 is interpreted using treatment-specific slopes together with Tukey-adjusted pairwise slope contrasts. The figure describes modification of energetic-state/regeneration coupling rather than a simple treatment effect on regeneration.

# Treatment colors used throughout Figure 2
igf_colors <- c(
  "Vehicle" = "grey40",
  "IGF1"    = "#E87722",
  "IGF2"    = "#0C2340"
)

# ------------------------------------------------------------
# Figure 2A: week-specific energetic-state slopes
# ------------------------------------------------------------

concurrent_igf_slopes_df <- as.data.frame(
  summary(concurrent_igf_slopes, infer = TRUE)
)

concurrent_igf_contrasts_df <- as.data.frame(
  pairs(concurrent_igf_slopes, adjust = "tukey")
)

igf2_vs_vehicle <- concurrent_igf_contrasts_df %>%
  filter(contrast %in% c("Vehicle - IGF2", "IGF2 - Vehicle")) %>%
  mutate(
    sig = case_when(
      p.value < .001 ~ "***",
      p.value < .01  ~ "**",
      p.value < .05  ~ "*",
      p.value < .10  ~ "†",
      TRUE ~ ""
    )
  ) %>%
  dplyr::select(Week, p.value, sig) %>%
  left_join(
    concurrent_igf_slopes_df %>%
      filter(Supplementation == "IGF2") %>%
      dplyr::select(Week, upper.CL),
    by = "Week"
  )

fig2_slopes <- ggplot(
  concurrent_igf_slopes_df,
  aes(Week, Perc.WeightLoss.trend, color = Supplementation)
) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  geom_errorbar(
    aes(ymin = lower.CL, ymax = upper.CL),
    width = .15,
    position = position_dodge(width = .25)
  ) +
  geom_point(size = 4, position = position_dodge(width = .25)) +
  geom_text(
    data = igf2_vs_vehicle,
    aes(Week, upper.CL + .05, label = sig),
    inherit.aes = FALSE,
    color = "#0C2340",
    fontface = "bold",
    size = 6
  ) +
  scale_color_manual(values = igf_colors) +
  scale_x_continuous(breaks = 1:8) +
  labs(
    x = "Week",
    y = "Slope of regeneration vs.\npercent mass lost",
    color = "Supplementation"
  ) +
  theme_classic(base_size = 12) +
  theme(legend.position = "bottom")

fig2_slopes

# ------------------------------------------------------------
# Week 6 model-based popout
# ------------------------------------------------------------

week6_igf <- igf_data %>%
  filter(
    Week == 6,
    !is.na(Perc.WeightLoss),
    !is.na(Perc.Regeneration)
  )

week6_igf_grid <- expand.grid(
  Week = 6,
  Perc.WeightLoss = seq(
    min(week6_igf$Perc.WeightLoss, na.rm = TRUE),
    max(week6_igf$Perc.WeightLoss, na.rm = TRUE),
    length.out = 100
  ),
  Supplementation = factor(
    c("Vehicle", "IGF1", "IGF2"),
    levels = c("Vehicle", "IGF1", "IGF2")
  )
)

week6_igf_grid$Predicted <- predict(
  model_concurrent_igf,
  newdata = week6_igf_grid,
  re.form = NA
)

fig2_week6 <- ggplot() +
  geom_point(
    data = week6_igf,
    aes(Perc.WeightLoss, Perc.Regeneration, color = Supplementation),
    alpha = .55
  ) +
  geom_line(
    data = week6_igf_grid,
    aes(Perc.WeightLoss, Predicted, color = Supplementation),
    linewidth = 1.3
  ) +
  scale_color_manual(values = igf_colors) +
  labs(
    x = "Percent body-mass loss",
    y = "Percent regeneration"
  ) +
  theme_classic(base_size = 11) +
  theme(legend.position = "none")

fig2_week6

# ------------------------------------------------------------
# Figure 2B: cumulative change in energetic-state slope
# Week 8 minus Week 2
# ------------------------------------------------------------

fig2_cumulative_data <- concurrent_igf_slopes_df %>%
  filter(Week %in% c(2, 8)) %>%
  dplyr::select(
    Supplementation,
    Week,
    Perc.WeightLoss.trend
  ) %>%
  tidyr::pivot_wider(
    names_from = Week,
    values_from = Perc.WeightLoss.trend,
    names_prefix = "Week_"
  ) %>%
  mutate(change = Week_8 - Week_2)

fig2_cumulative <- ggplot(
  fig2_cumulative_data,
  aes(
    x = Supplementation,
    y = change,
    fill = Supplementation
  )
) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  geom_col(width = .65) +
  scale_fill_manual(values = igf_colors) +
  labs(
    x = "Supplementation",
    y = expression(Delta ~ slope)
  ) +
  theme_classic(base_size = 11) +
  theme(legend.position = "none")

fig2_cumulative

# ------------------------------------------------------------
# Figure 2C: parametric bootstrap distributions
# ------------------------------------------------------------

set.seed(123)

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

fig2_bootstrap <- lme4::bootMer(
  model_concurrent_igf,
  FUN = boot_fixed_effects,
  nsim = 500,
  type = "parametric"
)

fig2_bootstrap_df <- as.data.frame(fig2_bootstrap$t)
names(fig2_bootstrap_df) <- names(lme4::fixef(model_concurrent_igf))

bootstrap_terms <- grep(
  "Week:Perc\\.WeightLoss",
  names(fig2_bootstrap_df),
  value = TRUE
)

fig2_bootstrap_long <- fig2_bootstrap_df %>%
  dplyr::select(all_of(bootstrap_terms)) %>%
  tidyr::pivot_longer(
    cols = everything(),
    names_to = "term",
    values_to = "estimate"
  ) %>%
  mutate(
    Supplementation = case_when(
      grepl("IGF1", term) ~ "IGF1",
      grepl("IGF2", term) ~ "IGF2",
      TRUE ~ "Vehicle"
    ),
    Supplementation = factor(
      Supplementation,
      levels = c("Vehicle", "IGF1", "IGF2")
    )
  )

fig2_bootstrap_plot <- ggplot(
  fig2_bootstrap_long,
  aes(estimate, fill = Supplementation)
) +
  geom_density(alpha = .9) +
  geom_vline(xintercept = 0, linetype = "dashed") +
  scale_fill_manual(values = igf_colors) +
  labs(
    x = "Bootstrap estimate",
    y = "Density",
    fill = "Supplementation"
  ) +
  theme_classic(base_size = 11) +
  theme(legend.position = "none")

fig2_bootstrap_plot

Body-mass trajectory figure

Purpose: Visualize body-mass change across the full experiment for all four treatment combinations.

Approach: Pre-autotomy percent mass loss and regeneration-period percent mass loss are combined into one longitudinal plotting dataset. Individual trajectories are shown lightly, with group means overlaid using the same treatment palette as the other figures.

Result/Decision: This figure provides descriptive context for body-mass change before and during regeneration. Post-autotomy values include the physical loss of tail tissue and should not be interpreted as a direct measure of whole-body energy balance.

pre_traj <- diet %>%
  filter(Week <= 0, !is.na(Perc_WL)) %>%
  dplyr::select(Animal_ID, Week, Perc.WeightLoss = Perc_WL) %>%
  left_join(
    data %>% dplyr::select(Animal_ID, Treatment) %>% distinct(),
    by = "Animal_ID"
  )

regen_traj <- data %>%
  filter(Week > 0, !is.na(Perc.WeightLoss)) %>%
  dplyr::select(Animal_ID, Week, Perc.WeightLoss, Treatment)

trajectory_data <- bind_rows(pre_traj, regen_traj) %>%
  mutate(
    Group = case_when(
      Treatment == "AdLib"   ~ "AdLib",
      Treatment == "DR"      ~ "Vehicle",
      Treatment == "DR.IGF1" ~ "IGF1",
      Treatment == "DR.IGF2" ~ "IGF2"
    ),
    Group = factor(
      Group,
      levels = c("AdLib", "Vehicle", "IGF1", "IGF2")
    )
  )

trajectory_colors <- c(
  "AdLib"   = "grey40",
  "Vehicle" = "grey70",
  "IGF1"    = "#E87722",
  "IGF2"    = "#0C2340"
)

body_mass_plot <- ggplot(
  trajectory_data,
  aes(Week, Perc.WeightLoss, color = Group)
) +
  geom_line(
    aes(group = Animal_ID),
    alpha = .12,
    linewidth = .5
  ) +
  stat_summary(
    aes(group = Group),
    fun = mean,
    geom = "line",
    linewidth = 1.2
  ) +
  stat_summary(
    aes(group = Group),
    fun = mean,
    geom = "point",
    size = 3
  ) +
  geom_hline(
    yintercept = 0,
    linetype = "dashed",
    color = "grey40"
  ) +
  geom_vline(
    xintercept = 0,
    linetype = "dotted",
    color = "grey40"
  ) +
  scale_color_manual(
    values = trajectory_colors,
    labels = c(
      "AdLib"   = "High Diet",
      "Vehicle" = "Low Diet + Vehicle",
      "IGF1"    = "Low Diet + IGF1",
      "IGF2"    = "Low Diet + IGF2"
    )
  ) +
  scale_x_continuous(
    breaks = c(-4, -2, -1, 0, 1:8)
  ) +
  labs(
    x = "Week",
    y = "Percent body-mass loss",
    color = "Treatment"
  ) +
  theme_classic(base_size = 12) +
  theme(
    legend.position = "bottom"
  )

body_mass_plot

Export publication figures

Purpose: Export the individual publication panels at the dimensions used to rebuild the manuscript figures.

Approach: Each figure object is exported separately at the specified width, height, resolution, and background so the panels can be reassembled without changing the underlying graphics.

Result/Decision: These files are the source panels for figure assembly. The existing export dimensions are intentionally retained.

## 
## Adlib    DR 
##    20    56

Validation

Sensitivity and temporal checks used to evaluate whether the manuscript conclusions are robust to alternative definitions, outcomes, and potential confounds.

Temporal specificity of the energetic-state association

The primary concurrent analysis cannot determine whether energetic state precedes regenerative performance. This section therefore asks the same biological question using energetic-state measures that occur before the regenerative response. These analyses are complementary, not interchangeable.

These analyses evaluate whether the association is also detectable when energetic state precedes the regenerative response. They distinguish a pre-existing/prospective energetic effect from a contemporaneous association that emerges during regeneration.

Pre-autotomy energetic state

Purpose: Test whether energetic state established before autotomy predicts the subsequent regeneration trajectory and whether later IGF supplementation modifies that prospective relationship.

Approach: A single pre-autotomy percent-mass-loss value is calculated for each animal from Week -4 to Week -1. This value precedes tail autotomy and IGF administration, avoiding the contribution of physically removed tail tissue to the energetic-state measure. The overall prospective relationship is evaluated in all animals, and IGF modification is evaluated within the restricted-diet comparison.

Result/Decision: The prospective pre-autotomy analyses did not provide strong evidence that pre-existing mass loss predicts the later regeneration trajectory or that IGF clearly modifies that prospective relationship. This analysis is retained as temporal validation and supports interpreting the primary result as an association with ongoing energetic state during regeneration rather than a simple pre-existing energetic deficit that determines later regeneration.

pre_autotomy_state <- diet %>%
  filter(Week %in% c(-4,-1)) %>%
  dplyr::select(Animal_ID, Diet, Week, Mass) %>%
  mutate(Timepoint=case_when(Week==-4 ~ "Mass_WeekMinus4",
                             Week==-1 ~ "Mass_WeekMinus1")) %>%
  dplyr::select(Animal_ID,Diet,Timepoint,Mass) %>%
  pivot_wider(names_from=Timepoint, values_from=Mass) %>%
  mutate(PreAutotomy_MassLoss=((Mass_WeekMinus4-Mass_WeekMinus1)/Mass_WeekMinus4)*100)

regen_preautotomy <- data %>%
  left_join(pre_autotomy_state %>% dplyr::select(Animal_ID,PreAutotomy_MassLoss),
            by="Animal_ID")

regen_preautotomy_igf <- regen_preautotomy %>%
  filter(Diet=="Restricted") %>%
  mutate(Supplementation=case_when(Treatment=="DR" ~ "Vehicle",
                                   Treatment=="DR.IGF1" ~ "IGF1",
                                   Treatment=="DR.IGF2" ~ "IGF2"),
         Supplementation=factor(Supplementation,levels=c("Vehicle","IGF1","IGF2")))

pre_autotomy_state %>% group_by(Diet) %>%
  summarise(n=sum(!is.na(PreAutotomy_MassLoss)),
            mean=mean(PreAutotomy_MassLoss,na.rm=TRUE),
            sd=sd(PreAutotomy_MassLoss,na.rm=TRUE),
            min=min(PreAutotomy_MassLoss,na.rm=TRUE),
            max=max(PreAutotomy_MassLoss,na.rm=TRUE), .groups="drop")
model_preautotomy <- lmerTest::lmer(
  Perc.Regeneration ~ Week * PreAutotomy_MassLoss + (1|Animal_ID),
  data=regen_preautotomy)
summary(model_preautotomy); anova(model_preautotomy,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * PreAutotomy_MassLoss + (1 | Animal_ID)
##    Data: regen_preautotomy
## 
## REML criterion at convergence: 2757.5
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.1181 -0.5777  0.0766  0.5872  3.2970 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 20.23    4.498   
##  Residual              21.83    4.673   
## Number of obs: 443, groups:  Animal_ID, 65
## 
## Fixed effects:
##                            Estimate Std. Error        df t value Pr(>|t|)    
## (Intercept)                -4.92415    0.94998 132.90172  -5.183 7.91e-07 ***
## Week                        4.53173    0.13158 387.48965  34.441  < 2e-16 ***
## PreAutotomy_MassLoss        0.02021    0.10856 134.91235   0.186    0.853    
## Week:PreAutotomy_MassLoss  -0.03387    0.01526 391.15015  -2.219    0.027 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) Week   PrA_ML
## Week        -0.568              
## PrAttmy_MsL -0.634  0.358       
## Wk:PrAtt_ML  0.352 -0.618 -0.564
preautotomy_slopes <- emmeans::emtrends(
  model_preautotomy, ~ Week, var="PreAutotomy_MassLoss", at=list(Week=1:8))
summary(preautotomy_slopes,infer=TRUE)
model_preautotomy_igf <- lmerTest::lmer(
  Perc.Regeneration ~ Week * PreAutotomy_MassLoss * Supplementation + (1|Animal_ID),
  data=regen_preautotomy_igf)
summary(model_preautotomy_igf); anova(model_preautotomy_igf,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * PreAutotomy_MassLoss * Supplementation +  
##     (1 | Animal_ID)
##    Data: regen_preautotomy_igf
## 
## REML criterion at convergence: 1957.9
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.8282 -0.6009  0.0905  0.5889  3.4852 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 18.00    4.243   
##  Residual              18.55    4.307   
## Number of obs: 323, groups:  Animal_ID, 47
## 
## Fixed effects:
##                                                Estimate Std. Error        df
## (Intercept)                                    -5.66921    2.78862  90.26898
## Week                                            4.94035    0.43055 280.31013
## PreAutotomy_MassLoss                            0.20357    0.29436  91.30071
## SupplementationIGF1                             2.46619    3.53911  86.92605
## SupplementationIGF2                             1.61728    3.49713  90.24467
## Week:PreAutotomy_MassLoss                      -0.11434    0.04607 280.06647
## Week:SupplementationIGF1                       -1.77901    0.51212 278.58905
## Week:SupplementationIGF2                       -1.27604    0.52323 279.12124
## PreAutotomy_MassLoss:SupplementationIGF1       -0.38486    0.38159  90.50596
## PreAutotomy_MassLoss:SupplementationIGF2       -0.30380    0.37328  89.73145
## Week:PreAutotomy_MassLoss:SupplementationIGF1   0.22788    0.05760 284.20872
## Week:PreAutotomy_MassLoss:SupplementationIGF2   0.17249    0.05575 278.57520
##                                               t value Pr(>|t|)    
## (Intercept)                                    -2.033 0.044991 *  
## Week                                           11.474  < 2e-16 ***
## PreAutotomy_MassLoss                            0.692 0.490970    
## SupplementationIGF1                             0.697 0.487763    
## SupplementationIGF2                             0.462 0.644864    
## Week:PreAutotomy_MassLoss                      -2.482 0.013660 *  
## Week:SupplementationIGF1                       -3.474 0.000595 ***
## Week:SupplementationIGF2                       -2.439 0.015361 *  
## PreAutotomy_MassLoss:SupplementationIGF1       -1.009 0.315872    
## PreAutotomy_MassLoss:SupplementationIGF2       -0.814 0.417876    
## Week:PreAutotomy_MassLoss:SupplementationIGF1   3.957 9.61e-05 ***
## Week:PreAutotomy_MassLoss:SupplementationIGF2   3.094 0.002177 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               (Intr) Week   PrA_ML SpIGF1 SpIGF2 Wk:PA_ML W:SIGF1 W:SIGF2
## Week          -0.574                                                     
## PrAttmy_MsL   -0.836  0.496                                              
## SpplmntIGF1   -0.788  0.453  0.659                                       
## SpplmntIGF2   -0.797  0.458  0.667  0.628                                
## Wk:PrAtt_ML    0.489 -0.867 -0.578 -0.385 -0.390                         
## Wk:SpplIGF1    0.483 -0.841 -0.417 -0.565 -0.385  0.729                  
## Wk:SpplIGF2    0.473 -0.823 -0.408 -0.372 -0.576  0.713    0.692         
## PA_ML:SIGF1    0.645 -0.383 -0.771 -0.815 -0.514  0.446    0.472   0.315 
## PA_ML:SIGF2    0.659 -0.391 -0.789 -0.520 -0.813  0.456    0.329   0.480 
## W:PA_ML:SIGF1 -0.391  0.693  0.462  0.452  0.312 -0.800   -0.818  -0.570 
## W:PA_ML:SIGF2 -0.404  0.716  0.478  0.319  0.480 -0.826   -0.602  -0.845 
##               PA_ML:SIGF1 PA_ML:SIGF2 W:PA_ML:SIGF1
## Week                                               
## PrAttmy_MsL                                        
## SpplmntIGF1                                        
## SpplmntIGF2                                        
## Wk:PrAtt_ML                                        
## Wk:SpplIGF1                                        
## Wk:SpplIGF2                                        
## PA_ML:SIGF1                                        
## PA_ML:SIGF2    0.608                               
## W:PA_ML:SIGF1 -0.562      -0.365                   
## W:PA_ML:SIGF2 -0.368      -0.575       0.661
preautotomy_igf_slopes <- emmeans::emtrends(
  model_preautotomy_igf, ~ Supplementation | Week, var="PreAutotomy_MassLoss",
  at=list(Week=1:8))
summary(preautotomy_igf_slopes,infer=TRUE)
pairs(preautotomy_igf_slopes,adjust="tukey")
## Week = 1:
##  contrast       estimate    SE   df t.ratio p.value
##  Vehicle - IGF1   0.1570 0.352 65.4   0.445  0.8966
##  Vehicle - IGF2   0.1313 0.344 64.6   0.381  0.9230
##  IGF1 - IGF2     -0.0257 0.311 65.2  -0.083  0.9962
## 
## Week = 2:
##  contrast       estimate    SE   df t.ratio p.value
##  Vehicle - IGF1  -0.0709 0.331 51.2  -0.214  0.9750
##  Vehicle - IGF2  -0.0412 0.322 50.2  -0.128  0.9910
##  IGF1 - IGF2      0.0297 0.293 51.8   0.101  0.9943
## 
## Week = 3:
##  contrast       estimate    SE   df t.ratio p.value
##  Vehicle - IGF1  -0.2988 0.318 43.7  -0.938  0.6193
##  Vehicle - IGF2  -0.2137 0.309 42.5  -0.691  0.7698
##  IGF1 - IGF2      0.0851 0.282 44.2   0.302  0.9510
## 
## Week = 4:
##  contrast       estimate    SE   df t.ratio p.value
##  Vehicle - IGF1  -0.5267 0.316 42.1  -1.666  0.2301
##  Vehicle - IGF2  -0.3862 0.306 40.5  -1.264  0.4234
##  IGF1 - IGF2      0.1405 0.278 41.6   0.505  0.8694
## 
## Week = 5:
##  contrast       estimate    SE   df t.ratio p.value
##  Vehicle - IGF1  -0.7546 0.324 46.0  -2.327  0.0620
##  Vehicle - IGF2  -0.5587 0.312 43.9  -1.790  0.1847
##  IGF1 - IGF2      0.1959 0.283 43.6   0.693  0.7686
## 
## Week = 6:
##  contrast       estimate    SE   df t.ratio p.value
##  Vehicle - IGF1  -0.9824 0.342 55.8  -2.872  0.0156
##  Vehicle - IGF2  -0.7312 0.328 53.2  -2.228  0.0756
##  IGF1 - IGF2      0.2513 0.294 50.4   0.854  0.6714
## 
## Week = 7:
##  contrast       estimate    SE   df t.ratio p.value
##  Vehicle - IGF1  -1.2103 0.368 72.5  -3.288  0.0044
##  Vehicle - IGF2  -0.9037 0.352 69.5  -2.564  0.0331
##  IGF1 - IGF2      0.3067 0.313 62.5   0.981  0.5914
## 
## Week = 8:
##  contrast       estimate    SE   df t.ratio p.value
##  Vehicle - IGF1  -1.4382 0.401 96.6  -3.588  0.0015
##  Vehicle - IGF2  -1.0762 0.383 93.6  -2.807  0.0166
##  IGF1 - IGF2      0.3621 0.336 80.7   1.076  0.5315
## 
## Degrees-of-freedom method: kenward-roger 
## P value adjustment: tukey method for comparing a family of 3 estimates

Lagged energetic state predicting subsequent regeneration

Purpose: Test whether energetic state at the beginning of an interval predicts the amount of new regeneration produced during the following interval.

Approach: Restricted + Vehicle, Restricted + IGF1, and Restricted + IGF2 animals with consecutive observations are arranged longitudinally. Percent body-mass loss at the beginning of an interval is paired with the subsequent increment in absolute regeneration and percent regeneration, giving the energetic-state measure temporal precedence over the response interval.

Result/Decision: The lagged analysis did not provide strong evidence that energetic state prospectively predicts the next increment of regeneration. Together with the pre-autotomy analysis, this indicates that the strongest energetic-state/regeneration relationship is concurrent rather than clearly prospective.

lagged_data <- igf_data %>%
  filter(Week %in% 1:8) %>%
  arrange(Animal_ID,Week) %>%
  group_by(Animal_ID) %>%
  mutate(
    Lagged_MassLoss=Perc.WeightLoss,
    Next_Regeneration=lead(Regeneration),
    Next_PercRegeneration=lead(Perc.Regeneration),
    Next_Week=lead(Week),
    Subsequent_Regeneration=Next_Regeneration-Regeneration,
    Subsequent_PercRegeneration=Next_PercRegeneration-Perc.Regeneration
  ) %>%
  ungroup() %>%
  filter(Next_Week-Week==1)

lagged_data %>% count(Week,Next_Week)
lagged_data %>% group_by(Animal_ID) %>% summarise(n_intervals=n(),.groups="drop") %>% count(n_intervals)

Alternative regeneration metrics

Purpose: Determine whether the conclusions depend on how regeneration is quantified.

Approach: The restricted-diet IGF comparison is repeated using absolute regenerated tail length and weekly regeneration rate. Original tail length is included for outcomes expressed in absolute length.

Result/Decision: These models are retained as sensitivity analyses because percent regeneration, absolute tissue growth, and weekly rate describe related but non-identical aspects of regeneration. Agreement supports robustness; differences are interpreted as outcome-specific rather than used to replace the primary response.

model_absolute_length <- lmerTest::lmer(
  Regeneration ~ Week*Perc.WeightLoss*Supplementation + Tail + (1|Animal_ID),
  data=igf_data)
summary(model_absolute_length); anova(model_absolute_length,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Regeneration ~ Week * Perc.WeightLoss * Supplementation + Tail +  
##     (1 | Animal_ID)
##    Data: igf_data
## 
## REML criterion at convergence: 1693.1
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.67150 -0.61652  0.09798  0.56924  3.07970 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 7.344    2.710   
##  Residual              7.807    2.794   
## Number of obs: 322, groups:  Animal_ID, 47
## 
## Fixed effects:
##                                           Estimate Std. Error        df t value
## (Intercept)                                2.53086    4.71762  49.80487   0.536
## Week                                       2.34142    0.34664 288.17199   6.755
## Perc.WeightLoss                           -0.01672    0.06811 300.19027  -0.245
## SupplementationIGF1                        0.97985    2.31519 231.54073   0.423
## SupplementationIGF2                       -0.02972    2.83635 260.20984  -0.010
## Tail                                      -0.06461    0.06178  47.33144  -1.046
## Week:Perc.WeightLoss                       0.01215    0.01515 286.16302   0.802
## Week:SupplementationIGF1                   0.40772    0.44769 292.75462   0.911
## Week:SupplementationIGF2                  -0.39101    0.50079 287.35368  -0.781
## Perc.WeightLoss:SupplementationIGF1       -0.05167    0.10589 308.57806  -0.488
## Perc.WeightLoss:SupplementationIGF2       -0.03604    0.12505 308.21672  -0.288
## Week:Perc.WeightLoss:SupplementationIGF1  -0.02248    0.02267 300.76121  -0.991
## Week:Perc.WeightLoss:SupplementationIGF2   0.03392    0.02295 284.23858   1.478
##                                          Pr(>|t|)    
## (Intercept)                                 0.594    
## Week                                      7.9e-11 ***
## Perc.WeightLoss                             0.806    
## SupplementationIGF1                         0.673    
## SupplementationIGF2                         0.992    
## Tail                                        0.301    
## Week:Perc.WeightLoss                        0.423    
## Week:SupplementationIGF1                    0.363    
## Week:SupplementationIGF2                    0.436    
## Perc.WeightLoss:SupplementationIGF1         0.626    
## Perc.WeightLoss:SupplementationIGF2         0.773    
## Week:Perc.WeightLoss:SupplementationIGF1    0.322    
## Week:Perc.WeightLoss:SupplementationIGF2    0.141    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model_weekly_rate <- lmerTest::lmer(
  Rate_Reg ~ Week*Perc.WeightLoss*Supplementation + Tail + (1|Animal_ID),
  data=igf_data)
summary(model_weekly_rate); anova(model_weekly_rate,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Rate_Reg ~ Week * Perc.WeightLoss * Supplementation + Tail +  
##     (1 | Animal_ID)
##    Data: igf_data
## 
## REML criterion at convergence: 1361.5
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.5875 -0.6218 -0.2074  0.4436  6.2109 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 0.1381   0.3716  
##  Residual              6.8460   2.6165  
## Number of obs: 278, groups:  Animal_ID, 46
## 
## Fixed effects:
##                                           Estimate Std. Error        df t value
## (Intercept)                                0.75595    2.88429 139.96753   0.262
## Week                                       0.57983    0.47879 264.38271   1.211
## Perc.WeightLoss                            0.28390    0.13422 216.85799   2.115
## SupplementationIGF1                        5.08544    3.11390 226.98473   1.633
## SupplementationIGF2                        3.63828    3.38139 222.83676   1.076
## Tail                                      -0.03788    0.02720  32.75872  -1.393
## Week:Perc.WeightLoss                      -0.04060    0.02309 264.42963  -1.758
## Week:SupplementationIGF1                  -0.70606    0.55611 264.81077  -1.270
## Week:SupplementationIGF2                  -0.70067    0.60516 264.71540  -1.158
## Perc.WeightLoss:SupplementationIGF1       -0.26791    0.16041 230.03234  -1.670
## Perc.WeightLoss:SupplementationIGF2       -0.20752    0.16653 227.99464  -1.246
## Week:Perc.WeightLoss:SupplementationIGF1   0.04086    0.02866 264.64813   1.426
## Week:Perc.WeightLoss:SupplementationIGF2   0.04291    0.02962 264.31185   1.448
##                                          Pr(>|t|)  
## (Intercept)                                0.7936  
## Week                                       0.2270  
## Perc.WeightLoss                            0.0356 *
## SupplementationIGF1                        0.1038  
## SupplementationIGF2                        0.2831  
## Tail                                       0.1731  
## Week:Perc.WeightLoss                       0.0799 .
## Week:SupplementationIGF1                   0.2053  
## Week:SupplementationIGF2                   0.2480  
## Perc.WeightLoss:SupplementationIGF1        0.0962 .
## Perc.WeightLoss:SupplementationIGF2        0.2140  
## Week:Perc.WeightLoss:SupplementationIGF1   0.1550  
## Week:Perc.WeightLoss:SupplementationIGF2   0.1487  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Original tail-length sensitivity

Purpose: Determine whether explicitly controlling for original tail length changes the energetic-state/IGF conclusions for percent regeneration.

Approach: The primary restricted-diet percent-regeneration model is repeated with original tail length included as an additional covariate.

Result/Decision: This is secondary because original tail length already contributes to the denominator of percent regeneration. The no-Tail model remains the preferred percent-regeneration analysis; this model tests sensitivity to explicit adjustment for initial tail length.

model_tail_sensitivity <- lmerTest::lmer(
  Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + Tail + (1|Animal_ID),
  data=igf_data)
summary(model_tail_sensitivity); anova(model_tail_sensitivity,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * Supplementation +  
##     Tail + (1 | Animal_ID)
##    Data: igf_data
## 
## REML criterion at convergence: 1970.5
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.9111 -0.5262  0.1124  0.5350  3.5702 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 16.16    4.020   
##  Residual              19.02    4.361   
## Number of obs: 323, groups:  Animal_ID, 47
## 
## Fixed effects:
##                                            Estimate Std. Error         df
## (Intercept)                               13.213432   7.075965  50.260370
## Week                                       4.236546   0.539984 290.708618
## Perc.WeightLoss                            0.033786   0.105948 302.747557
## SupplementationIGF1                        3.368255   3.560472 236.334676
## SupplementationIGF2                        1.884904   4.372909 261.109106
## Tail                                      -0.240628   0.092564  47.462931
## Week:Perc.WeightLoss                      -0.010191   0.023599 288.583065
## Week:SupplementationIGF1                  -0.281928   0.697034 294.969429
## Week:SupplementationIGF2                  -1.284194   0.780195 289.644224
## Perc.WeightLoss:SupplementationIGF1       -0.134307   0.164191 309.296432
## Perc.WeightLoss:SupplementationIGF2       -0.106108   0.193859 308.285358
## Week:Perc.WeightLoss:SupplementationIGF1  -0.001259   0.035255 302.552132
## Week:Perc.WeightLoss:SupplementationIGF2   0.071966   0.035762 286.389469
##                                          t value Pr(>|t|)    
## (Intercept)                                1.867   0.0677 .  
## Week                                       7.846 8.28e-14 ***
## Perc.WeightLoss                            0.319   0.7500    
## SupplementationIGF1                        0.946   0.3451    
## SupplementationIGF2                        0.431   0.6668    
## Tail                                      -2.600   0.0124 *  
## Week:Perc.WeightLoss                      -0.432   0.6662    
## Week:SupplementationIGF1                  -0.404   0.6862    
## Week:SupplementationIGF2                  -1.646   0.1009    
## Perc.WeightLoss:SupplementationIGF1       -0.818   0.4140    
## Perc.WeightLoss:SupplementationIGF2       -0.547   0.5845    
## Week:Perc.WeightLoss:SupplementationIGF1  -0.036   0.9715    
## Week:Perc.WeightLoss:SupplementationIGF2   2.012   0.0451 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

IGF dose sensitivity

Purpose: Test whether variation in administered IGF dose explains differences between IGF1 and IGF2 animals.

Approach: Only IGF-treated restricted animals are included because Vehicle animals received no IGF dose. The IGF model is fit with and without Dose and compared using AIC, and the model including Dose is examined directly.

Result/Decision: Dose is retained as a sensitivity check rather than a primary predictor. The comparison evaluates whether modest variation in administered dose materially improves explanation of regenerative performance beyond supplementation identity and energetic-state terms.

igf_dose_data <- igf_data %>%
  filter(Supplementation %in% c("IGF1","IGF2")) %>%
  group_by(Animal_ID) %>% fill(Dose,.direction="downup") %>% ungroup() %>%
  mutate(Supplementation=droplevels(Supplementation))

model_dose0 <- lmerTest::lmer(
  Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + (1|Animal_ID),
  data=igf_dose_data, REML=FALSE)
model_dose <- lmerTest::lmer(
  Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + Dose + (1|Animal_ID),
  data=igf_dose_data, REML=FALSE)
AIC(model_dose0,model_dose)
summary(model_dose); anova(model_dose,type=3)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
##   method [lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * Supplementation +  
##     Dose + (1 | Animal_ID)
##    Data: igf_dose_data
## 
##       AIC       BIC    logLik -2*log(L)  df.resid 
##    1386.9    1424.8    -682.5    1364.9       221 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.1128 -0.5579  0.1367  0.5209  2.9280 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 13.69    3.700   
##  Residual              15.96    3.995   
## Number of obs: 232, groups:  Animal_ID, 34
## 
## Fixed effects:
##                                            Estimate Std. Error         df
## (Intercept)                              -12.811849   5.464079  41.611339
## Week                                       3.888356   0.405912 222.790296
## Perc.WeightLoss                           -0.128000   0.116073 225.994427
## SupplementationIGF2                       -1.857827   4.031246 197.737812
## Dose                                       5.074029   2.454100  37.523852
## Week:Perc.WeightLoss                      -0.007641   0.024131 230.107478
## Week:SupplementationIGF2                  -0.957394   0.655995 217.966737
## Perc.WeightLoss:SupplementationIGF2        0.045936   0.188749 227.106737
## Week:Perc.WeightLoss:SupplementationIGF2   0.070355   0.034449 222.832549
##                                          t value Pr(>|t|)    
## (Intercept)                               -2.345   0.0239 *  
## Week                                       9.579   <2e-16 ***
## Perc.WeightLoss                           -1.103   0.2713    
## SupplementationIGF2                       -0.461   0.6454    
## Dose                                       2.068   0.0456 *  
## Week:Perc.WeightLoss                      -0.317   0.7518    
## Week:SupplementationIGF2                  -1.459   0.1459    
## Perc.WeightLoss:SupplementationIGF2        0.243   0.8079    
## Week:Perc.WeightLoss:SupplementationIGF2   2.042   0.0423 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) Week   Prc.WL SpIGF2 Dose   Wk:P.WL W:SIGF P.WL:S
## Week        -0.221                                                  
## Prc.WghtLss -0.195  0.726                                           
## SpplmntIGF2 -0.158  0.419  0.491                                    
## Dose        -0.907 -0.090 -0.172 -0.090                             
## Wk:Prc.WghL  0.183 -0.900 -0.784 -0.372  0.094                      
## Wk:SpplIGF2  0.145 -0.618 -0.448 -0.763  0.048  0.556               
## Pr.WL:SIGF2  0.126 -0.446 -0.614 -0.902  0.099  0.481   0.765       
## W:P.WL:SIGF -0.136  0.629  0.548  0.684 -0.057 -0.700  -0.920 -0.790

Post-autotomy body-mass trajectories

Purpose: Test whether IGF supplementation itself produced different post-treatment body-mass trajectories that could provide an alternative explanation for the regeneration results.

Approach: Restricted + Vehicle, Restricted + IGF1, and Restricted + IGF2 animals are compared for percent change in body mass relative to the Week -1 pre-autotomy measurement. Week-specific trajectory slopes are estimated and compared among supplementation groups.

Result/Decision: Body-mass trajectories did not differ significantly among supplementation groups (Week × Supplementation, p = 0.23), and pairwise trajectory slopes were nonsignificant. There is no evidence that IGF2 produced a uniquely different post-treatment body-mass trajectory. Because the baseline precedes autotomy, post-autotomy mass change includes physical tail removal and is not interpreted as a direct measure of whole-body energy balance.

pre_autotomy_mass <- diet %>% filter(Week==-1) %>%
  dplyr::select(Animal_ID,PreAutotomy_Mass=Mass) %>% distinct()

post_igf_mass <- igf_data %>%
  filter(Week %in% c(2,4,6,8), !is.na(Mass)) %>%
  left_join(pre_autotomy_mass,by="Animal_ID") %>%
  mutate(Percent_Mass_Change=((Mass-PreAutotomy_Mass)/PreAutotomy_Mass)*100)

model_post_igf_mass <- lmerTest::lmer(
  Percent_Mass_Change ~ Week*Supplementation + (1|Animal_ID), data=post_igf_mass)
summary(model_post_igf_mass); anova(model_post_igf_mass,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Percent_Mass_Change ~ Week * Supplementation + (1 | Animal_ID)
##    Data: post_igf_mass
## 
## REML criterion at convergence: 1025.9
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.4911 -0.4713 -0.0123  0.5277  3.8203 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 29.63    5.444   
##  Residual              28.39    5.328   
## Number of obs: 157, groups:  Animal_ID, 46
## 
## Fixed effects:
##                          Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)              -11.1939     2.4593 123.4563  -4.552 1.26e-05 ***
## Week                      -0.4673     0.4015 115.4443  -1.164    0.247    
## SupplementationIGF1        0.2233     3.2914 122.5491   0.068    0.946    
## SupplementationIGF2       -3.5735     3.2464 122.4341  -1.101    0.273    
## Week:SupplementationIGF1   0.8454     0.5271 115.8798   1.604    0.112    
## Week:SupplementationIGF2   0.7516     0.5175 113.9692   1.452    0.149    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) Week   SpIGF1 SpIGF2 W:SIGF1
## Week        -0.712                             
## SpplmntIGF1 -0.747  0.532                      
## SpplmntIGF2 -0.758  0.540  0.566               
## Wk:SpplIGF1  0.543 -0.762 -0.705 -0.411        
## Wk:SpplIGF2  0.553 -0.776 -0.413 -0.712  0.591
post_mass_slopes <- emmeans::emtrends(model_post_igf_mass,~Supplementation,var="Week")
summary(post_mass_slopes,infer=TRUE)
pairs(post_mass_slopes,adjust="tukey")
##  contrast       estimate    SE  df t.ratio p.value
##  Vehicle - IGF1  -0.8454 0.528 116  -1.601  0.2495
##  Vehicle - IGF2  -0.7516 0.518 114  -1.450  0.3189
##  IGF1 - IGF2      0.0937 0.473 114   0.198  0.9786
## 
## Degrees-of-freedom method: kenward-roger 
## P value adjustment: tukey method for comparing a family of 3 estimates

Exploration

Additional model-structure and descriptive analyses used to understand the data, investigate reviewer questions, and guide final modeling decisions. These are separated from the primary published tests and formal sensitivity analyses.

Random-effects structure validation

Purpose: Evaluate whether repeated measurements are adequately represented by animal-specific intercepts alone or whether animals also differ in their regeneration trajectories through time.

Approach: Alternative random-effects structures are treated as model-structure checks for the longitudinal regeneration analyses. The comparison focuses on whether allowing animal-specific Week slopes changes model fit, singularity, or uncertainty around energetic-state interactions.

Result/Decision: These checks document the model-selection process. Earlier comparisons indicated substantial among-animal variation in longitudinal regeneration trajectories, while intercept variance could approach zero in more flexible structures. These diagnostics are kept separate from the biological hypothesis tests.

Validation of the full regeneration period

Purpose: Confirm that the longitudinal conclusions are not artifacts of restricting the analysis to an early portion of regeneration and evaluate repeated-measures behavior across the full dataset.

Approach: Early-week and full-period versions of the restricted-diet IGF model are fit, within-animal repeatability is summarized, and residual magnitude is compared across weeks.

Result/Decision: These analyses are retained as model validation because the energetic-state association develops over time and later observations are biologically important. They assess whether the full regeneration period can be retained without evidence that later weeks alone create the longitudinal pattern.

model_early_weeks <- lmerTest::lmer(
  Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + (1|Animal_ID),
  data=igf_data %>% filter(Week<=4))
model_full_weeks <- lmerTest::lmer(
  Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + (1|Animal_ID),
  data=igf_data)
summary(model_early_weeks); anova(model_early_weeks,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * Supplementation +  
##     (1 | Animal_ID)
##    Data: igf_data %>% filter(Week <= 4)
## 
## REML criterion at convergence: 969.6
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.6225 -0.6837  0.0866  0.5502  3.5391 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept)  2.559   1.600   
##  Residual              10.598   3.256   
## Number of obs: 179, groups:  Animal_ID, 47
## 
## Fixed effects:
##                                           Estimate Std. Error        df t value
## (Intercept)                               -5.45397    2.13919 155.46805  -2.550
## Week                                       4.22378    1.11999 166.31951   3.771
## Perc.WeightLoss                           -0.07595    0.09607 143.73511  -0.791
## SupplementationIGF1                       -0.09456    3.34831 162.92144  -0.028
## SupplementationIGF2                       -2.79696    4.09473 160.85495  -0.683
## Week:Perc.WeightLoss                       0.04534    0.04942 164.85432   0.917
## Week:SupplementationIGF1                  -0.57489    1.53468 163.12783  -0.375
## Week:SupplementationIGF2                  -0.03947    1.67878 152.36390  -0.024
## Perc.WeightLoss:SupplementationIGF1        0.03157    0.16372 161.05432   0.193
## Perc.WeightLoss:SupplementationIGF2        0.16929    0.18635 159.87799   0.908
## Week:Perc.WeightLoss:SupplementationIGF1   0.01116    0.07621 164.82361   0.146
## Week:Perc.WeightLoss:SupplementationIGF2  -0.02409    0.07454 150.22910  -0.323
##                                          Pr(>|t|)    
## (Intercept)                              0.011754 *  
## Week                                     0.000225 ***
## Perc.WeightLoss                          0.430486    
## SupplementationIGF1                      0.977504    
## SupplementationIGF2                      0.495549    
## Week:Perc.WeightLoss                     0.360291    
## Week:SupplementationIGF1                 0.708446    
## Week:SupplementationIGF2                 0.981271    
## Perc.WeightLoss:SupplementationIGF1      0.847335    
## Perc.WeightLoss:SupplementationIGF2      0.365008    
## Week:Perc.WeightLoss:SupplementationIGF1 0.883754    
## Week:Perc.WeightLoss:SupplementationIGF2 0.746953    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##              (Intr) Week   Prc.WL SpIGF1 SpIGF2 Wk:P.WL W:SIGF1 W:SIGF2
## Week         -0.794                                                    
## Prc.WghtLss  -0.819  0.650                                             
## SpplmntIGF1  -0.639  0.508  0.523                                      
## SpplmntIGF2  -0.522  0.415  0.428  0.334                               
## Wk:Prc.WghL   0.718 -0.927 -0.770 -0.459 -0.375                        
## Wk:SpplIGF1   0.580 -0.730 -0.475 -0.833 -0.303  0.677                 
## Wk:SpplIGF2   0.530 -0.667 -0.434 -0.339 -0.830  0.619   0.487         
## Pr.WL:SIGF1   0.481 -0.382 -0.587 -0.872 -0.251  0.452   0.741   0.255 
## Pr.WL:SIGF2   0.422 -0.335 -0.516 -0.270 -0.916  0.397   0.245   0.747 
## W:P.WL:SIGF1 -0.466  0.601  0.499  0.761  0.243 -0.648  -0.923  -0.401 
## W:P.WL:SIGF2 -0.476  0.615  0.510  0.304  0.789 -0.663  -0.449  -0.944 
##              P.WL:SIGF1 P.WL:SIGF2 W:P.WL:SIGF1
## Week                                           
## Prc.WghtLss                                    
## SpplmntIGF1                                    
## SpplmntIGF2                                    
## Wk:Prc.WghL                                    
## Wk:SpplIGF1                                    
## Wk:SpplIGF2                                    
## Pr.WL:SIGF1                                    
## Pr.WL:SIGF2   0.303                            
## W:P.WL:SIGF1 -0.836     -0.257                 
## W:P.WL:SIGF2 -0.300     -0.822      0.430
summary(model_full_weeks); anova(model_full_weeks,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * Supplementation +  
##     (1 | Animal_ID)
##    Data: igf_data
## 
## REML criterion at convergence: 1974
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.8891 -0.5492  0.1063  0.5239  3.6505 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  Animal_ID (Intercept) 18.93    4.351   
##  Residual              18.99    4.357   
## Number of obs: 323, groups:  Animal_ID, 47
## 
## Fixed effects:
##                                            Estimate Std. Error         df
## (Intercept)                               -4.018033   2.478763 242.557024
## Week                                       4.338052   0.539645 290.716386
## Perc.WeightLoss                           -0.004628   0.105606 303.849755
## SupplementationIGF1                        1.599782   3.564679 232.026387
## SupplementationIGF2                        0.309570   4.415799 265.914483
## Week:Perc.WeightLoss                      -0.013992   0.023589 288.557548
## Week:SupplementationIGF1                  -0.390114   0.698146 294.599968
## Week:SupplementationIGF2                  -1.394936   0.780520 289.217760
## Perc.WeightLoss:SupplementationIGF1       -0.090226   0.164689 310.266636
## Perc.WeightLoss:SupplementationIGF2       -0.072661   0.195468 310.579911
## Week:Perc.WeightLoss:SupplementationIGF1   0.002789   0.035394 302.088587
## Week:Perc.WeightLoss:SupplementationIGF2   0.076005   0.035776 285.943832
##                                          t value Pr(>|t|)    
## (Intercept)                               -1.621   0.1063    
## Week                                       8.039  2.3e-14 ***
## Perc.WeightLoss                           -0.044   0.9651    
## SupplementationIGF1                        0.449   0.6540    
## SupplementationIGF2                        0.070   0.9442    
## Week:Perc.WeightLoss                      -0.593   0.5535    
## Week:SupplementationIGF1                  -0.559   0.5767    
## Week:SupplementationIGF2                  -1.787   0.0750 .  
## Perc.WeightLoss:SupplementationIGF1       -0.548   0.5842    
## Perc.WeightLoss:SupplementationIGF2       -0.372   0.7103    
## Week:Perc.WeightLoss:SupplementationIGF1   0.079   0.9372    
## Week:Perc.WeightLoss:SupplementationIGF2   2.124   0.0345 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##              (Intr) Week   Prc.WL SpIGF1 SpIGF2 Wk:P.WL W:SIGF1 W:SIGF2
## Week         -0.591                                                    
## Prc.WghtLss  -0.776  0.535                                             
## SpplmntIGF1  -0.695  0.411  0.539                                      
## SpplmntIGF2  -0.561  0.332  0.435  0.390                               
## Wk:Prc.WghL   0.558 -0.909 -0.675 -0.388 -0.313                        
## Wk:SpplIGF1   0.457 -0.773 -0.413 -0.644 -0.256  0.703                 
## Wk:SpplIGF2   0.409 -0.691 -0.370 -0.284 -0.695  0.629   0.534         
## Pr.WL:SIGF1   0.497 -0.343 -0.641 -0.810 -0.279  0.433   0.617   0.237 
## Pr.WL:SIGF2   0.419 -0.289 -0.540 -0.291 -0.881  0.365   0.223   0.679 
## W:P.WL:SIGF1 -0.372  0.606  0.450  0.599  0.209 -0.666  -0.894  -0.419 
## W:P.WL:SIGF2 -0.368  0.599  0.445  0.256  0.655 -0.659  -0.463  -0.928 
##              P.WL:SIGF1 P.WL:SIGF2 W:P.WL:SIGF1
## Week                                           
## Prc.WghtLss                                    
## SpplmntIGF1                                    
## SpplmntIGF2                                    
## Wk:Prc.WghL                                    
## Wk:SpplIGF1                                    
## Wk:SpplIGF2                                    
## Pr.WL:SIGF1                                    
## Pr.WL:SIGF2   0.346                            
## W:P.WL:SIGF1 -0.736     -0.243                 
## W:P.WL:SIGF2 -0.285     -0.747      0.439
performance::icc(model_full_weeks)
residual_data <- data.frame(
  Week=model.frame(model_full_weeks)$Week,
  residual=residuals(model_full_weeks)) %>%
  mutate(absolute_residual=abs(residual))
model_residual_variation <- lm(absolute_residual ~ factor(Week),data=residual_data)
anova(model_residual_variation)

Body-mass trajectories across the experiment

Purpose: Provide a descriptive check of individual and treatment-level body-mass trajectories across the full experiment.

Approach: Pre-autotomy and regeneration-period percent-mass-loss values are combined by animal and treatment. The same treatment palette is used across figures.

Result/Decision: This descriptive dataset supports visualization of the timing and variability of body-mass change. It is not used as a direct measure of whole-body energy balance after autotomy.

pre_traj <- diet %>% filter(Week<0,!is.na(Perc_WL)) %>%
  dplyr::select(Animal_ID,Week,Perc.WeightLoss=Perc_WL) %>%
  left_join(data %>% dplyr::select(Animal_ID,Treatment) %>% distinct(),by="Animal_ID")
regen_traj <- data %>% filter(Week>=0,!is.na(Perc.WeightLoss)) %>%
  dplyr::select(Animal_ID,Week,Perc.WeightLoss,Treatment)
trajectory_data <- bind_rows(pre_traj,regen_traj) %>%
  mutate(Group=case_when(Treatment=="AdLib"~"AdLib",Treatment=="DR"~"Vehicle",
                         Treatment=="DR.IGF1"~"IGF1",Treatment=="DR.IGF2"~"IGF2"))

Sample sizes

Purpose: Document the number of unique animals contributing to the main concurrent, IGF, and lagged analyses.

Approach: Sample sizes are counted by unique Animal_ID rather than by repeated observations. Counts are shown separately for the full experiment, restricted-diet IGF comparison, and lagged dataset.

Result/Decision: These counts make the transition between the full four-group experiment and restricted-diet IGF analyses explicit and prevent repeated observations from being mistaken for independent sample size.

data %>% filter(!is.na(Perc.Regeneration),!is.na(Perc.WeightLoss)) %>%
  distinct(Animal_ID,Treatment) %>% count(Treatment)
igf_data %>% filter(!is.na(Perc.Regeneration),!is.na(Perc.WeightLoss)) %>%
  distinct(Animal_ID,Supplementation) %>% count(Supplementation)
lagged_data %>% distinct(Animal_ID,Supplementation) %>% count(Supplementation)

Session information

Purpose: Record the software environment used to run the reproducibility file.

Approach: R session and package-version information are printed at the end of the document.

Result/Decision: Session information is retained to support reproducibility.

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] patchwork_1.3.2    performance_0.16.0 emmeans_2.0.2      lmerTest_3.2-1    
##  [5] lme4_2.0-6         Matrix_1.7-4       lubridate_1.9.5    forcats_1.0.1     
##  [9] stringr_1.6.0      dplyr_1.2.1        purrr_1.2.2        readr_2.2.0       
## [13] tidyr_1.3.2        tibble_3.3.1       ggplot2_4.0.2      tidyverse_2.0.0   
## 
## loaded via a namespace (and not attached):
##  [1] gtable_0.3.6        xfun_0.61           bslib_0.10.0       
##  [4] insight_1.5.1       lattice_0.22-7      tzdb_0.5.0         
##  [7] numDeriv_2016.8-1.1 vctrs_0.7.1         tools_4.5.2        
## [10] Rdpack_2.6.6        generics_0.1.4      parallel_4.5.2     
## [13] pbkrtest_0.5.5      sandwich_3.1-1      pkgconfig_2.0.3    
## [16] RColorBrewer_1.1-3  S7_0.2.1            lifecycle_1.0.5    
## [19] compiler_4.5.2      farver_2.1.2        textshaping_1.0.5  
## [22] codetools_0.2-20    htmltools_0.5.9     sass_0.4.10        
## [25] yaml_2.3.12         pillar_1.11.1       nloptr_2.2.1       
## [28] jquerylib_0.1.4     MASS_7.3-65         cachem_1.1.0       
## [31] reformulas_0.4.4    boot_1.3-32         multcomp_1.4-30    
## [34] nlme_3.1-168        tidyselect_1.2.1    digest_0.6.39      
## [37] mvtnorm_1.3-5       stringi_1.8.7       labeling_0.4.3     
## [40] splines_4.5.2       fastmap_1.2.0       grid_4.5.2         
## [43] cli_3.6.5           magrittr_2.0.4      survival_3.8-3     
## [46] broom_1.0.12        TH.data_1.1-5       withr_3.0.2        
## [49] backports_1.5.0     scales_1.4.0        timechange_0.4.0   
## [52] estimability_1.5.1  rmarkdown_2.30      otel_0.2.0         
## [55] ragg_1.5.2          zoo_1.8-15          hms_1.1.4          
## [58] coda_0.19-4.1       evaluate_1.0.5      knitr_1.51         
## [61] rbibutils_2.4.1     rlang_1.3.0         Rcpp_1.1.2         
## [64] xtable_1.8-8        glue_1.8.1          rstudioapi_0.18.0  
## [67] minqa_1.2.8         jsonlite_2.0.0      R6_2.6.1           
## [70] systemfonts_1.3.2