2. Data Import and Curation
2.1 Pre-experimental body-mass dataset
diet <- read.csv(
"WL.analysis.csv",
stringsAsFactors = FALSE,
check.names = FALSE
)
# The source file contains a trailing space in the Week column name.
names(diet)[trimws(names(diet)) == "Week"] <- "Week"
# Standardize factor order for consistent output.
diet <- diet %>%
mutate(
Treatment = factor(
Treatment,
levels = c("AdLib", "DR", "DR.IGF1", "DR.IGF2")
)
)
str(diet)
## 'data.frame': 228 obs. of 14 variables:
## $ Animal_ID : chr "BC039" "BC048" "BC099" "BC158" ...
## $ ToeClip : chr "1455" "1513" "11-Jan" "2330" ...
## $ BC_Cage : int 32 28 9 28 8 36 39 39 28 15 ...
## $ Treatment : Factor w/ 4 levels "AdLib","DR","DR.IGF1",..: 3 1 1 4 1 3 2 2 3 4 ...
## $ Diet : chr "DR" "Adlib" "Adlib" "DR" ...
## $ Tail : num 73 69 82 71 74 79.5 85 60 75.5 79 ...
## $ SVL : int 46 48 48 44 42 47 51 46 45 47 ...
## $ Week : int -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 ...
## $ Mass : num 2.57 2.71 3.67 2.64 2.46 ...
## $ Bcond : num 0.0558 0.0565 0.0766 0.06 0.0586 ...
## $ Perc_BC.change : num NA NA NA NA NA NA NA NA NA NA ...
## $ Delta Mass_Initial: num NA NA NA NA NA NA NA NA NA NA ...
## $ Perc_WL : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Perc_Orig : num 100 100 100 100 100 100 100 100 100 100 ...
2.2 Eight-week regeneration dataset
data <- read.csv(
"R.analysis.currated.csv",
stringsAsFactors = FALSE,
check.names = FALSE
)
# Remove observations from four individuals following substantial secondary
# tail loss unrelated to the original experimental autotomy.
#
# This exclusion is retained here so that the reorganized file reproduces the
# same analytical dataset and results.
excluded_animals <- c("BC121", "BC144", "BC383", "BC561")
data <- data %>%
filter(!Animal_ID %in% excluded_animals) %>%
mutate(
Treatment = factor(
Treatment,
levels = c("AdLib", "DR", "DR.IGF1", "DR.IGF2")
),
Diet = case_when(
Treatment == "AdLib" ~ "AdLib",
Treatment %in% c("DR", "DR.IGF1", "DR.IGF2") ~ "Restricted",
TRUE ~ NA_character_
),
Diet = factor(Diet, levels = c("AdLib", "Restricted")),
IGF = if_else(
Treatment %in% c("DR.IGF1", "DR.IGF2"),
"IGF",
"No_IGF"
),
IGF = factor(IGF, levels = c("No_IGF", "IGF")),
IGF_type = case_when(
Treatment %in% c("AdLib", "DR") ~ "No_IGF",
Treatment == "DR.IGF1" ~ "IGF1",
Treatment == "DR.IGF2" ~ "IGF2",
TRUE ~ NA_character_
),
IGF_type = factor(IGF_type, levels = c("No_IGF", "IGF1", "IGF2"))
)
str(data)
## 'data.frame': 608 obs. of 18 variables:
## $ Animal_ID : chr "BC039" "BC048" "BC099" "BC158" ...
## $ ToeClip : chr "1455" "1513" "11-Jan" "2330" ...
## $ BC_Cage : int 32 28 9 28 8 36 39 39 28 15 ...
## $ Treatment : Factor w/ 4 levels "AdLib","DR","DR.IGF1",..: 3 1 1 4 1 3 2 2 3 4 ...
## $ Tail : num 73 69 82 71 74 79.5 85 60 75.5 79 ...
## $ SVL : int 46 48 48 44 42 47 51 46 45 47 ...
## $ Week : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Mass : num 2.1 2.21 3.36 2.16 2.06 ...
## $ Dose : num 2.38 0 0 2.32 0 ...
## $ Perc.WeightLoss : num 18 18.36 8.49 18.2 16.17 ...
## $ Regeneration : num 0 0 0 0 0 0 0 0 NA 0 ...
## $ Rate_Reg : num NA NA NA NA NA NA NA NA NA NA ...
## $ Rate_Perc : num NA NA NA NA NA NA NA NA NA NA ...
## $ Perc.Regeneration: num 0 0 0 0 0 0 0 0 0 0 ...
## $ Eggs : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Diet : Factor w/ 2 levels "AdLib","Restricted": 2 1 1 2 1 2 2 2 2 2 ...
## $ IGF : Factor w/ 2 levels "No_IGF","IGF": 2 1 1 2 1 2 1 1 2 2 ...
## $ IGF_type : Factor w/ 3 levels "No_IGF","IGF1",..: 2 1 1 3 1 2 1 1 2 3 ...
table(data$Treatment, useNA = "ifany")
##
## AdLib DR DR.IGF1 DR.IGF2
## 160 136 160 152
length(unique(data$Animal_ID))
## [1] 76
3. Verification of Randomization
Animals should not differ systematically in body size or original
tail length before treatment implementation.
3.1 Baseline subset
pre_diet <- diet %>%
filter(Week == -4)
3.2 Initial snout–vent length
model_svl <- lm(SVL ~ Treatment, data = pre_diet)
anova(model_svl)
## Analysis of Variance Table
##
## Response: SVL
## Df Sum Sq Mean Sq F value Pr(>F)
## Treatment 3 6.984 2.3279 0.6542 0.5829
## Residuals 72 256.214 3.5585
summary(model_svl)
##
## Call:
## lm(formula = SVL ~ Treatment, data = pre_diet)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.900 -1.200 -0.200 1.100 4.706
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 45.9000 0.4218 108.816 <2e-16 ***
## TreatmentDR 0.3941 0.6223 0.633 0.529
## TreatmentDR.IGF1 0.3000 0.5965 0.503 0.617
## TreatmentDR.IGF2 0.8368 0.6043 1.385 0.170
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.886 on 72 degrees of freedom
## Multiple R-squared: 0.02653, Adjusted R-squared: -0.01403
## F-statistic: 0.6542 on 3 and 72 DF, p-value: 0.5829
plot_svl <- ggplot(
pre_diet,
aes(x = Treatment, y = SVL, fill = Treatment)
) +
geom_violin(trim = FALSE, scale = "width") +
geom_boxplot(width = 0.10, outlier.shape = NA) +
geom_jitter(width = 0.10) +
scale_fill_manual(values = treatment_colors) +
labs(x = "Treatment", y = "Snout–vent length") +
theme_classic() +
theme(legend.position = "none")
plot_svl

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

