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, greater concurrent body-mass loss was positively associated with cumulative regenerative performance across Weeks 1–8. Estimated slopes increased numerically across time, but the Week × percent-mass-loss interaction was not statistically significant (p = 0.106), so there is insufficient evidence that the strength of this association changed 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 a contemporaneous association between ongoing energetic state and regenerative performance. They do not establish the direction of causality or provide strong evidence that the association itself changes over time.

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 was not statistically significant (F = 2.62, p = 0.106), providing insufficient evidence that the strength of energetic-state/regeneration coupling changed over time. Nevertheless, the week-specific concurrent slopes were positive and statistically significant at each Week 1–8 measurement. Thus, greater concurrent body-mass loss was consistently associated with greater cumulative regeneration, but the apparent numerical increase in this association across weeks is not interpreted as a statistically supported strengthening through time. 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. Its final F statistic and p value are extracted directly into the manuscript-facing summary table below from this random-Week-slope model. Week-specific Tukey-adjusted pairwise slope contrasts identify when groups diverge and are reported in full in the companion table. 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

Manuscript-facing statistical summary

The tables below extract the statistics directly from the fitted models so that the values used in the manuscript remain synchronized with the final analysis code.

Primary statistical results for manuscript reporting.
Analysis Effect/test F df numerator df denominator p
Dietary manipulation Diet 13.85 1 67.00 <0.001
Concurrent energetic state Week × percent body-mass loss 2.62 1 425.00 0.106
IGF modification of concurrent association Week × percent body-mass loss × supplementation 2.82 2 300.97 0.061
Tukey-adjusted pairwise contrasts of energetic-state slopes among supplementation groups by week.
Week contrast estimate SE df p.value
1 Vehicle - IGF1 0.047 0.080 292.7 0.828
1 Vehicle - IGF2 0.000 0.092 277.6 1.000
1 IGF1 - IGF2 -0.047 0.096 288.9 0.878
2 Vehicle - IGF1 0.035 0.072 300.8 0.878
2 Vehicle - IGF2 -0.069 0.083 293.1 0.687
2 IGF1 - IGF2 -0.104 0.084 295.7 0.431
3 Vehicle - IGF1 0.023 0.077 307.8 0.951
3 Vehicle - IGF2 -0.137 0.086 307.0 0.249
3 IGF1 - IGF2 -0.161 0.081 303.6 0.121
4 Vehicle - IGF1 0.012 0.093 309.8 0.991
4 Vehicle - IGF2 -0.206 0.099 310.7 0.096
4 IGF1 - IGF2 -0.218 0.090 307.4 0.044
5 Vehicle - IGF1 0.000 0.116 310.0 1.000
5 Vehicle - IGF2 -0.274 0.119 311.0 0.056
5 IGF1 - IGF2 -0.274 0.108 307.9 0.031
6 Vehicle - IGF1 -0.012 0.141 309.8 0.996
6 Vehicle - IGF2 -0.343 0.143 311.0 0.044
6 IGF1 - IGF2 -0.331 0.131 307.3 0.031
7 Vehicle - IGF1 -0.023 0.169 309.4 0.990
7 Vehicle - IGF2 -0.412 0.169 310.8 0.041
7 IGF1 - IGF2 -0.388 0.156 306.4 0.036
8 Vehicle - IGF1 -0.035 0.198 309.0 0.983
8 Vehicle - IGF2 -0.480 0.197 310.6 0.040
8 IGF1 - IGF2 -0.445 0.183 305.5 0.042

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 concurrent energetic-state/regeneration association 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","DR"),
                             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)

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

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

fig1b <- ggplot(
  fig1b_data,
  aes(
    x = Week,
    y = 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)


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)

concurrent_slopes <- emmeans::emtrends(
  model_concurrent,
  ~ Week,
  var = "Perc.WeightLoss",
  at = list(Week = 1:8)
)