ggsave(
filename = "mass.png",
plot = plot_mass,
width = 5,
height = 4,
dpi = 600
)
Manuscript result: Initial body mass did not differ
among treatment groups, \(F_{3,72}=0.55\), \(p=0.64\).
3.4 Original tail length
model_tail_baseline <- lm(Tail ~ Treatment, data = pre_diet)
anova(model_tail_baseline)
## Analysis of Variance Table
##
## Response: Tail
## Df Sum Sq Mean Sq F value Pr(>F)
## Treatment 3 420.0 139.994 2.3623 0.0795 .
## Residuals 64 3792.7 59.262
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(model_tail_baseline)
##
## Call:
## lm(formula = Tail ~ Treatment, data = pre_diet)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19.000 -4.250 0.875 4.292 20.500
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 73.000 1.814 40.232 <2e-16 ***
## TreatmentDR 1.500 2.743 0.547 0.5864
## TreatmentDR.IGF1 5.250 2.566 2.046 0.0449 *
## TreatmentDR.IGF2 5.778 2.566 2.252 0.0278 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.698 on 64 degrees of freedom
## (8 observations deleted due to missingness)
## Multiple R-squared: 0.09969, Adjusted R-squared: 0.05749
## F-statistic: 2.362 on 3 and 64 DF, p-value: 0.0795
Manuscript result: Original tail length did not
differ significantly among treatment groups, \(F_{3,72}=2.36\), \(p=0.08\).
4. Verification of the Dietary Manipulation
4.1 Percent body-mass loss after acclimation
diet_final_acclimation <- diet %>%
filter(Week == -1)
model_diet_loss <- lm(Perc_WL ~ Diet, data = diet_final_acclimation)
anova(model_diet_loss)
## Analysis of Variance Table
##
## Response: Perc_WL
## Df Sum Sq Mean Sq F value Pr(>F)
## Diet 1 608.22 608.22 13.854 0.0004068 ***
## Residuals 67 2941.39 43.90
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(model_diet_loss)
##
## Call:
## lm(formula = Perc_WL ~ Diet, data = diet_final_acclimation)
##
## Residuals:
## Min 1Q Median 3Q Max
## -18.1313 -4.6672 0.7973 4.0723 20.1000
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.104 1.562 0.707 0.482225
## DietDR 6.761 1.817 3.722 0.000407 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.626 on 67 degrees of freedom
## (7 observations deleted due to missingness)
## Multiple R-squared: 0.1713, Adjusted R-squared: 0.159
## F-statistic: 13.85 on 1 and 67 DF, p-value: 0.0004068
diet_group_summary <- diet_final_acclimation %>%
group_by(Diet) %>%
summarise(
n = sum(!is.na(Perc_WL)),
mean_percent_loss = mean(Perc_WL, na.rm = TRUE),
sd_percent_loss = sd(Perc_WL, na.rm = TRUE),
mean_percent_original_mass = mean(Perc_Orig, na.rm = TRUE),
.groups = "drop"
)
diet_group_summary
## # A tibble: 2 × 5
## Diet n mean_percent_loss sd_percent_loss mean_percent_original_mass
## <chr> <int> <dbl> <dbl> <dbl>
## 1 Adlib 18 1.10 7.58 98.9
## 2 DR 51 7.86 6.27 92.1
Manuscript result: Diet-restricted females lost
significantly more body mass than ad libitum-fed females, \(F_{1,67}=13.85\), \(p=0.0004\).
4.3 Body-mass trajectories during acclimation
These plots are retained from the original analysis to document how
body mass changed before tail autotomy.
plot_mass_by_week_violin <- ggplot(
diet,
aes(x = factor(Week), y = Mass, fill = Diet)
) +
geom_violin(
trim = FALSE,
position = dodge,
scale = "width",
width = 0.5
) +
geom_boxplot(
width = 0.10,
position = dodge,
outlier.shape = NA
) +
geom_jitter(position = dodge) +
scale_fill_manual(values = c("Adlib" = "slategrey", "DR" = "lemonchiffon2")) +
labs(x = "Week", y = "Body mass") +
theme_classic()
plot_mass_by_week <- ggplot(
diet,
aes(x = Week, y = Mass, color = Diet)
) +
geom_smooth() +
scale_color_manual(values = c("Adlib" = "slategrey", "DR" = "lemonchiffon2")) +
theme_classic()
plot_loss_by_week <- ggplot(
diet,
aes(x = Week, y = Perc_WL, color = Diet)
) +
geom_smooth() +
scale_color_manual(values = c("Adlib" = "slategrey", "DR" = "lemonchiffon2")) +
theme_classic()
plot_percent_original_by_week <- ggplot(
diet,
aes(x = Week, y = Perc_Orig, color = Diet)
) +
geom_smooth() +
scale_color_manual(values = c("Adlib" = "slategrey", "DR" = "lemonchiffon2")) +
theme_classic()
plot_mass_by_week_violin

plot_mass_by_week

plot_loss_by_week

plot_percent_original_by_week

ggsave(
filename = "diet2.png",
plot = plot_mass_by_week_violin,
width = 5,
height = 4,
dpi = 600
)
ggsave(
filename = "diet4.png",
plot = plot_percent_original_by_week,
width = 4.75,
height = 4,
dpi = 600
)
5. Establishing the Energetic Trade-off
5.1 Primary cumulative-percent-regeneration model
model_weightloss <- lmerTest::lmer(
Perc.Regeneration ~ Week * Perc.WeightLoss + Tail +
(1 | Animal_ID),
data = data
)
summary(model_weightloss)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss + Tail + (1 | Animal_ID)
## Data: data
##
## REML criterion at convergence: 2747.8
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.1896 -0.5652 0.0844 0.5744 3.1799
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 15.69 3.961
## Residual 21.76 4.665
## Number of obs: 443, groups: Animal_ID, 65
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 13.15695 5.28435 68.47431 2.490 0.01521 *
## Week 4.84774 0.19428 399.39842 24.953 < 2e-16 ***
## Perc.WeightLoss 0.10361 0.05420 436.49430 1.912 0.05657 .
## Tail -0.25817 0.06936 68.87768 -3.722 0.00040 ***
## Week:Perc.WeightLoss -0.03020 0.01021 403.58612 -2.958 0.00327 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL Tail
## Week -0.144
## Prc.WghtLss -0.047 0.632
## Tail -0.977 -0.003 -0.123
## Wk:Prc.WghL 0.135 -0.848 -0.742 -0.012
anova(model_weightloss)
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## Week 13550.0 13550.0 1 399.40 622.6418 < 2.2e-16 ***
## Perc.WeightLoss 79.5 79.5 1 436.49 3.6544 0.0565742 .
## Tail 301.5 301.5 1 68.88 13.8548 0.0003996 ***
## Week:Perc.WeightLoss 190.5 190.5 1 403.59 8.7518 0.0032750 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Manuscript results:
- Week: \(\beta=4.86\), \(t=25.31\), \(p<0.0001\)
- Percent body-mass loss: \(\beta=0.074\), \(t=1.39\), \(p=0.165\)
- Week × percent body-mass loss: \(\beta=-0.030\), \(t=-3.01\), \(p=0.0028\)
A negative Week × Percent Weight Loss interaction indicates that
animals experiencing greater energetic deficits regenerated
progressively less tail tissue over time.
5.2 Alternative regeneration metrics
These models retain the same fixed- and random-effect structure while
replacing the response variable.
model_weightloss_rate <- lmerTest::lmer(
Rate_Reg ~ Week * Perc.WeightLoss + Tail +
(1 | Animal_ID),
data = data
)
model_weightloss_absolute <- lmerTest::lmer(
Regeneration ~ Week * Perc.WeightLoss + Tail +
(1 | Animal_ID),
data = data
)
summary(model_weightloss_rate)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Rate_Reg ~ Week * Perc.WeightLoss + Tail + (1 | Animal_ID)
## Data: data
##
## REML criterion at convergence: 1857.2
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.4619 -0.7154 -0.2113 0.5768 6.0827
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 0.01256 0.1121
## Residual 7.32539 2.7065
## Number of obs: 380, groups: Animal_ID, 64
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 4.621180 1.490139 64.189086 3.101 0.00286 **
## Week -0.017850 0.123697 359.321003 -0.144 0.88534
## Perc.WeightLoss 0.061746 0.035109 374.665891 1.759 0.07944 .
## Tail -0.028967 0.018671 48.287838 -1.551 0.12732
## Week:Perc.WeightLoss -0.007433 0.006688 359.705939 -1.111 0.26716
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL Tail
## Week -0.382
## Prc.WghtLss -0.248 0.732
## Tail -0.902 -0.007 -0.117
## Wk:Prc.WghL 0.337 -0.817 -0.900 -0.020
anova(model_weightloss_rate)
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## Week 0.1525 0.1525 1 359.32 0.0208 0.88534
## Perc.WeightLoss 22.6578 22.6578 1 374.67 3.0931 0.07944 .
## Tail 17.6323 17.6323 1 48.29 2.4070 0.12732
## Week:Perc.WeightLoss 9.0474 9.0474 1 359.71 1.2351 0.26716
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(model_weightloss_absolute)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Regeneration ~ Week * Perc.WeightLoss + Tail + (1 | Animal_ID)
## Data: data
##
## REML criterion at convergence: 2330.5
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.90525 -0.61605 0.07588 0.59909 2.96424
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 6.839 2.615
## Residual 8.366 2.892
## Number of obs: 442, groups: Animal_ID, 65
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.005838 3.446978 68.149514 0.002 0.999
## Week 2.964134 0.120670 396.631276 24.564 <2e-16 ***
## Perc.WeightLoss 0.017058 0.033812 434.412764 0.505 0.614
## Tail -0.045651 0.045234 68.663816 -1.009 0.316
## Week:Perc.WeightLoss -0.005878 0.006342 400.910833 -0.927 0.355
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL Tail
## Week -0.137
## Prc.WghtLss -0.044 0.629
## Tail -0.979 -0.003 -0.120
## Wk:Prc.WghL 0.128 -0.847 -0.738 -0.011
anova(model_weightloss_absolute)
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## Week 5047.8 5047.8 1 396.63 603.3913 <2e-16 ***
## Perc.WeightLoss 2.1 2.1 1 434.41 0.2545 0.6142
## Tail 8.5 8.5 1 68.66 1.0185 0.3164
## Week:Perc.WeightLoss 7.2 7.2 1 400.91 0.8593 0.3545
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
5.3 Exploratory visualization by energetic-state category
The primary analyses treat percent body-mass loss continuously. The
following three-category plot is retained only as a descriptive
visualization.
data <- data %>%
mutate(
WL_group = cut(Perc.WeightLoss, breaks = 3)
)
ggplot(
data,
aes(
x = Week,
y = Perc.Regeneration,
color = WL_group,
group = WL_group
)
) +
stat_summary(fun = mean, geom = "line", linewidth = 1.2) +
stat_summary(fun = mean, geom = "point") +
labs(
x = "Week",
y = "Cumulative percent regeneration",
color = "Weight-loss category"
) +
theme_classic()

6. Testing Rescue by IGF Supplementation
6.1 Primary IGF1-versus-IGF2 rescue model
model_igf_split <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss * IGF_type +
Tail +
(1 | Animal_ID),
data = data
)
summary(model_igf_split)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * IGF_type + Tail +
## (1 | Animal_ID)
## Data: data
##
## REML criterion at convergence: 2717.5
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.05240 -0.58328 0.07647 0.53288 3.14152
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 15.52 3.940
## Residual 19.87 4.457
## Number of obs: 443, groups: Animal_ID, 65
##
## Fixed effects:
## Estimate Std. Error df t value
## (Intercept) 8.95632 5.37444 66.82767 1.666
## Week 5.57153 0.22507 390.98913 24.755
## Perc.WeightLoss 0.16173 0.06336 418.47176 2.553
## IGF_typeIGF1 6.23221 2.90106 308.60824 2.148
## IGF_typeIGF2 4.86116 3.88987 361.49614 1.250
## Tail -0.22402 0.07251 66.89851 -3.090
## Week:Perc.WeightLoss -0.05150 0.01184 388.69919 -4.350
## Week:IGF_typeIGF1 -1.60695 0.50288 411.98772 -3.196
## Week:IGF_typeIGF2 -2.61979 0.61694 399.53650 -4.246
## Perc.WeightLoss:IGF_typeIGF1 -0.25717 0.14183 423.73347 -1.813
## Perc.WeightLoss:IGF_typeIGF2 -0.23525 0.17665 422.61347 -1.332
## Week:Perc.WeightLoss:IGF_typeIGF1 0.03935 0.02919 424.77894 1.348
## Week:Perc.WeightLoss:IGF_typeIGF2 0.11330 0.02987 393.97138 3.793
## Pr(>|t|)
## (Intercept) 0.100302
## Week < 2e-16 ***
## Perc.WeightLoss 0.011041 *
## IGF_typeIGF1 0.032472 *
## IGF_typeIGF2 0.212219
## Tail 0.002919 **
## Week:Perc.WeightLoss 1.74e-05 ***
## Week:IGF_typeIGF1 0.001503 **
## Week:IGF_typeIGF2 2.70e-05 ***
## Perc.WeightLoss:IGF_typeIGF1 0.070503 .
## Perc.WeightLoss:IGF_typeIGF2 0.183676
## Week:Perc.WeightLoss:IGF_typeIGF1 0.178340
## Week:Perc.WeightLoss:IGF_typeIGF2 0.000172 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(model_igf_split)
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## Week 5315.5 5315.5 1 405.93 267.5724 < 2.2e-16
## Perc.WeightLoss 0.0 0.0 1 419.69 0.0011 0.9735115
## IGF_type 107.4 53.7 2 336.71 2.7031 0.0684535
## Tail 189.6 189.6 1 66.90 9.5458 0.0029187
## Week:Perc.WeightLoss 0.0 0.0 1 413.66 0.0021 0.9634575
## Week:IGF_type 486.0 243.0 2 406.02 12.2327 6.939e-06
## Perc.WeightLoss:IGF_type 87.4 43.7 2 422.06 2.1996 0.1121193
## Week:Perc.WeightLoss:IGF_type 296.9 148.5 2 412.47 7.4732 0.0006484
##
## Week ***
## Perc.WeightLoss
## IGF_type .
## Tail **
## Week:Perc.WeightLoss
## Week:IGF_type ***
## Perc.WeightLoss:IGF_type
## Week:Perc.WeightLoss:IGF_type ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Manuscript interpretation: IGF2 significantly
altered the increasingly negative relationship between energetic deficit
and regeneration, whereas IGF1 did not.
6.2 Model-based predictions
predicted_all_weeks <- ggpredict(
model_igf_split,
terms = c(
"Perc.WeightLoss",
"IGF_type",
"Week [2,4,6,8]"
)
)
predicted_early_weeks <- ggpredict(
model_igf_split,
terms = c(
"Perc.WeightLoss",
"IGF_type",
"Week [2,4]"
)
)
predicted_all_weeks
## # Predicted values of Perc.Regeneration
##
## IGF_type: No_IGF
## Week: 2
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | -0.54 | -7.95, 6.87
## -35 | 0.93 | -4.17, 6.02
## -5 | 2.69 | 0.13, 5.25
## 50 | 5.92 | 2.18, 9.66
##
## IGF_type: No_IGF
## Week: 4
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | 16.78 | 10.10, 23.46
## -35 | 15.67 | 11.04, 20.30
## -5 | 14.35 | 11.96, 16.73
## 50 | 11.91 | 8.62, 15.21
##
## IGF_type: No_IGF
## Week: 6
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | 34.10 | 26.42, 41.78
## -35 | 30.42 | 25.11, 35.73
## -5 | 26.00 | 23.33, 28.68
## 50 | 17.91 | 14.19, 21.62
##
## IGF_type: No_IGF
## Week: 8
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | 51.42 | 41.52, 61.33
## -35 | 45.17 | 38.37, 51.96
## -5 | 37.66 | 34.36, 40.97
## 50 | 23.90 | 19.12, 28.68
##
## IGF_type: IGF1
## Week: 2
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | 13.18 | -0.91, 27.28
## -35 | 10.19 | 0.49, 19.90
## -5 | 6.60 | 1.95, 11.25
## 50 | 0.01 | -6.19, 6.21
##
## IGF_type: IGF1
## Week: 4
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | 22.57 | 10.39, 34.75
## -35 | 18.97 | 10.59, 27.35
## -5 | 14.65 | 10.60, 18.70
## 50 | 6.73 | 1.18, 12.28
##
## IGF_type: IGF1
## Week: 6
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | 31.96 | 17.01, 46.91
## -35 | 27.75 | 17.61, 37.89
## -5 | 22.70 | 18.08, 27.32
## 50 | 13.44 | 6.29, 20.59
##
## IGF_type: IGF1
## Week: 8
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | 41.34 | 20.75, 61.94
## -35 | 36.53 | 22.67, 50.38
## -5 | 30.75 | 24.72, 36.78
## 50 | 20.16 | 10.19, 30.13
##
## IGF_type: IGF2
## Week: 2
##
## Perc.WeightLoss | Predicted | 95% CI
## -------------------------------------------
## -60 | -0.40 | -20.36, 19.55
## -35 | 0.85 | -13.01, 14.71
## -5 | 2.35 | -4.34, 9.04
## 50 | 5.11 | -2.43, 12.65
##
## IGF_type: IGF2
## Week: 4
##
## Perc.WeightLoss | Predicted | 95% CI
## -------------------------------------------
## -60 | -1.92 | -17.92, 14.09
## -35 | 2.43 | -8.71, 13.56
## -5 | 7.64 | 2.20, 13.07
## 50 | 17.19 | 11.02, 23.36
##
## IGF_type: IGF2
## Week: 6
##
## Perc.WeightLoss | Predicted | 95% CI
## -------------------------------------------
## -60 | -3.43 | -19.66, 12.80
## -35 | 4.00 | -7.25, 15.26
## -5 | 12.92 | 7.47, 18.37
## 50 | 29.28 | 22.83, 35.72
##
## IGF_type: IGF2
## Week: 8
##
## Perc.WeightLoss | Predicted | 95% CI
## -------------------------------------------
## -60 | -4.94 | -25.43, 15.54
## -35 | 5.58 | -8.57, 19.73
## -5 | 18.21 | 11.48, 24.94
## 50 | 41.36 | 33.15, 49.56
##
## Adjusted for:
## * Tail = 76.41
## * Animal_ID = 0 (population-level)
predicted_early_weeks
## # Predicted values of Perc.Regeneration
##
## IGF_type: No_IGF
## Week: 2
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | -0.54 | -7.95, 6.87
## -35 | 0.93 | -4.17, 6.02
## -5 | 2.69 | 0.13, 5.25
## 50 | 5.92 | 2.18, 9.66
##
## IGF_type: No_IGF
## Week: 4
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | 16.78 | 10.10, 23.46
## -35 | 15.67 | 11.04, 20.30
## -5 | 14.35 | 11.96, 16.73
## 50 | 11.91 | 8.62, 15.21
##
## IGF_type: IGF1
## Week: 2
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | 13.18 | -0.91, 27.28
## -35 | 10.19 | 0.49, 19.90
## -5 | 6.60 | 1.95, 11.25
## 50 | 0.01 | -6.19, 6.21
##
## IGF_type: IGF1
## Week: 4
##
## Perc.WeightLoss | Predicted | 95% CI
## ------------------------------------------
## -60 | 22.57 | 10.39, 34.75
## -35 | 18.97 | 10.59, 27.35
## -5 | 14.65 | 10.60, 18.70
## 50 | 6.73 | 1.18, 12.28
##
## IGF_type: IGF2
## Week: 2
##
## Perc.WeightLoss | Predicted | 95% CI
## -------------------------------------------
## -60 | -0.40 | -20.36, 19.55
## -35 | 0.85 | -13.01, 14.71
## -5 | 2.35 | -4.34, 9.04
## 50 | 5.11 | -2.43, 12.65
##
## IGF_type: IGF2
## Week: 4
##
## Perc.WeightLoss | Predicted | 95% CI
## -------------------------------------------
## -60 | -1.92 | -17.92, 14.09
## -35 | 2.43 | -8.71, 13.56
## -5 | 7.64 | 2.20, 13.07
## 50 | 17.19 | 11.02, 23.36
##
## Adjusted for:
## * Tail = 76.41
## * Animal_ID = 0 (population-level)
plot_predictions <- ggplot(
predicted_all_weeks,
aes(
x = x,
y = predicted,
color = group,
fill = group
)
) +
geom_ribbon(
aes(ymin = conf.low, ymax = conf.high),
alpha = 0.15,
color = NA
) +
geom_line(linewidth = 1.2) +
facet_wrap(~facet) +
scale_color_manual(values = igf_colors) +
scale_fill_manual(values = igf_colors) +
labs(
x = "Percent body-mass loss",
y = "Predicted cumulative percent regeneration",
color = "IGF treatment",
fill = "IGF treatment"
) +
theme_classic()
plot_predictions