concurrent_slopes_df <- as.data.frame(
  summary(concurrent_slopes, infer = TRUE)
)

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)

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)

# Print each component in the RPubs document as well as exporting it below.
fig1a

fig1b

fig1d

fig1c

# 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 1 to Week 8, and parametric bootstrap distributions of that derived treatment-specific change 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 1
# ------------------------------------------------------------

fig2_cumulative_data <- concurrent_igf_slopes_df %>%
  filter(Week %in% c(1, 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_1)

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 of derived treatment-specific change
# in energetic-state slope from Week 1 to Week 8
# ------------------------------------------------------------

set.seed(123)

boot_slope_changes <- function(fit) {
  b <- lme4::fixef(fit)

  slope_at_week <- function(group, week) {
    slope <- unname(b["Perc.WeightLoss"] + week * b["Week:Perc.WeightLoss"])

    if (group == "IGF1") {
      slope <- slope + unname(
        b["Perc.WeightLoss:SupplementationIGF1"] +
          week * b["Week:Perc.WeightLoss:SupplementationIGF1"]
      )
    }

    if (group == "IGF2") {
      slope <- slope + unname(
        b["Perc.WeightLoss:SupplementationIGF2"] +
          week * b["Week:Perc.WeightLoss:SupplementationIGF2"]
      )
    }

    slope
  }

  c(
    Vehicle = slope_at_week("Vehicle", 8) - slope_at_week("Vehicle", 1),
    IGF1 = slope_at_week("IGF1", 8) - slope_at_week("IGF1", 1),
    IGF2 = slope_at_week("IGF2", 8) - slope_at_week("IGF2", 1)
  )
}

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

fig2_bootstrap_df <- as.data.frame(fig2_bootstrap$t)
names(fig2_bootstrap_df) <- c("Vehicle", "IGF1", "IGF2")

fig2_bootstrap_long <- fig2_bootstrap_df %>%
  tidyr::pivot_longer(
    cols = everything(),
    names_to = "Supplementation",
    values_to = "estimate"
  ) %>%
  mutate(
    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 = expression(Delta ~ "slope (Week 8 - Week 1)"),
    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 + (0 + Week | 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 + (0 + Week |  
##     Animal_ID)
##    Data: regen_preautotomy
## 
## REML criterion at convergence: 2473.5
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.0637 -0.5698  0.0377  0.6098  3.9487 
## 
## Random effects:
##  Groups    Name Variance Std.Dev.
##  Animal_ID Week 1.622    1.274   
##  Residual       9.752    3.123   
## Number of obs: 443, groups:  Animal_ID, 65
## 
## Fixed effects:
##                             Estimate Std. Error         df t value Pr(>|t|)    
## (Intercept)                -5.075530   0.422158 383.191137 -12.023   <2e-16 ***
## Week                        4.626561   0.227886  80.493548  20.302   <2e-16 ***
## PreAutotomy_MassLoss        0.009813   0.048615 387.280937   0.202    0.840    
## Week:PreAutotomy_MassLoss  -0.033126   0.026514  81.761943  -1.249    0.215    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) Week   PrA_ML
## Week        -0.376              
## PrAttmy_MsL -0.627  0.234       
## Wk:PrAtt_ML  0.232 -0.622 -0.387
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 + (0 + Week | 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 +  
##     (0 + Week | Animal_ID)
##    Data: regen_preautotomy_igf
## 
## REML criterion at convergence: 1772.1
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.7355 -0.5379  0.0284  0.5815  4.0573 
## 
## Random effects:
##  Groups    Name Variance Std.Dev.
##  Animal_ID Week 1.398    1.182   
##  Residual       8.938    2.990   
## Number of obs: 323, groups:  Animal_ID, 47
## 
## Fixed effects:
##                                                Estimate Std. Error        df
## (Intercept)                                    -5.41563    1.32183 276.40339
## Week                                            4.83589    0.67784  60.57327
## PreAutotomy_MassLoss                            0.10753    0.14001 276.05395
## SupplementationIGF1                             1.84141    1.63040 275.43739
## SupplementationIGF2                             1.56893    1.64257 275.56944
## Week:PreAutotomy_MassLoss                      -0.07704    0.07151  61.24831
## Week:SupplementationIGF1                       -1.51349    0.85239  55.70055
## Week:SupplementationIGF2                       -1.20266    0.84052  58.10915
## PreAutotomy_MassLoss:SupplementationIGF1       -0.23645    0.18069 282.79609
## PreAutotomy_MassLoss:SupplementationIGF2       -0.22520    0.17444 275.05271
## Week:PreAutotomy_MassLoss:SupplementationIGF1   0.16423    0.09556  59.15411
## Week:PreAutotomy_MassLoss:SupplementationIGF2   0.13822    0.08962  57.57108
##                                               t value Pr(>|t|)    
## (Intercept)                                    -4.097 5.50e-05 ***
## Week                                            7.134 1.41e-09 ***
## PreAutotomy_MassLoss                            0.768   0.4431    
## SupplementationIGF1                             1.129   0.2597    
## SupplementationIGF2                             0.955   0.3403    
## Week:PreAutotomy_MassLoss                      -1.077   0.2855    
## Week:SupplementationIGF1                       -1.776   0.0813 .  
## Week:SupplementationIGF2                       -1.431   0.1578    
## PreAutotomy_MassLoss:SupplementationIGF1       -1.309   0.1917    
## PreAutotomy_MassLoss:SupplementationIGF2       -1.291   0.1978    
## Week:PreAutotomy_MassLoss:SupplementationIGF1   1.719   0.0909 .  
## Week:PreAutotomy_MassLoss:SupplementationIGF2   1.542   0.1285    
## ---
## 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.437                                                     
## PrAttmy_MsL   -0.849  0.379                                              
## SpplmntIGF1   -0.811  0.355  0.688                                       
## SpplmntIGF2   -0.805  0.352  0.683  0.652                                
## Wk:PrAtt_ML    0.380 -0.842 -0.442 -0.308 -0.306                         
## Wk:SpplIGF1    0.348 -0.795 -0.301 -0.404 -0.280  0.669                  
## Wk:SpplIGF2    0.353 -0.806 -0.305 -0.286 -0.422  0.679    0.641         
## PA_ML:SIGF1    0.658 -0.294 -0.775 -0.810 -0.529  0.342    0.338   0.237 
## PA_ML:SIGF2    0.681 -0.304 -0.803 -0.553 -0.828  0.355    0.242   0.355 
## W:PA_ML:SIGF1 -0.285  0.630  0.331  0.333  0.229 -0.748   -0.801  -0.508 
## W:PA_ML:SIGF2 -0.303  0.672  0.353  0.246  0.353 -0.798   -0.534  -0.817 
##               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.622                               
## W:PA_ML:SIGF1 -0.436      -0.265                   
## W:PA_ML:SIGF2 -0.273      -0.418       0.597
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.0722 0.163 266.9   0.442  0.8981
##  Vehicle - IGF2   0.0870 0.159 266.2   0.546  0.8487
##  IGF1 - IGF2      0.0148 0.143 264.3   0.103  0.9941
## 
## Week = 2:
##  contrast       estimate    SE    df t.ratio p.value
##  Vehicle - IGF1  -0.0920 0.198  74.0  -0.465  0.8876
##  Vehicle - IGF2  -0.0512 0.191  73.1  -0.269  0.9610
##  IGF1 - IGF2      0.0408 0.175  74.6   0.232  0.9707
## 
## Week = 3:
##  contrast       estimate    SE    df t.ratio p.value
##  Vehicle - IGF1  -0.2562 0.264  46.2  -0.970  0.5991
##  Vehicle - IGF2  -0.1895 0.252  44.8  -0.752  0.7340
##  IGF1 - IGF2      0.0668 0.235  46.5   0.285  0.9564
## 
## Week = 4:
##  contrast       estimate    SE    df t.ratio p.value
##  Vehicle - IGF1  -0.4205 0.345  41.6  -1.220  0.4480
##  Vehicle - IGF2  -0.3277 0.327  40.0  -1.003  0.5790
##  IGF1 - IGF2      0.0928 0.305  41.4   0.304  0.9505
## 
## Week = 5:
##  contrast       estimate    SE    df t.ratio p.value
##  Vehicle - IGF1  -0.5847 0.431  41.3  -1.356  0.3731
##  Vehicle - IGF2  -0.4659 0.407  39.5  -1.144  0.4932
##  IGF1 - IGF2      0.1188 0.381  40.6   0.311  0.9480
## 
## Week = 6:
##  contrast       estimate    SE    df t.ratio p.value
##  Vehicle - IGF1  -0.7489 0.521  42.1  -1.437  0.3314
##  Vehicle - IGF2  -0.6041 0.491  40.3  -1.230  0.4426
##  IGF1 - IGF2      0.1448 0.460  41.0   0.315  0.9469
## 
## Week = 7:
##  contrast       estimate    SE    df t.ratio p.value
##  Vehicle - IGF1  -0.9132 0.613  43.2  -1.490  0.3055
##  Vehicle - IGF2  -0.7424 0.577  41.3  -1.287  0.4102
##  IGF1 - IGF2      0.1708 0.540  41.7   0.316  0.9464
## 
## Week = 8:
##  contrast       estimate    SE    df t.ratio p.value
##  Vehicle - IGF1  -1.0774 0.705  44.3  -1.527  0.2881
##  Vehicle - IGF2  -0.8806 0.663  42.3  -1.328  0.3880
##  IGF1 - IGF2      0.1968 0.621  42.5   0.317  0.9462
## 
## 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 + (0 + Week | 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 +  
##     (0 + Week | Animal_ID)
##    Data: igf_data
## 
## REML criterion at convergence: 1514.8
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.8019 -0.5189  0.0239  0.5587  4.6374 
## 
## Random effects:
##  Groups    Name Variance Std.Dev.
##  Animal_ID Week 0.5803   0.7618  
##  Residual       3.7944   1.9479  
## Number of obs: 322, groups:  Animal_ID, 47
## 
## Fixed effects:
##                                            Estimate Std. Error         df
## (Intercept)                               -4.300002   2.387097 307.472004
## Week                                       2.424438   0.399154 197.656054
## Perc.WeightLoss                           -0.010377   0.043478 277.915930
## SupplementationIGF1                       -0.031267   1.341404 285.836821
## SupplementationIGF2                       -0.172498   1.593499 277.254312
## Tail                                       0.022238   0.032525 301.596843
## Week:Perc.WeightLoss                       0.012524   0.014917 308.687215
## Week:SupplementationIGF1                   0.064669   0.506588 188.210260
## Week:SupplementationIGF2                  -0.578380   0.528416 212.109198
## Perc.WeightLoss:SupplementationIGF1       -0.013773   0.066838 290.971138
## Perc.WeightLoss:SupplementationIGF2       -0.031946   0.073391 273.238448
## Week:Perc.WeightLoss:SupplementationIGF1  -0.003125   0.020947 307.784297
## Week:Perc.WeightLoss:SupplementationIGF2   0.038112   0.020737 305.610715
##                                          t value Pr(>|t|)    
## (Intercept)                               -1.801   0.0726 .  
## Week                                       6.074 6.29e-09 ***
## Perc.WeightLoss                           -0.239   0.8115    
## SupplementationIGF1                       -0.023   0.9814    
## SupplementationIGF2                       -0.108   0.9139    
## Tail                                       0.684   0.4947    
## Week:Perc.WeightLoss                       0.840   0.4018    
## Week:SupplementationIGF1                   0.128   0.8986    
## Week:SupplementationIGF2                  -1.095   0.2750    
## Perc.WeightLoss:SupplementationIGF1       -0.206   0.8369    
## Perc.WeightLoss:SupplementationIGF2       -0.435   0.6637    
## Week:Perc.WeightLoss:SupplementationIGF1  -0.149   0.8815    
## Week:Perc.WeightLoss:SupplementationIGF2   1.838   0.0671 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model_weekly_rate <- lmerTest::lmer(
  Rate_Reg ~ Week*Perc.WeightLoss*Supplementation + Tail + (0 + Week | 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 +  
##     (0 + Week | Animal_ID)
##    Data: igf_data
## 
## REML criterion at convergence: 1361.5
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.5779 -0.6224 -0.1999  0.4217  6.1391 
## 
## Random effects:
##  Groups    Name Variance Std.Dev.
##  Animal_ID Week 0.00693  0.08325 
##  Residual       6.81244  2.61007 
## Number of obs: 278, groups:  Animal_ID, 46
## 
## Fixed effects:
##                                           Estimate Std. Error        df t value
## (Intercept)                                0.82539    2.86195 221.92712   0.288
## Week                                       0.58323    0.48123 252.73730   1.212
## Perc.WeightLoss                            0.28070    0.13276 261.54072   2.114
## SupplementationIGF1                        5.08443    3.08493 262.89057   1.648
## SupplementationIGF2                        3.65850    3.34633 261.10138   1.093
## Tail                                      -0.03835    0.02734  36.75343  -1.403
## Week:Perc.WeightLoss                      -0.04033    0.02309 264.77867  -1.746
## Week:SupplementationIGF1                  -0.72235    0.55987 240.00396  -1.290
## Week:SupplementationIGF2                  -0.70713    0.60871 247.11609  -1.162
## Perc.WeightLoss:SupplementationIGF1       -0.26707    0.15887 261.30563  -1.681
## Perc.WeightLoss:SupplementationIGF2       -0.20756    0.16472 257.32664  -1.260
## Week:Perc.WeightLoss:SupplementationIGF1   0.04162    0.02876 252.07619   1.447
## Week:Perc.WeightLoss:SupplementationIGF2   0.04298    0.02969 263.27090   1.447
##                                          Pr(>|t|)  
## (Intercept)                                0.7733  
## Week                                       0.2267  
## Perc.WeightLoss                            0.0354 *
## SupplementationIGF1                        0.1005  
## SupplementationIGF2                        0.2753  
## Tail                                       0.1690  
## Week:Perc.WeightLoss                       0.0819 .
## Week:SupplementationIGF1                   0.1982  
## Week:SupplementationIGF2                   0.2465  
## Perc.WeightLoss:SupplementationIGF1        0.0939 .
## Perc.WeightLoss:SupplementationIGF2        0.2088  
## Week:Perc.WeightLoss:SupplementationIGF1   0.1491  
## Week:Perc.WeightLoss:SupplementationIGF2   0.1490  
## ---
## 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 + (0 + Week | 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 + (0 + Week | Animal_ID)
##    Data: igf_data
## 
## REML criterion at convergence: 1772.7
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.7622 -0.5064  0.0179  0.5470  4.2703 
## 
## Random effects:
##  Groups    Name Variance Std.Dev.
##  Animal_ID Week 1.590    1.261   
##  Residual       8.367    2.893   
## Number of obs: 323, groups:  Animal_ID, 47
## 
## Fixed effects:
##                                            Estimate Std. Error         df
## (Intercept)                               -8.965907   3.597170 309.904291
## Week                                       3.999983   0.617715 181.298692
## Perc.WeightLoss                           -0.006360   0.064694 275.692794
## SupplementationIGF1                        0.375090   1.997330 284.746376
## SupplementationIGF2                        0.041175   2.370798 274.824955
## Tail                                       0.061162   0.049145 307.245708
## Week:Perc.WeightLoss                       0.010660   0.022464 309.807451
## Week:SupplementationIGF1                  -0.400304   0.785441 169.744545
## Week:SupplementationIGF2                  -1.311996   0.815894 191.885782
## Perc.WeightLoss:SupplementationIGF1       -0.028702   0.099776 291.464537
## Perc.WeightLoss:SupplementationIGF2       -0.047455   0.109109 271.052760
## Week:Perc.WeightLoss:SupplementationIGF1   0.005256   0.031448 306.498654
## Week:Perc.WeightLoss:SupplementationIGF2   0.063488   0.031088 303.144242
##                                          t value Pr(>|t|)    
## (Intercept)                               -2.492   0.0132 *  
## Week                                       6.475  8.6e-10 ***
## Perc.WeightLoss                           -0.098   0.9218    
## SupplementationIGF1                        0.188   0.8512    
## SupplementationIGF2                        0.017   0.9862    
## Tail                                       1.245   0.2143    
## Week:Perc.WeightLoss                       0.475   0.6355    
## Week:SupplementationIGF1                  -0.510   0.6110    
## Week:SupplementationIGF2                  -1.608   0.1095    
## Perc.WeightLoss:SupplementationIGF1       -0.288   0.7738    
## Perc.WeightLoss:SupplementationIGF2       -0.435   0.6640    
## Week:Perc.WeightLoss:SupplementationIGF1   0.167   0.8674    
## Week:Perc.WeightLoss:SupplementationIGF2   2.042   0.0420 *  
## ---
## 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: Among IGF-treated animals, adding administered dose did not improve model fit (AIC = 1256.41 with dose vs. 1254.74 without dose), and dose was not independently associated with regeneration (p = .552). The Week × energetic state × IGF-type interaction remained near the conventional significance threshold after adjustment for dose (p = .051). Accordingly, dose was not included in the primary models.

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 + (0 + Week | Animal_ID),
  data=igf_dose_data, REML=FALSE)
model_dose <- lmerTest::lmer(
  Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + Dose + (0 + Week | 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 + (0 + Week | Animal_ID)
##    Data: igf_dose_data
## 
##       AIC       BIC    logLik -2*log(L)  df.resid 
##    1256.4    1294.3    -617.2    1234.4       221 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.8361 -0.5581  0.0236  0.5474  4.3790 
## 
## Random effects:
##  Groups    Name Variance Std.Dev.
##  Animal_ID Week 1.165    1.079   
##  Residual       7.747    2.783   
## Number of obs: 232, groups:  Animal_ID, 34
## 
## Fixed effects:
##                                           Estimate Std. Error        df t value
## (Intercept)                               -2.06913    2.99978 230.57420  -0.690
## Week                                       3.62684    0.44361 133.15118   8.176
## Perc.WeightLoss                           -0.02855    0.07384 223.80963  -0.387
## SupplementationIGF2                       -0.32644    2.24195 205.76917  -0.146
## Dose                                      -0.83931    1.40834 228.25256  -0.596
## Week:Perc.WeightLoss                       0.01396    0.02107 224.49648   0.663
## Week:SupplementationIGF2                  -0.89744    0.66421 155.14492  -1.351
## Perc.WeightLoss:SupplementationIGF2       -0.01895    0.11140 211.17355  -0.170
## Week:Perc.WeightLoss:SupplementationIGF2   0.05787    0.02947 222.01430   1.964
##                                          Pr(>|t|)    
## (Intercept)                                0.4910    
## Week                                     2.04e-13 ***
## Perc.WeightLoss                            0.6993    
## SupplementationIGF2                        0.8844    
## Dose                                       0.5518    
## Week:Perc.WeightLoss                       0.5082    
## Week:SupplementationIGF2                   0.1786    
## Perc.WeightLoss:SupplementationIGF2        0.8651    
## Week:Perc.WeightLoss:SupplementationIGF2   0.0508 .  
## ---
## 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.180                                                  
## Prc.WghtLss -0.124  0.495                                           
## SpplmntIGF2 -0.162  0.331  0.517                                    
## Dose        -0.903 -0.069 -0.269 -0.094                             
## Wk:Prc.WghL  0.169 -0.703 -0.747 -0.382  0.119                      
## Wk:SpplIGF2  0.137 -0.667 -0.326 -0.585  0.028  0.468               
## Pr.WL:SIGF2  0.149 -0.323 -0.643 -0.925  0.105  0.487   0.555       
## W:P.WL:SIGF -0.144  0.501  0.527  0.628 -0.060 -0.712  -0.758 -0.722

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

### Manuscript-facing validation summary{r manuscript-validation-summary, echo=FALSE}\npre_aov <- anova(model_preautotomy, type=3)\npre_igf_aov <- anova(model_preautotomy_igf, type=3)\nabs_aov <- anova(model_absolute_length, type=3)\nrate_aov <- anova(model_weekly_rate, type=3)\ntail_aov <- anova(model_tail_sensitivity, type=3)\ndose_aov <- anova(model_dose, type=3)\npostmass_aov <- anova(model_post_igf_mass, type=3)\ndose_aic <- AIC(model_dose0, model_dose)\n\nvalidation_results_table <- tibble::tibble(\n Analysis = c(\n "Pre-autotomy energetic state",\n "Pre-autotomy energetic state × IGF",\n "Absolute regenerated length",\n "Weekly regeneration rate",\n "Original tail-length sensitivity",\n "IGF dose",\n "Dose-adjusted IGF modification",\n "Post-autotomy body-mass trajectory"\n ),\n `Key test` = c(\n "Week × pre-autotomy mass loss",\n "Week × pre-autotomy mass loss × supplementation",\n "Week × mass loss × supplementation",\n "Week × mass loss × supplementation",\n "Week × mass loss × supplementation",\n "Dose",\n "Week × mass loss × supplementation",\n "Week × supplementation"\n ),\n F = c(\n pre_aov["Week:PreAutotomy_MassLoss", "F value"],\n pre_igf_aov["Week:PreAutotomy_MassLoss:Supplementation", "F value"],\n abs_aov["Week:Perc.WeightLoss:Supplementation", "F value"],\n rate_aov["Week:Perc.WeightLoss:Supplementation", "F value"],\n tail_aov["Week:Perc.WeightLoss:Supplementation", "F value"],\n dose_aov["Dose", "F value"],\n dose_aov["Week:Perc.WeightLoss:Supplementation", "F value"],\n postmass_aov["Week:Supplementation", "F value"]\n ),\n p = c(\n pre_aov["Week:PreAutotomy_MassLoss", "Pr(>F)"],\n pre_igf_aov["Week:PreAutotomy_MassLoss:Supplementation", "Pr(>F)"],\n abs_aov["Week:Perc.WeightLoss:Supplementation", "Pr(>F)"],\n rate_aov["Week:Perc.WeightLoss:Supplementation", "Pr(>F)"],\n tail_aov["Week:Perc.WeightLoss:Supplementation", "Pr(>F)"],\n dose_aov["Dose", "Pr(>F)"],\n dose_aov["Week:Perc.WeightLoss:Supplementation", "Pr(>F)"],\n postmass_aov["Week:Supplementation", "Pr(>F)"]\n )\n) %>%\n mutate(\n F = round(F, 2),\n p = ifelse(p < .001, "<0.001", sprintf("%.3f", p))\n )\n\nknitr::kable(validation_results_table, caption = "Temporal and sensitivity analyses for manuscript reporting.")\n\ndose_aic_table <- dose_aic %>%\n tibble::rownames_to_column("Model") %>%\n dplyr::select(Model, df, AIC) %>%\n mutate(AIC = round(AIC, 2))\n\nknitr::kable(dose_aic_table, caption = "AIC comparison for the IGF dose sensitivity analysis.")\n # 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 later observations are biologically important and the full eight-week period captures the complete regeneration trajectory. They assess whether inclusion of the later weeks introduces evidence of model instability or whether the full regeneration period can be defensibly retained.

model_early_weeks <- lmerTest::lmer(
  Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + (0 + Week | Animal_ID),
  data=igf_data %>% filter(Week<=4))
model_full_weeks <- lmerTest::lmer(
  Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + (0 + Week | 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 +  
##     (0 + Week | Animal_ID)
##    Data: igf_data %>% filter(Week <= 4)
## 
## REML criterion at convergence: 922.2
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.6986 -0.5883  0.1827  0.6595  2.2675 
## 
## Random effects:
##  Groups    Name Variance Std.Dev.
##  Animal_ID Week 1.010    1.005   
##  Residual       6.154    2.481   
## Number of obs: 179, groups:  Animal_ID, 47
## 
## Fixed effects:
##                                           Estimate Std. Error        df t value
## (Intercept)                               -4.76476    1.79363 163.21398  -2.656
## Week                                       3.30661    1.29583 118.67097   2.552
## Perc.WeightLoss                           -0.09756    0.07801 154.49907  -1.251
## SupplementationIGF1                       -0.88204    2.72157 157.96406  -0.324
## SupplementationIGF2                       -2.12459    3.13463 142.53261  -0.678
## Week:Perc.WeightLoss                       0.08562    0.05632 127.37147   1.520
## Week:SupplementationIGF1                   0.46833    1.66561 138.01386   0.281
## Week:SupplementationIGF2                  -0.27206    1.79057 136.19805  -0.152
## Perc.WeightLoss:SupplementationIGF1        0.06632    0.13414 158.52369   0.494
## Perc.WeightLoss:SupplementationIGF2        0.13347    0.14020 136.02195   0.952
## Week:Perc.WeightLoss:SupplementationIGF1  -0.04146    0.08101 149.36404  -0.512
## Week:Perc.WeightLoss:SupplementationIGF2  -0.01266    0.07802 144.81303  -0.162
##                                          Pr(>|t|)   
## (Intercept)                               0.00868 **
## Week                                      0.01199 * 
## Perc.WeightLoss                           0.21297   
## SupplementationIGF1                       0.74630   
## SupplementationIGF2                       0.49901   
## Week:Perc.WeightLoss                      0.13090   
## Week:SupplementationIGF1                  0.77900   
## Week:SupplementationIGF2                  0.87946   
## Perc.WeightLoss:SupplementationIGF1       0.62170   
## Perc.WeightLoss:SupplementationIGF2       0.34280   
## Week:Perc.WeightLoss:SupplementationIGF1  0.60954   
## Week:Perc.WeightLoss:SupplementationIGF2  0.87134   
## ---
## 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.826                                                    
## Prc.WghtLss  -0.865  0.709                                             
## SpplmntIGF1  -0.659  0.545  0.570                                      
## SpplmntIGF2  -0.572  0.473  0.495  0.377                               
## Wk:Prc.WghL   0.794 -0.945 -0.793 -0.523 -0.454                        
## Wk:SpplIGF1   0.643 -0.778 -0.551 -0.827 -0.368  0.735                 
## Wk:SpplIGF2   0.598 -0.724 -0.513 -0.394 -0.788  0.684   0.563         
## Pr.WL:SIGF1   0.503 -0.412 -0.582 -0.897 -0.288  0.461   0.737   0.298 
## Pr.WL:SIGF2   0.481 -0.394 -0.556 -0.317 -0.926  0.441   0.307   0.702 
## W:P.WL:SIGF1 -0.552  0.657  0.551  0.803  0.316 -0.695  -0.929  -0.475 
## W:P.WL:SIGF2 -0.573  0.682  0.572  0.378  0.770 -0.722  -0.531  -0.950 
##              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.324                            
## W:P.WL:SIGF1 -0.836     -0.307                 
## W:P.WL:SIGF2 -0.333     -0.767      0.502
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 +  
##     (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
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