6.3 Week-specific energetic-state slopes
week_specific_slopes <- emtrends(
model_igf_split,
~ IGF_type | Week,
var = "Perc.WeightLoss",
at = list(Week = c(2, 4, 6, 8))
)
summary(week_specific_slopes, infer = TRUE)
## Week = 2:
## IGF_type Perc.WeightLoss.trend SE df lower.CL upper.CL t.ratio p.value
## No_IGF 0.0587 0.0491 430 -0.0377 0.1552 1.197 0.2321
## IGF1 -0.1197 0.0915 392 -0.2996 0.0602 -1.308 0.1915
## IGF2 0.0501 0.1260 366 -0.1976 0.2978 0.398 0.6911
##
## Week = 4:
## IGF_type Perc.WeightLoss.trend SE df lower.CL upper.CL t.ratio p.value
## No_IGF -0.0442 0.0437 414 -0.1301 0.0416 -1.013 0.3116
## IGF1 -0.1440 0.0796 408 -0.3004 0.0124 -1.810 0.0710
## IGF2 0.1737 0.1010 307 -0.0255 0.3729 1.716 0.0872
##
## Week = 6:
## IGF_type Perc.WeightLoss.trend SE df lower.CL upper.CL t.ratio p.value
## No_IGF -0.1472 0.0503 422 -0.2461 -0.0484 -2.928 0.0036
## IGF1 -0.1683 0.1000 430 -0.3650 0.0284 -1.682 0.0933
## IGF2 0.2973 0.1030 367 0.0943 0.5003 2.880 0.0042
##
## Week = 8:
## IGF_type Perc.WeightLoss.trend SE df lower.CL upper.CL t.ratio p.value
## No_IGF -0.2502 0.0654 430 -0.3787 -0.1217 -3.828 0.0001
## IGF1 -0.1926 0.1390 425 -0.4665 0.0813 -1.382 0.1677
## IGF2 0.4209 0.1310 430 0.1639 0.6780 3.218 0.0014
##
## Degrees-of-freedom method: kenward-roger
## Confidence level used: 0.95
test(week_specific_slopes)
## Week = 2:
## IGF_type Perc.WeightLoss.trend SE df t.ratio p.value
## No_IGF 0.0587 0.0491 430 1.197 0.2321
## IGF1 -0.1197 0.0915 392 -1.308 0.1915
## IGF2 0.0501 0.1260 366 0.398 0.6911
##
## Week = 4:
## IGF_type Perc.WeightLoss.trend SE df t.ratio p.value
## No_IGF -0.0442 0.0437 414 -1.013 0.3116
## IGF1 -0.1440 0.0796 408 -1.810 0.0710
## IGF2 0.1737 0.1010 307 1.716 0.0872
##
## Week = 6:
## IGF_type Perc.WeightLoss.trend SE df t.ratio p.value
## No_IGF -0.1472 0.0503 422 -2.928 0.0036
## IGF1 -0.1683 0.1000 430 -1.682 0.0933
## IGF2 0.2973 0.1030 367 2.880 0.0042
##
## Week = 8:
## IGF_type Perc.WeightLoss.trend SE df t.ratio p.value
## No_IGF -0.2502 0.0654 430 -3.828 0.0001
## IGF1 -0.1926 0.1390 425 -1.382 0.1677
## IGF2 0.4209 0.1310 430 3.218 0.0014
##
## Degrees-of-freedom method: kenward-roger
week_specific_slopes_df <- as.data.frame(
summary(week_specific_slopes, infer = TRUE)
)
6.4 Pairwise comparisons of slopes
The manuscript describes Tukey-adjusted comparisons among
supplementation groups. Both the full pairwise comparisons and
treatment-versus-control contrasts are retained.
# All pairwise comparisons within week, Tukey adjusted
pairwise_slopes_tukey <- pairs(
week_specific_slopes,
adjust = "tukey"
)
pairwise_slopes_tukey
## Week = 2:
## contrast estimate SE df t.ratio p.value
## No_IGF - IGF1 0.17847 0.1040 408 1.713 0.2014
## No_IGF - IGF2 0.00865 0.1350 379 0.064 0.9977
## IGF1 - IGF2 -0.16982 0.1560 376 -1.090 0.5206
##
## Week = 4:
## contrast estimate SE df t.ratio p.value
## No_IGF - IGF1 0.09976 0.0911 412 1.095 0.5176
## No_IGF - IGF2 -0.21795 0.1100 325 -1.980 0.1189
## IGF1 - IGF2 -0.31771 0.1290 350 -2.467 0.0375
##
## Week = 6:
## contrast estimate SE df t.ratio p.value
## No_IGF - IGF1 0.02106 0.1120 430 0.188 0.9808
## No_IGF - IGF2 -0.44454 0.1150 379 -3.876 0.0004
## IGF1 - IGF2 -0.46560 0.1440 412 -3.238 0.0037
##
## Week = 8:
## contrast estimate SE df t.ratio p.value
## No_IGF - IGF1 -0.05765 0.1540 426 -0.374 0.9258
## No_IGF - IGF2 -0.67114 0.1460 430 -4.594 <0.0001
## IGF1 - IGF2 -0.61349 0.1910 429 -3.210 0.0041
##
## Degrees-of-freedom method: kenward-roger
## P value adjustment: tukey method for comparing a family of 3 estimates
# Treatment-versus-control contrasts retained from the original figure workflow
contrasts_vs_control <- contrast(
week_specific_slopes,
method = "trt.vs.ctrl",
ref = "No_IGF",
adjust = "none"
)
contrasts_vs_control
## Week = 2:
## contrast estimate SE df t.ratio p.value
## IGF1 - No_IGF -0.17847 0.1040 408 -1.713 0.0874
## IGF2 - No_IGF -0.00865 0.1350 379 -0.064 0.9490
##
## Week = 4:
## contrast estimate SE df t.ratio p.value
## IGF1 - No_IGF -0.09976 0.0911 412 -1.095 0.2741
## IGF2 - No_IGF 0.21795 0.1100 325 1.980 0.0486
##
## Week = 6:
## contrast estimate SE df t.ratio p.value
## IGF1 - No_IGF -0.02106 0.1120 430 -0.188 0.8513
## IGF2 - No_IGF 0.44454 0.1150 379 3.876 0.0001
##
## Week = 8:
## contrast estimate SE df t.ratio p.value
## IGF1 - No_IGF 0.05765 0.1540 426 0.374 0.7085
## IGF2 - No_IGF 0.67114 0.1460 430 4.594 <0.0001
##
## Degrees-of-freedom method: kenward-roger
6.5 Figure 2A: week-specific rescue slopes
# Prepare plotting data
rescue_plot_data <- week_specific_slopes_df %>%
mutate(
significance = case_when(
IGF_type == "IGF2" & Week == 4 ~ "\u2020",
IGF_type == "IGF2" & Week == 6 ~ "**",
IGF_type == "IGF2" & Week == 8 ~ "***",
TRUE ~ ""
)
)
plot_rescue <- ggplot(
rescue_plot_data,
aes(
x = Week,
y = Perc.WeightLoss.trend,
color = IGF_type
)
) +
# Background shading
annotate(
"rect",
xmin = -Inf,
xmax = Inf,
ymin = -Inf,
ymax = 0,
fill = "#E87722",
alpha = 0.12
) +
annotate(
"rect",
xmin = -Inf,
xmax = Inf,
ymin = 0,
ymax = Inf,
fill = "#0C2340",
alpha = 0.12
) +
# Zero line
geom_hline(
yintercept = 0,
linetype = "dashed",
color = "black"
) +
# Confidence intervals
geom_errorbar(
aes(ymin = lower.CL, ymax = upper.CL),
width = 0.15,
position = position_dodge(width = 0.25),
linewidth = 0.8
) +
# Point estimates
geom_point(
size = 4,
position = position_dodge(width = 0.25)
) +
# Significance symbols
geom_text(
aes(
y = upper.CL + 0.05,
label = significance
),
position = position_dodge(width = 0.25),
size = 8,
fontface = "bold",
show.legend = FALSE
) +
# Region labels
annotate(
"label",
x = 4.6,
y = 0.72,
label = "Energetic Rescue",
hjust = 0,
color = "#0C2340",
fill = "white",
fontface = "bold",
size = 6,
label.size = 0.5,
label.padding = grid::unit(0.15, "lines")
) +
annotate(
"label",
x = 4.6,
y = -0.46,
label = "Energetic Trade-off",
hjust = 0,
color = "#E87722",
fill = "white",
fontface = "bold",
size = 6,
label.size = 0.5,
label.padding = grid::unit(0.15, "lines")
) +
scale_color_manual(
values = c(
"IGF1" = "#E87722",
"IGF2" = "#0C2340",
"No_IGF" = "grey40"
),
labels = c(
"IGF1" = "IGF1",
"IGF2" = "IGF2",
"No_IGF" = "None"
)
) +
labs(
title = "IGF2 Progressively Reduces the Constraint on Regeneration",
subtitle = "Change in regeneration per 1% increase in weight loss",
x = "Week",
y = "Slope of Regeneration vs. Weight Loss",
color = "Supplementation"
) +
theme_classic(base_size = 12) +
theme(
axis.title = element_text(face = "bold"),
axis.text = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
plot.subtitle = element_text(face = "bold"),
legend.position = "bottom",
legend.title = element_text(face = "bold")
)
plot_rescue

ggsave(
filename = "IGF2_energetic_rescue_figure.png",
plot = plot_rescue,
width = 7,
height = 5,
dpi = 600
)
8. Additional and Sensitivity Analyses
8.1 Administered hormone dose
igf_data <- data %>%
filter(Treatment %in% c("DR.IGF1", "DR.IGF2")) %>%
mutate(
IGF_type = factor(
Treatment,
levels = c("DR.IGF1", "DR.IGF2")
)
) %>%
group_by(Animal_ID) %>%
fill(Dose, .direction = "downup") %>%
ungroup()
model_dose <- lmerTest::lmer(
Rate_Reg ~ Week * Dose * IGF_type +
Tail +
(1 | Animal_ID),
data = igf_data
)
summary(model_dose)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Rate_Reg ~ Week * Dose * IGF_type + Tail + (1 | Animal_ID)
## Data: igf_data
##
## REML criterion at convergence: 906.1
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.3103 -0.6481 -0.1996 0.4690 5.9740
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 0.000 0.000
## Residual 7.638 2.764
## Number of obs: 187, groups: Animal_ID, 31
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) -0.35795 7.35585 178.00000 -0.049 0.961
## Week 0.12632 1.34847 178.00000 0.094 0.925
## Dose 2.26232 3.14891 178.00000 0.718 0.473
## IGF_typeDR.IGF2 4.49745 9.18831 178.00000 0.489 0.625
## Tail -0.01696 0.03966 178.00000 -0.428 0.669
## Week:Dose -0.11446 0.63399 178.00000 -0.181 0.857
## Week:IGF_typeDR.IGF2 -0.63618 1.81952 178.00000 -0.350 0.727
## Dose:IGF_typeDR.IGF2 -2.11952 4.22733 178.00000 -0.501 0.617
## Week:Dose:IGF_typeDR.IGF2 0.30019 0.83719 178.00000 0.359 0.720
##
## Correlation of Fixed Effects:
## (Intr) Week Dose IGF_DR Tail Wek:Ds W:IGF_ D:IGF_
## Week -0.824
## Dose -0.901 0.912
## IGF_DR.IGF2 -0.658 0.669 0.723
## Tail -0.415 -0.027 -0.006 -0.011
## Week:Dose 0.821 -0.994 -0.919 -0.665 0.022
## W:IGF_DR.IG 0.617 -0.741 -0.676 -0.922 0.004 0.736
## D:IGF_DR.IG 0.669 -0.680 -0.745 -0.993 0.011 0.685 0.916
## W:D:IGF_DR. -0.628 0.752 0.696 0.916 -0.003 -0.757 -0.993 -0.922
## optimizer (nloptwrap) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
anova(model_dose)
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## Week 0.33898 0.33898 1 178 0.0444 0.8334
## Dose 2.47268 2.47268 1 178 0.3237 0.5701
## IGF_type 1.82996 1.82996 1 178 0.2396 0.6251
## Tail 1.39625 1.39625 1 178 0.1828 0.6695
## Week:Dose 0.05532 0.05532 1 178 0.0072 0.9323
## Week:IGF_type 0.93374 0.93374 1 178 0.1222 0.7270
## Dose:IGF_type 1.92009 1.92009 1 178 0.2514 0.6167
## Week:Dose:IGF_type 0.98201 0.98201 1 178 0.1286 0.7203
Interpretation: Modest individual variation in
administered dose did not detectably influence regeneration rate or
explain the different responses to IGF1 and IGF2.
8.2 Absolute regenerated tail length
model_rescue_absolute <- lmerTest::lmer(
Regeneration ~
Week * Perc.WeightLoss * IGF +
Tail +
(1 | Animal_ID),
data = data
)
summary(model_rescue_absolute)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Regeneration ~ Week * Perc.WeightLoss * IGF + Tail + (1 | Animal_ID)
## Data: data
##
## REML criterion at convergence: 2325.5
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.76231 -0.57470 0.07425 0.58648 2.89556
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 6.865 2.620
## Residual 8.086 2.844
## Number of obs: 442, groups: Animal_ID, 65
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) -2.254751 3.542504 67.662280 -0.636 0.526608
## Week 3.286947 0.143723 391.488312 22.870 < 2e-16
## Perc.WeightLoss 0.048973 0.040530 419.013263 1.208 0.227606
## IGFIGF 2.865083 1.602655 332.067962 1.788 0.074735
## Tail -0.023917 0.047788 67.811485 -0.500 0.618353
## Week:Perc.WeightLoss -0.016619 0.007559 389.281873 -2.199 0.028491
## Week:IGFIGF -1.011934 0.262631 400.604340 -3.853 0.000136
## Perc.WeightLoss:IGFIGF -0.150642 0.074106 432.958368 -2.033 0.042684
## Week:Perc.WeightLoss:IGFIGF 0.042042 0.013760 405.312744 3.056 0.002395
##
## (Intercept)
## Week ***
## Perc.WeightLoss
## IGFIGF .
## Tail
## Week:Perc.WeightLoss *
## Week:IGFIGF ***
## Perc.WeightLoss:IGFIGF *
## Week:Perc.WeightLoss:IGFIGF **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL IGFIGF Tail Wk:P.WL W:IGFI P.WL:I
## Week -0.167
## Prc.WghtLss -0.037 0.526
## IGFIGF 0.081 0.332 0.378
## Tail -0.971 0.016 -0.126 -0.213
## Wk:Prc.WghL 0.141 -0.764 -0.726 -0.254 -0.024
## Week:IGFIGF 0.085 -0.547 -0.289 -0.691 -0.002 0.418
## P.WL:IGFIGF 0.002 -0.287 -0.549 -0.819 0.087 0.397 0.675
## W:P.WL:IGFI -0.068 0.420 0.400 0.597 0.004 -0.549 -0.873 -0.760
anova(model_rescue_absolute)
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## Week 3625.7 3625.7 1 400.55 448.4051 < 2.2e-16 ***
## Perc.WeightLoss 4.1 4.1 1 432.84 0.5083 0.4762687
## IGF 25.8 25.8 1 332.07 3.1959 0.0747345 .
## Tail 2.0 2.0 1 67.81 0.2505 0.6183533
## Week:Perc.WeightLoss 3.3 3.3 1 405.14 0.4093 0.5226983
## Week:IGF 120.0 120.0 1 400.60 14.8461 0.0001358 ***
## Perc.WeightLoss:IGF 33.4 33.4 1 432.96 4.1322 0.0426844 *
## Week:Perc.WeightLoss:IGF 75.5 75.5 1 405.31 9.3361 0.0023954 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Manuscript results:
- Week: \(\beta=3.29\), \(t=22.87\), \(p<0.0001\)
- Week × percent body-mass loss: \(\beta=-0.0166\), \(t=-2.20\), \(p=0.028\)
- Week × percent body-mass loss × IGF: \(\beta=0.0420\), \(t=3.06\), \(p=0.0026\)
8.3 Endpoint covariance between energetic state and
regeneration
final_regeneration_data <- data %>%
group_by(Animal_ID) %>%
summarise(
final_regeneration = max(Regeneration, na.rm = TRUE),
weight_loss = first(Perc.WeightLoss),
Treatment = first(Treatment),
.groups = "drop"
)
cor.test(
final_regeneration_data$weight_loss,
final_regeneration_data$final_regeneration
)
##
## Pearson's product-moment correlation
##
## data: final_regeneration_data$weight_loss and final_regeneration_data$final_regeneration
## t = 0.56258, df = 61, p-value = 0.5758
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.1791079 0.3140206
## sample estimates:
## cor
## 0.0718454
model_endpoint_tradeoff <- lm(
final_regeneration ~ weight_loss * Treatment,
data = final_regeneration_data
)
summary(model_endpoint_tradeoff)
##
## Call:
## lm(formula = final_regeneration ~ weight_loss * Treatment, data = final_regeneration_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.0612 -3.8851 -0.1858 3.8499 13.4936
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 17.65763 3.43266 5.144 3.7e-06 ***
## weight_loss 0.03591 0.21771 0.165 0.870
## TreatmentDR -5.52370 4.36111 -1.267 0.211
## TreatmentDR.IGF1 1.13593 5.18537 0.219 0.827
## TreatmentDR.IGF2 -9.61449 6.61079 -1.454 0.152
## weight_loss:TreatmentDR 0.14270 0.24926 0.572 0.569
## weight_loss:TreatmentDR.IGF1 -0.36936 0.28830 -1.281 0.206
## weight_loss:TreatmentDR.IGF2 0.38573 0.33340 1.157 0.252
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.379 on 55 degrees of freedom
## (13 observations deleted due to missingness)
## Multiple R-squared: 0.2204, Adjusted R-squared: 0.1212
## F-statistic: 2.222 on 7 and 55 DF, p-value: 0.04612
anova(model_endpoint_tradeoff)
## Analysis of Variance Table
##
## Response: final_regeneration
## Df Sum Sq Mean Sq F value Pr(>F)
## weight_loss 1 14.82 14.821 0.3642 0.54868
## Treatment 3 320.43 106.809 2.6245 0.05954 .
## weight_loss:Treatment 3 297.71 99.238 2.4385 0.07418 .
## Residuals 55 2238.30 40.696
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
This endpoint analysis is retained because it demonstrates that the
longitudinal mixed-effects model is more sensitive to changes in
regenerative dynamics than a single final-time-point comparison.
8.4 Final percent body-mass loss among treatment groups
final_weight_loss <- data %>%
ungroup() %>%
group_by(Animal_ID) %>%
summarise(
final_weight_loss = max(Perc.WeightLoss, na.rm = TRUE),
Treatment = first(na.omit(Treatment)),
.groups = "drop"
) %>%
filter(
!is.na(final_weight_loss),
is.finite(final_weight_loss),
!is.na(Treatment)
) %>%
mutate(
Treatment = droplevels(as.factor(Treatment))
)
model_final_weight_loss <- lm(
final_weight_loss ~ Treatment,
data = final_weight_loss
)
anova(model_final_weight_loss)
## Analysis of Variance Table
##
## Response: final_weight_loss
## Df Sum Sq Mean Sq F value Pr(>F)
## Treatment 3 602.9 200.972 2.953 0.03951 *
## Residuals 61 4151.5 68.057
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
final_weight_loss_emmeans <- emmeans(
model_final_weight_loss,
pairwise ~ Treatment,
adjust = "tukey"
)
final_weight_loss_emmeans
## $emmeans
## Treatment emmean SE df lower.CL upper.CL
## AdLib 17.9 1.94 61 14.0 21.7
## DR 25.6 2.29 61 21.0 30.2
## DR.IGF1 23.1 2.00 61 19.1 27.1
## DR.IGF2 24.7 2.00 61 20.7 28.7
##
## Confidence level used: 0.95
##
## $contrasts
## contrast estimate SE df t.ratio p.value
## AdLib - DR -7.765 3.00 61 -2.586 0.0571
## AdLib - DR.IGF1 -5.257 2.79 61 -1.884 0.2456
## AdLib - DR.IGF2 -6.841 2.79 61 -2.452 0.0781
## DR - DR.IGF1 2.508 3.04 61 0.825 0.8423
## DR - DR.IGF2 0.924 3.04 61 0.304 0.9901
## DR.IGF1 - DR.IGF2 -1.584 2.83 61 -0.560 0.9435
##
## P value adjustment: tukey method for comparing a family of 4 estimates
Manuscript interpretation: Final percent body-mass
loss did not differ among the three diet-restricted groups, supporting
the conclusion that the IGF2 rescue effect was not explained by reduced
energetic deficit.
ggplot(
final_weight_loss,
aes(
x = Treatment,
y = final_weight_loss,
fill = Treatment
)
) +
geom_violin(alpha = 0.3, trim = FALSE) +
geom_jitter(width = 0.1, alpha = 0.7, size = 2) +
stat_summary(
fun = mean,
geom = "point",
size = 4,
color = "black"
) +
stat_summary(
fun.data = mean_cl_normal,
geom = "errorbar",
width = 0.15,
color = "black"
) +
scale_fill_manual(values = treatment_colors) +
labs(
x = "Treatment",
y = "Final percent body-mass loss"
) +
theme_classic() +
theme(legend.position = "none")

9. Evaluation of Weeks 5–8
9.1 Visual inspection of individual regeneration trajectories
regeneration_raw <- read.csv(
"R.analysis.currated.csv",
stringsAsFactors = FALSE
)
regeneration_after_week_2 <- regeneration_raw %>%
filter(Week > 2)
plot_length_loss_all <- ggplot(
regeneration_raw,
aes(
x = Week,
y = Regeneration,
color = Animal_ID,
group = Animal_ID
)
) +
geom_line() +
geom_text(
aes(label = Animal_ID),
hjust = 0,
vjust = 0,
size = 2
) +
facet_wrap(
~Treatment,
scales = "free",
ncol = 2
) +
theme(legend.position = "none")
plot_length_loss_late <- ggplot(
regeneration_after_week_2,
aes(
x = Week,
y = Regeneration,
color = Animal_ID,
group = Animal_ID
)
) +
geom_line() +
geom_text(
aes(label = Animal_ID),
hjust = 0,
vjust = 0,
size = 2
) +
facet_wrap(
~Treatment,
scales = "free",
ncol = 2
) +
theme(legend.position = "none")
plot_length_loss_all

plot_length_loss_late

ggsave(
filename = "length_loss.png",
plot = plot_length_loss_all,
width = 8,
height = 8,
dpi = 600
)
ggsave(
filename = "length_loss_sub.png",
plot = plot_length_loss_late,
width = 8,
height = 8,
dpi = 600
)
9.2 Early-only versus full eight-week model
model_early <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss * IGF_type +
Tail +
(1 | Animal_ID),
data = data %>%
filter(Week <= 4)
)
model_full <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss * IGF_type +
Tail +
(1 | Animal_ID),
data = data
)
summary(model_early)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * IGF_type + Tail +
## (1 | Animal_ID)
## Data: data %>% filter(Week <= 4)
##
## REML criterion at convergence: 1398.1
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.3603 -0.6766 0.0364 0.5755 3.6846
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 2.109 1.452
## Residual 13.084 3.617
## Number of obs: 250, groups: Animal_ID, 65
##
## Fixed effects:
## Estimate Std. Error df t value
## (Intercept) -1.03249 3.28353 88.26216 -0.314
## Week 6.51706 0.61407 214.47588 10.613
## Perc.WeightLoss 0.13154 0.07686 203.94379 1.711
## IGF_typeIGF1 5.00021 3.16573 232.96815 1.579
## IGF_typeIGF2 2.41231 4.08500 229.06413 0.591
## Tail -0.12144 0.04048 63.90994 -3.000
## Week:Perc.WeightLoss -0.04154 0.03320 216.92163 -1.251
## Week:IGF_typeIGF1 -2.72621 1.30759 221.65809 -2.085
## Week:IGF_typeIGF2 -2.28603 1.51661 194.62876 -1.507
## Perc.WeightLoss:IGF_typeIGF1 -0.17276 0.16381 230.81261 -1.055
## Perc.WeightLoss:IGF_typeIGF2 -0.04365 0.19071 228.74930 -0.229
## Week:Perc.WeightLoss:IGF_typeIGF1 0.08865 0.07167 232.22843 1.237
## Week:Perc.WeightLoss:IGF_typeIGF2 0.06108 0.07022 197.01077 0.870
## Pr(>|t|)
## (Intercept) 0.75393
## Week < 2e-16 ***
## Perc.WeightLoss 0.08852 .
## IGF_typeIGF1 0.11558
## IGF_typeIGF2 0.55542
## Tail 0.00385 **
## Week:Perc.WeightLoss 0.21227
## Week:IGF_typeIGF1 0.03822 *
## Week:IGF_typeIGF2 0.13335
## Perc.WeightLoss:IGF_typeIGF1 0.29270
## Perc.WeightLoss:IGF_typeIGF2 0.81917
## Week:Perc.WeightLoss:IGF_typeIGF1 0.21739
## Week:Perc.WeightLoss:IGF_typeIGF2 0.38547
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(model_full)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * IGF_type + Tail +
## (1 | Animal_ID)
## Data: data
##
## REML criterion at convergence: 2717.5
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.05240 -0.58328 0.07647 0.53288 3.14152
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 15.52 3.940
## Residual 19.87 4.457
## Number of obs: 443, groups: Animal_ID, 65
##
## Fixed effects:
## Estimate Std. Error df t value
## (Intercept) 8.95632 5.37444 66.82767 1.666
## Week 5.57153 0.22507 390.98913 24.755
## Perc.WeightLoss 0.16173 0.06336 418.47176 2.553
## IGF_typeIGF1 6.23221 2.90106 308.60824 2.148
## IGF_typeIGF2 4.86116 3.88987 361.49614 1.250
## Tail -0.22402 0.07251 66.89851 -3.090
## Week:Perc.WeightLoss -0.05150 0.01184 388.69919 -4.350
## Week:IGF_typeIGF1 -1.60695 0.50288 411.98772 -3.196
## Week:IGF_typeIGF2 -2.61979 0.61694 399.53650 -4.246
## Perc.WeightLoss:IGF_typeIGF1 -0.25717 0.14183 423.73347 -1.813
## Perc.WeightLoss:IGF_typeIGF2 -0.23525 0.17665 422.61347 -1.332
## Week:Perc.WeightLoss:IGF_typeIGF1 0.03935 0.02919 424.77894 1.348
## Week:Perc.WeightLoss:IGF_typeIGF2 0.11330 0.02987 393.97138 3.793
## Pr(>|t|)
## (Intercept) 0.100302
## Week < 2e-16 ***
## Perc.WeightLoss 0.011041 *
## IGF_typeIGF1 0.032472 *
## IGF_typeIGF2 0.212219
## Tail 0.002919 **
## Week:Perc.WeightLoss 1.74e-05 ***
## Week:IGF_typeIGF1 0.001503 **
## Week:IGF_typeIGF2 2.70e-05 ***
## Perc.WeightLoss:IGF_typeIGF1 0.070503 .
## Perc.WeightLoss:IGF_typeIGF2 0.183676
## Week:Perc.WeightLoss:IGF_typeIGF1 0.178340
## Week:Perc.WeightLoss:IGF_typeIGF2 0.000172 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Reported comparison:
- Weeks 1–4: IGF2 interaction \(\beta=0.088\), \(p=0.213\)
- Weeks 1–8: IGF2 interaction \(\beta=0.114\), \(p=0.000138\)
9.3 Within-individual repeatability
icc(model_full)
## # Intraclass Correlation Coefficient
##
## Adjusted ICC: 0.439
## Unadjusted ICC: 0.114
Reported result: Adjusted ICC approximately 0.47,
indicating moderate within-individual repeatability across the full
eight-week dataset.
9.4 Residual variation across weeks
full_model_residual_data <- model.frame(model_full) %>%
mutate(
residual = residuals(model_full),
absolute_residual = abs(residual)
)
model_absolute_residuals <- lm(
absolute_residual ~ factor(Week),
data = full_model_residual_data
)
anova(model_absolute_residuals)
## Analysis of Variance Table
##
## Response: absolute_residual
## Df Sum Sq Mean Sq F value Pr(>F)
## factor(Week) 7 279.36 39.909 6.1601 6.937e-07 ***
## Residuals 435 2818.18 6.479
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
9.5 Late-stage bootstrap
late_data <- data %>%
filter(Week >= 5)
model_late <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss * IGF_type +
Tail +
(1 | Animal_ID),
data = late_data
)
late_boot_function <- function(fit) {
fixef(fit)["Week:Perc.WeightLoss:IGF_typeIGF2"]
}
bootstrap_late <- bootMer(
model_late,
FUN = late_boot_function,
nsim = 1000
)
late_bootstrap_interval <- quantile(
bootstrap_late$t,
c(0.025, 0.5, 0.975),
na.rm = TRUE
)
late_bootstrap_interval
## 2.5% 50% 97.5%
## 0.07039122 0.15367184 0.23979299
Reported result: Median \(=0.142\), 95% bootstrap interval \(=0.051\) to \(0.231\).
10. Evaluation of Original Tail Length as a Covariate
Models are fitted with maximum likelihood for valid AIC
comparison.
model_rescue_without_tail <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss * IGF_type +
(1 | Animal_ID),
data = data,
REML = FALSE
)
model_rescue_with_tail <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss * IGF_type +
Tail +
(1 | Animal_ID),
data = data,
REML = FALSE
)
AIC(
model_rescue_without_tail,
model_rescue_with_tail
)
## df AIC
## model_rescue_without_tail 14 2723.345
## model_rescue_with_tail 15 2715.726
summary(model_rescue_with_tail)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * IGF_type + Tail +
## (1 | Animal_ID)
## Data: data
##
## AIC BIC logLik -2*log(L) df.resid
## 2715.7 2777.1 -1342.9 2685.7 428
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.0681 -0.5929 0.0779 0.5390 3.1805
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 14.17 3.764
## Residual 19.44 4.409
## Number of obs: 443, groups: Animal_ID, 65
##
## Fixed effects:
## Estimate Std. Error df t value
## (Intercept) 8.95617 5.17142 72.03897 1.732
## Week 5.57428 0.22248 400.21150 25.056
## Perc.WeightLoss 0.16235 0.06253 429.96459 2.596
## IGF_typeIGF1 6.18235 2.84050 331.02943 2.177
## IGF_typeIGF2 4.88263 3.81574 378.73717 1.280
## Tail -0.22414 0.06977 72.01932 -3.213
## Week:Perc.WeightLoss -0.05169 0.01170 397.72469 -4.417
## Week:IGF_typeIGF1 -1.60184 0.49654 422.19869 -3.226
## Week:IGF_typeIGF2 -2.62240 0.60958 409.23309 -4.302
## Perc.WeightLoss:IGF_typeIGF1 -0.25435 0.13957 438.29668 -1.822
## Perc.WeightLoss:IGF_typeIGF2 -0.23644 0.17381 436.11440 -1.360
## Week:Perc.WeightLoss:IGF_typeIGF1 0.03902 0.02879 436.27083 1.355
## Week:Perc.WeightLoss:IGF_typeIGF2 0.11350 0.02952 403.28249 3.844
## Pr(>|t|)
## (Intercept) 0.08758 .
## Week < 2e-16 ***
## Perc.WeightLoss 0.00974 **
## IGF_typeIGF1 0.03022 *
## IGF_typeIGF2 0.20147
## Tail 0.00197 **
## Week:Perc.WeightLoss 1.29e-05 ***
## Week:IGF_typeIGF1 0.00135 **
## Week:IGF_typeIGF2 2.12e-05 ***
## Perc.WeightLoss:IGF_typeIGF1 0.06908 .
## Perc.WeightLoss:IGF_typeIGF2 0.17443
## Week:Perc.WeightLoss:IGF_typeIGF1 0.17609
## Week:Perc.WeightLoss:IGF_typeIGF2 0.00014 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(model_rescue_with_tail)
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## Week 5341.3 5341.3 1 415.87 274.7259 < 2.2e-16
## Perc.WeightLoss 0.0 0.0 1 433.80 0.0003 0.9860797
## IGF_type 108.4 54.2 2 356.60 2.7887 0.0628429
## Tail 200.7 200.7 1 72.02 10.3213 0.0019675
## Week:Perc.WeightLoss 0.1 0.1 1 424.05 0.0042 0.9484235
## Week:IGF_type 487.0 243.5 2 415.99 12.5230 5.233e-06
## Perc.WeightLoss:IGF_type 87.2 43.6 2 436.27 2.2438 0.1072814
## Week:Perc.WeightLoss:IGF_type 298.2 149.1 2 422.81 7.6681 0.0005355
##
## Week ***
## Perc.WeightLoss
## IGF_type .
## Tail **
## Week:Perc.WeightLoss
## Week:IGF_type ***
## Perc.WeightLoss:IGF_type
## Week:Perc.WeightLoss:IGF_type ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Reported result: Inclusion of original tail length
improved model fit by \(\Delta
AIC=6.9\), so Tail was retained as an additive covariate in the
primary rescue model.
11. Publication Figures
11.1 Figure 1: dietary restriction and the energetic trade-off
figure1_weight_data <- diet_final_acclimation %>%
mutate(
Diet_display = case_when(
Treatment == "AdLib" ~ "High",
Treatment %in% c("DR", "DR.IGF1", "DR.IGF2") ~ "Low",
TRUE ~ NA_character_
),
Diet_display = factor(
Diet_display,
levels = c("High", "Low")
)
)
figure1_regeneration_data <- data %>%
mutate(
Diet_display = case_when(
Treatment == "AdLib" ~ "High",
Treatment %in% c("DR", "DR.IGF1", "DR.IGF2") ~ "Low",
TRUE ~ NA_character_
),
Diet_display = factor(
Diet_display,
levels = c("High", "Low")
)
)
panel_1a <- ggplot(
figure1_weight_data,
aes(x = Diet_display, y = Perc_Orig)
) +
geom_violin(
fill = "grey75",
color = "black",
trim = FALSE,
scale = "width",
alpha = 0.8
) +
geom_boxplot(
width = 0.12,
outlier.shape = NA,
fill = "white",
color = "black"
) +
geom_jitter(
width = 0.08,
size = 1.8,
shape = 21,
fill = "white",
color = "black",
alpha = 0.8
) +
labs(
title = "Dietary restriction increased weight loss",
x = "Diet",
y = "Percent of original body mass"
) +
theme_classic(base_size = 12) +
theme(
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text = element_text(face = "bold")
)
panel_1b <- ggplot(
figure1_regeneration_data,
aes(
x = Week,
y = Perc.Regeneration,
shape = Diet_display,
linetype = Diet_display,
group = Diet_display
)
) +
stat_summary(
fun = mean,
geom = "line",
linewidth = 1.2,
color = "black"
) +
stat_summary(
fun = mean,
geom = "point",
size = 3,
color = "black"
) +
stat_summary(
fun.data = mean_se,
geom = "errorbar",
width = 0.15,
color = "black"
) +
scale_shape_manual(
values = c("High" = 16, "Low" = 17)
) +
scale_linetype_manual(
values = c("High" = "solid", "Low" = "dashed")
) +
labs(
title = "Dietary restriction reduced regeneration",
x = "Week",
y = "Percent regeneration",
shape = "Diet",
linetype = "Diet"
) +
theme_classic(base_size = 12) +
theme(
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text = element_text(face = "bold"),
legend.position = "bottom"
)
tradeoff_no_igf <- data %>%
filter(IGF_type == "No_IGF")
model_tradeoff_no_igf <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss +
(1 | Animal_ID),
data = tradeoff_no_igf
)
tradeoff_slopes <- emtrends(
model_tradeoff_no_igf,
~ Week,
var = "Perc.WeightLoss",
at = list(Week = c(2, 4, 6, 8))
)
tradeoff_slopes_df <- as.data.frame(
summary(tradeoff_slopes, infer = TRUE)
) %>%
mutate(
sig_zero = case_when(
p.value < 0.001 ~ "***",
p.value < 0.01 ~ "**",
p.value < 0.05 ~ "*",
p.value < 0.10 ~ "†",
TRUE ~ ""
)
)
panel_1c <- ggplot(
tradeoff_slopes_df,
aes(
x = Week,
y = Perc.WeightLoss.trend
)
) +
geom_hline(
yintercept = 0,
linetype = "dashed",
color = "black",
linewidth = 0.7
) +
geom_errorbar(
aes(ymin = lower.CL, ymax = upper.CL),
width = 0.18,
linewidth = 0.8,
color = "grey30"
) +
geom_point(
size = 4.5,
color = "grey30"
) +
geom_text(
aes(
y = lower.CL - 0.035,
label = sig_zero
),
size = 5,
fontface = "bold",
color = "grey30"
) +
scale_x_continuous(
breaks = c(2, 4, 6, 8)
) +
scale_y_continuous(
breaks = seq(-0.4, 0.1, by = 0.1),
limits = c(-0.43, 0.15),
labels = scales::number_format(accuracy = 0.1),
expand = expansion(mult = c(0.04, 0.05))
) +
labs(
title = "Energetic trade-off strengthened over time",
subtitle = "Change in regeneration per 1% increase in weight loss",
x = "Week",
y = "Slope of Regeneration\nvs. Weight Loss"
) +
theme_classic(base_size = 14) +
theme(
plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(face = "bold", size = 12),
axis.title = element_text(face = "bold", size = 13),
axis.text = element_text(face = "bold", size = 12),
axis.title.y = element_text(margin = margin(r = 10))
)
figure_1 <- (panel_1a + panel_1b) / panel_1c +
plot_layout(heights = c(1, 0.9)) +
plot_annotation(
title = "Dietary Restriction Establishes an Energetic Trade-Off",
tag_levels = "A"
) &
theme(
plot.tag = element_text(face = "bold", size = 20)
)
figure_1

ggsave(
filename = "dietary_restriction_tradeoff_multiplot.png",
plot = figure_1,
width = 10,
height = 7,
dpi = 600
)
11.3 Regeneration and body-mass-loss trajectories
plot_regeneration_trajectories <- ggplot(
data,
aes(
x = Week,
y = Perc.Regeneration,
color = Treatment,
group = Treatment
)
) +
stat_summary(fun = mean, geom = "line", linewidth = 1.2) +
stat_summary(fun = mean, geom = "point", size = 2.8) +
stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.15) +
scale_color_manual(
values = treatment_colors,
labels = c(
"AdLib" = "AdLib",
"DR" = "DR",
"DR.IGF1" = "DR + IGF1",
"DR.IGF2" = "DR + IGF2"
)
) +
labs(
title = "Regeneration diverged among treatments",
x = "Week",
y = "Percent regeneration",
color = "Treatment"
) +
theme_classic(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text = element_text(face = "bold"),
legend.position = "bottom"
)
plot_weightloss_trajectories <- ggplot(
data,
aes(
x = Week,
y = Perc.WeightLoss,
color = Treatment,
group = Treatment
)
) +
stat_summary(fun = mean, geom = "line", linewidth = 1.2) +
stat_summary(fun = mean, geom = "point", size = 2.8) +
stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.15) +
scale_color_manual(
values = treatment_colors,
labels = c(
"AdLib" = "AdLib",
"DR" = "DR",
"DR.IGF1" = "DR + IGF1",
"DR.IGF2" = "DR + IGF2"
)
) +
labs(
title = "Weight loss did not separate similarly",
x = "Week",
y = "Percent weight loss",
color = "Treatment"
) +
theme_classic(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text = element_text(face = "bold"),
legend.position = "bottom"
)
combined_regeneration_weightloss <- (
plot_regeneration_trajectories /
plot_weightloss_trajectories
) +
plot_layout(guides = "collect") +
plot_annotation(
title = "IGF2 altered regeneration without broadly reducing energetic deficit"
) &
theme(
legend.position = "bottom",
plot.title = element_text(face = "bold")
)
combined_regeneration_weightloss

11.4 Restricted-group biology figure
restricted_data <- data %>%
filter(
Treatment %in% c("DR", "DR.IGF1", "DR.IGF2")
) %>%
mutate(
Treatment = factor(
Treatment,
levels = c("DR", "DR.IGF1", "DR.IGF2")
)
)
model_restricted_rescue <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss * Treatment +
(1 | Animal_ID),
data = restricted_data
)
restricted_slopes <- emtrends(
model_restricted_rescue,
~ Treatment | Week,
var = "Perc.WeightLoss",
at = list(Week = c(2, 4, 6, 8))
)
restricted_slopes_df <- as.data.frame(
summary(restricted_slopes, infer = TRUE)
)
restricted_colors <- c(
"DR" = "grey40",
"DR.IGF1" = "#E87722",
"DR.IGF2" = "#0C2340"
)
restricted_labels <- c(
"DR" = "DR",
"DR.IGF1" = "DR + IGF1",
"DR.IGF2" = "DR + IGF2"
)
restricted_panel_a <- ggplot(
restricted_slopes_df,
aes(
x = Week,
y = Perc.WeightLoss.trend,
color = Treatment,
group = Treatment
)
) +
geom_hline(yintercept = 0, linetype = "dashed") +
geom_errorbar(
aes(ymin = lower.CL, ymax = upper.CL),
width = 0.15,
position = position_dodge(width = 0.25)
) +
geom_point(
size = 3.5,
position = position_dodge(width = 0.25)
) +
geom_line(
linewidth = 1,
position = position_dodge(width = 0.25)
) +
scale_color_manual(
values = restricted_colors,
labels = restricted_labels,
name = "Treatment"
) +
labs(
title = "IGF2 changed the regeneration response to weight loss",
x = "Week",
y = "Change in regeneration per 1% weight loss"
) +
theme_classic(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text = element_text(face = "bold"),
legend.position = "bottom"
)
restricted_final_weight_loss <- final_weight_loss %>%
filter(
Treatment %in% c("DR", "DR.IGF1", "DR.IGF2")
) %>%
mutate(
Treatment = factor(
Treatment,
levels = c("DR", "DR.IGF1", "DR.IGF2")
)
)
restricted_panel_b <- ggplot(
restricted_final_weight_loss,
aes(
x = Treatment,
y = final_weight_loss,
fill = Treatment
)
) +
geom_violin(trim = FALSE, alpha = 0.25, color = NA) +
geom_jitter(width = 0.08, alpha = 0.6, size = 1.8) +
stat_summary(
fun = mean,
geom = "point",
size = 3.5,
color = "black"
) +
stat_summary(
fun.data = mean_cl_normal,
geom = "errorbar",
width = 0.15,
color = "black"
) +
scale_fill_manual(
values = restricted_colors,
labels = restricted_labels,
name = "Treatment"
) +
scale_x_discrete(labels = restricted_labels) +
labs(
title = "IGF2 did not reduce body mass loss",
x = "Treatment",
y = "Final percent body-mass loss"
) +
theme_classic(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text = element_text(face = "bold"),
legend.position = "none"
)
restricted_biology_figure <- (
restricted_panel_a |
restricted_panel_b
) +
plot_layout(widths = c(1.5, 1)) +
plot_annotation(
title = "IGF2 altered regeneration biology without reducing energetic deficit",
tag_levels = "A"
) &
theme(
plot.title = element_text(face = "bold"),
plot.tag = element_text(face = "bold", size = 16)
)
restricted_biology_figure
