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 the association between
energetic state and cumulative tail regeneration changes as regeneration
proceeds.
Approach: Cumulative percent regeneration is modeled
as a function of Week, concurrent percent body-mass loss, and their
interaction, with Animal ID included as a random intercept to account
for repeated measurements within individuals. Week-specific slopes are
estimated with emtrends. Original tail length is not
included because percent regeneration already standardizes regenerated
length by original tail length.
Result/Decision: Regeneration increased strongly
across the regeneration period (Week: F = 616.35, p < 0.001). There
was a significant Week × percent-body-mass-loss interaction (F = 8.62, p
= 0.0035), indicating that the concurrent association between body-mass
loss and regeneration became increasingly negative over time.
Week-specific slopes were not different from zero early in regeneration,
but became negative later in the experiment (Week 5: p = 0.067; Week 6:
p = 0.018; Week 7: p = 0.007; Week 8: p = 0.004). Thus, greater
concurrent body-mass loss was increasingly associated with less
cumulative regeneration as regeneration progressed. These week-specific
slopes are post hoc estimates from the mixed-effects model and are
interpreted in the context of the significant overall interaction.
model_concurrent <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss +
(1 | 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 + (1 | Animal_ID)
## Data: data
##
## REML criterion at convergence: 2757.1
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.1363 -0.5645 0.0654 0.5852 3.3258
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 19.48 4.413
## Residual 21.78 4.667
## Number of obs: 443, groups: Animal_ID, 65
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) -6.08540 1.15957 334.26606 -5.248 2.74e-07 ***
## Week 4.83752 0.19485 396.43142 24.826 < 2e-16 ***
## Perc.WeightLoss 0.07982 0.05441 436.76074 1.467 0.14307
## Week:Perc.WeightLoss -0.03008 0.01024 400.75894 -2.936 0.00352 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL
## Week -0.669
## Prc.WghtLss -0.780 0.631
## Wk:Prc.WghL 0.564 -0.848 -0.741
lme4::isSingular(
model_concurrent,
tol = 1e-4
)
## [1] FALSE
lme4::VarCorr(model_concurrent)
## Groups Name Std.Dev.
## Animal_ID (Intercept) 4.4131
## Residual 4.6666
anova(
model_concurrent,
type = 3
)
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)
)
concurrent_slopes_df
IGF modification of the concurrent association
Purpose: Test whether IGF1 or IGF2 modifies the
relationship between concurrent energetic state and regeneration.
Approach: Only Restricted + Vehicle, Restricted +
IGF1, and Restricted + IGF2 animals are included. Cumulative percent
regeneration is modeled as a function of Week, concurrent percent
body-mass loss, supplementation, and their interactions, with Animal ID
included as a random intercept. Week-specific energetic-state slopes and
Tukey-adjusted pairwise contrasts are estimated directly from the fitted
mixed-effects model.
Result/Decision: The Week × percent-body-mass-loss ×
supplementation interaction tests whether supplementation modifies the
energetic-state/regeneration relationship across the regeneration
period.
model_concurrent_igf <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss * Supplementation +
(1 | 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 +
## (1 | Animal_ID)
## Data: igf_data
##
## REML criterion at convergence: 1974
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.8891 -0.5492 0.1063 0.5239 3.6505
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 18.93 4.351
## Residual 18.99 4.357
## Number of obs: 323, groups: Animal_ID, 47
##
## Fixed effects:
## Estimate Std. Error df
## (Intercept) -4.018033 2.478763 242.557024
## Week 4.338052 0.539645 290.716386
## Perc.WeightLoss -0.004628 0.105606 303.849755
## SupplementationIGF1 1.599782 3.564679 232.026387
## SupplementationIGF2 0.309570 4.415799 265.914483
## Week:Perc.WeightLoss -0.013992 0.023589 288.557548
## Week:SupplementationIGF1 -0.390114 0.698146 294.599968
## Week:SupplementationIGF2 -1.394936 0.780520 289.217760
## Perc.WeightLoss:SupplementationIGF1 -0.090226 0.164689 310.266636
## Perc.WeightLoss:SupplementationIGF2 -0.072661 0.195468 310.579911
## Week:Perc.WeightLoss:SupplementationIGF1 0.002789 0.035394 302.088587
## Week:Perc.WeightLoss:SupplementationIGF2 0.076005 0.035776 285.943832
## t value Pr(>|t|)
## (Intercept) -1.621 0.1063
## Week 8.039 2.3e-14 ***
## Perc.WeightLoss -0.044 0.9651
## SupplementationIGF1 0.449 0.6540
## SupplementationIGF2 0.070 0.9442
## Week:Perc.WeightLoss -0.593 0.5535
## Week:SupplementationIGF1 -0.559 0.5767
## Week:SupplementationIGF2 -1.787 0.0750 .
## Perc.WeightLoss:SupplementationIGF1 -0.548 0.5842
## Perc.WeightLoss:SupplementationIGF2 -0.372 0.7103
## Week:Perc.WeightLoss:SupplementationIGF1 0.079 0.9372
## Week:Perc.WeightLoss:SupplementationIGF2 2.124 0.0345 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL SpIGF1 SpIGF2 Wk:P.WL W:SIGF1 W:SIGF2
## Week -0.591
## Prc.WghtLss -0.776 0.535
## SpplmntIGF1 -0.695 0.411 0.539
## SpplmntIGF2 -0.561 0.332 0.435 0.390
## Wk:Prc.WghL 0.558 -0.909 -0.675 -0.388 -0.313
## Wk:SpplIGF1 0.457 -0.773 -0.413 -0.644 -0.256 0.703
## Wk:SpplIGF2 0.409 -0.691 -0.370 -0.284 -0.695 0.629 0.534
## Pr.WL:SIGF1 0.497 -0.343 -0.641 -0.810 -0.279 0.433 0.617 0.237
## Pr.WL:SIGF2 0.419 -0.289 -0.540 -0.291 -0.881 0.365 0.223 0.679
## W:P.WL:SIGF1 -0.372 0.606 0.450 0.599 0.209 -0.666 -0.894 -0.419
## W:P.WL:SIGF2 -0.368 0.599 0.445 0.256 0.655 -0.659 -0.463 -0.928
## P.WL:SIGF1 P.WL:SIGF2 W:P.WL:SIGF1
## Week
## Prc.WghtLss
## SpplmntIGF1
## SpplmntIGF2
## Wk:Prc.WghL
## Wk:SpplIGF1
## Wk:SpplIGF2
## Pr.WL:SIGF1
## Pr.WL:SIGF2 0.346
## W:P.WL:SIGF1 -0.736 -0.243
## W:P.WL:SIGF2 -0.285 -0.747 0.439
lme4::isSingular(
model_concurrent_igf,
tol = 1e-4
)
## [1] FALSE
lme4::VarCorr(model_concurrent_igf)
## Groups Name Std.Dev.
## Animal_ID (Intercept) 4.3510
## Residual 4.3574
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
# Pull IGF2 vs Vehicle contrasts and create significance labels
igf2_vehicle_sig <- concurrent_igf_contrasts_df %>%
filter(
grepl("Vehicle - IGF2|IGF2 - Vehicle", contrast)
) %>%
mutate(
sig = case_when(
p.value < 0.001 ~ "***",
p.value < 0.01 ~ "**",
p.value < 0.05 ~ "*",
p.value < 0.10 ~ "†",
TRUE ~ ""
)
)
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.
| Dietary manipulation |
Diet |
13.85 |
1 |
67.00 |
<0.001 |
| Concurrent energetic state |
Week × percent body-mass loss |
8.62 |
1 |
400.76 |
0.004 |
| IGF modification of concurrent association |
Week × percent body-mass loss × supplementation |
2.71 |
2 |
296.06 |
0.068 |
Tukey-adjusted pairwise contrasts of concurrent energetic-state
slopes among supplementation groups by week.
| 1 |
Vehicle - IGF1 |
0.087 |
0.141 |
307.3 |
0.810 |
| 1 |
Vehicle - IGF2 |
-0.003 |
0.172 |
305.9 |
1.000 |
| 1 |
IGF1 - IGF2 |
-0.091 |
0.181 |
296.2 |
0.870 |
| 2 |
Vehicle - IGF1 |
0.085 |
0.123 |
302.2 |
0.771 |
| 2 |
Vehicle - IGF2 |
-0.079 |
0.151 |
294.6 |
0.859 |
| 2 |
IGF1 - IGF2 |
-0.164 |
0.157 |
283.8 |
0.548 |
| 3 |
Vehicle - IGF1 |
0.082 |
0.113 |
299.4 |
0.751 |
| 3 |
Vehicle - IGF2 |
-0.155 |
0.137 |
280.5 |
0.494 |
| 3 |
IGF1 - IGF2 |
-0.237 |
0.139 |
272.0 |
0.204 |
| 4 |
Vehicle - IGF1 |
0.079 |
0.114 |
303.8 |
0.768 |
| 4 |
Vehicle - IGF2 |
-0.231 |
0.131 |
275.8 |
0.185 |
| 4 |
IGF1 - IGF2 |
-0.310 |
0.130 |
271.9 |
0.046 |
| 5 |
Vehicle - IGF1 |
0.076 |
0.126 |
309.6 |
0.816 |
| 5 |
Vehicle - IGF2 |
-0.307 |
0.135 |
286.6 |
0.062 |
| 5 |
IGF1 - IGF2 |
-0.384 |
0.132 |
288.0 |
0.011 |
| 6 |
Vehicle - IGF1 |
0.073 |
0.145 |
310.9 |
0.868 |
| 6 |
Vehicle - IGF2 |
-0.383 |
0.148 |
302.3 |
0.027 |
| 6 |
IGF1 - IGF2 |
-0.457 |
0.144 |
305.4 |
0.005 |
| 7 |
Vehicle - IGF1 |
0.071 |
0.170 |
309.2 |
0.909 |
| 7 |
Vehicle - IGF2 |
-0.459 |
0.168 |
310.3 |
0.018 |
| 7 |
IGF1 - IGF2 |
-0.530 |
0.164 |
311.0 |
0.004 |
| 8 |
Vehicle - IGF1 |
0.068 |
0.198 |
306.9 |
0.937 |
| 8 |
Vehicle - IGF2 |
-0.535 |
0.192 |
310.2 |
0.016 |
| 8 |
IGF1 - IGF2 |
-0.603 |
0.189 |
308.6 |
0.004 |
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, regeneration across the experiment, and the changing
concurrent association between body-mass loss and regeneration. The
energetic-state slope became progressively more negative across the
regeneration period, consistent with the significant Week ×
percent-body-mass-loss interaction (F = 8.62, p = 0.0035). The Week 6
popout illustrates the negative model-predicted relationship at a
representative later time point, when greater body-mass loss was
associated with less cumulative regeneration (slope = -0.101, p =
0.018). Symbols on the slope panel indicate whether each week-specific
slope differs from zero († p < 0.10, * p < 0.05, ** p < 0.01,
*** p < 0.001). 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) +
theme(
legend.position = "bottom"
) +
guides(
shape = guide_legend(nrow = 1),
linetype = guide_legend(nrow = 1)
)
concurrent_slopes_df <- as.data.frame(
summary(concurrent_slopes, infer = TRUE)
) %>%
mutate(
sig = case_when(
p.value < 0.001 ~ "***",
p.value < 0.01 ~ "**",
p.value < 0.05 ~ "*",
p.value < 0.10 ~ "†",
TRUE ~ ""
)
)
fig1c <- ggplot(
concurrent_slopes_df,
aes(
x = Week,
y = Perc.WeightLoss.trend
)
) +
annotate(
"rect",
xmin = 5.5,
xmax = 6.5,
ymin = -Inf,
ymax = Inf,
fill = "grey90",
alpha = 0.7
) +
geom_hline(
yintercept = 0,
linetype = "dashed",
linewidth = 0.5
) +
geom_errorbar(
aes(ymin = lower.CL, ymax = upper.CL),
width = 0.15,
linewidth = 0.6
) +
geom_point(
shape = 21,
fill = "grey50",
color = "grey30",
size = 3.5
) +
geom_text(
aes(
y = lower.CL - 0.035,
label = sig
),
fontface = "bold",
size = 4
) +
scale_x_continuous(
breaks = c(2, 4, 6, 8)
) +
labs(
title = "Energetic constraint strengthened over time",
subtitle = "Change in regeneration per 1% increase in body-mass loss",
x = "Week",
y = "Slope of regeneration\nvs. body-mass loss"
) +
theme_classic(base_size = 11) +
theme(
plot.title = element_text(
face = "bold",
size = 11,
hjust = 0
),
plot.subtitle = element_text(
size = 8.5,
hjust = 0
)
)
# ------------------------------------------------------------
# WEEK 6 POPOUT
# Raw observations + model-predicted concurrent relationship
# ------------------------------------------------------------
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, na.rm = TRUE),
max(week6$Perc.WeightLoss, na.rm = TRUE),
length.out = 100
)
)
week6_grid$Predicted <- predict(
model_concurrent,
newdata = week6_grid,
re.form = NA
)
fig1_week6 <- ggplot() +
geom_point(
data = week6,
aes(
x = Perc.WeightLoss,
y = Perc.Regeneration
),
shape = 21,
fill = "white",
color = "grey50",
size = 1.6,
stroke = 0.4,
alpha = 0.8
) +
geom_line(
data = week6_grid,
aes(
x = Perc.WeightLoss,
y = Predicted
),
color = "black",
linewidth = 0.9
) +
labs(
title = "Relationship at Week 6",
subtitle = "Model prediction with individual observations",
x = "Percent body-mass loss",
y = "Percent regeneration"
) +
theme_classic(base_size = 8) +
theme(
plot.background = element_rect(
fill = "grey90",
color = NA
),
panel.background = element_rect(
fill = "grey90",
color = NA
),
plot.title = element_text(
face = "bold",
size = 8
),
plot.subtitle = element_text(
size = 6.5
),
axis.title = element_text(size = 7),
axis.text = element_text(size = 6)
)
# Print each component in the RPubs document as well as exporting it below.
fig1a

fig1b

fig1c

fig1_week6

# Panels are exported separately below 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(
"Figure2_Concurrent_slopes.png",
fig1c,
width = 4.5, height = 3.2,
units = "in", dpi = 600, bg = "white"
)
ggsave(
"Figure2_Week6_popout.png",
fig1_week6,
width = 2.4, height = 2.6,
units = "in", dpi = 600, bg = "grey90"
)
Figure 3: IGF modification of the concurrent relationship
Purpose: Visualize whether supplementation modifies
the concurrent energetic-state/regeneration association.
Approach: Week-specific slopes are estimated
directly from the random-intercept IGF mixed model. The established
Vehicle, IGF1, and IGF2 colors and point/error-bar style are
retained.
Result/Decision: Figure 3 is interpreted using the
three-way interaction and Tukey-adjusted pairwise slope contrasts from
the mixed model. A slope that differs from zero within a supplementation
group is not, by itself, evidence that the group differs from
Vehicle.
igf_colors <- c(
"Vehicle" = "grey40",
"IGF1" = "#E87722",
"IGF2" = "#0C2340"
)
fig3_slopes <- ggplot(
concurrent_igf_slopes_df,
aes(Week, Perc.WeightLoss.trend, color = Supplementation)
) +
annotate(
"rect",
xmin = 5.5,
xmax = 6.5,
ymin = -Inf,
ymax = Inf,
fill = "grey90",
alpha = 0.7
) +
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)) +
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"
) +
geom_text(
data = igf2_vehicle_sig %>%
filter(sig != "") %>%
left_join(
concurrent_igf_slopes_df %>%
filter(Supplementation == "IGF2") %>%
dplyr::select(
Week,
igf2_slope = Perc.WeightLoss.trend
),
by = "Week"
) %>%
mutate(
label_y = igf2_slope + 0.315
),
aes(
x = Week,
y = label_y,
label = sig
),
inherit.aes = FALSE,
size = 4,
fontface = "bold"
) +
theme_classic(base_size = 12) +
theme(legend.position = "bottom")
fig3_slopes

# ------------------------------------------------------------
# FIGURE 3 POPOUT
# Week 6 energetic-state relationship by supplementation
# ------------------------------------------------------------
week6_igf <- igf_data %>%
filter(
Week == 6,
!is.na(Perc.WeightLoss),
!is.na(Perc.Regeneration)
)
# Create prediction grid for each supplementation group
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
)
fig3_week6 <- ggplot() +
geom_point(
data = week6_igf,
aes(
x = Perc.WeightLoss,
y = Perc.Regeneration,
color = Supplementation
),
size = 2,
alpha = 0.65
) +
geom_line(
data = week6_igf_grid,
aes(
x = Perc.WeightLoss,
y = Predicted,
color = Supplementation
),
linewidth = 1.2
) +
scale_color_manual(values = igf_colors) +
labs(
title = "Relationship at Week 6",
x = "Percent body-mass loss",
y = "Percent regeneration",
color = "Supplementation"
) +
theme_classic(base_size = 11) +
theme(
plot.title = element_text(
face = "bold",
size = 11
),
legend.position = "none"
) +
theme(
plot.title = element_text(
face = "bold",
size = 11
),
legend.position = "none",
plot.background = element_rect(fill = "transparent", color = NA),
panel.background = element_rect(fill = "transparent", color = NA)
)
fig3_week6

# ============================================================
# ADDITIONAL IGF FIGURE PANELS
# ============================================================
# ------------------------------------------------------------
# A. CHANGE IN ENERGETIC-STATE SLOPE: WEEK 8 - WEEK 1
# ------------------------------------------------------------
# Pull the model-estimated slopes at Weeks 1 and 8
delta_slopes <- concurrent_igf_slopes_df %>%
filter(Week %in% c(1, 8)) %>%
dplyr::select(
Week,
Supplementation,
slope = Perc.WeightLoss.trend
) %>%
tidyr::pivot_wider(
names_from = Week,
values_from = slope,
names_prefix = "Week_"
) %>%
mutate(
delta_slope = Week_8 - Week_1
)
delta_slopes
fig3_delta <- ggplot(
delta_slopes,
aes(
x = Supplementation,
y = delta_slope,
fill = Supplementation
)
) +
geom_hline(
yintercept = 0,
linetype = "dashed",
linewidth = 0.5
) +
geom_col(
width = 0.65
) +
scale_fill_manual(
values = igf_colors
) +
labs(
x = "Supplementation",
y = expression(Delta*" slope")
) +
theme_classic(base_size = 12) +
theme(
legend.position = "none"
)
fig3_delta

# ------------------------------------------------------------
# B. BOOTSTRAP DISTRIBUTION OF CHANGE IN SLOPE
# Week 8 - Week 1
# ------------------------------------------------------------
set.seed(1234)
# Function applied to each parametric bootstrap replicate
boot_delta_fun <- function(fit) {
tr <- emmeans::emtrends(
fit,
~ Supplementation | Week,
var = "Perc.WeightLoss",
at = list(Week = c(1, 8))
)
tr_df <- as.data.frame(tr) %>%
dplyr::select(
Week,
Supplementation,
slope = Perc.WeightLoss.trend
) %>%
tidyr::pivot_wider(
names_from = Week,
values_from = slope,
names_prefix = "Week_"
) %>%
mutate(
delta_slope = Week_8 - Week_1
)
# Preserve the treatment order
tr_df <- tr_df %>%
mutate(
Supplementation = factor(
Supplementation,
levels = c("Vehicle", "IGF1", "IGF2")
)
) %>%
arrange(Supplementation)
tr_df$delta_slope
}
boot_delta <- lme4::bootMer(
model_concurrent_igf,
FUN = boot_delta_fun,
nsim = 1000,
type = "parametric",
use.u = FALSE,
seed = 1234
)
boot_delta_df <- as.data.frame(boot_delta$t)
names(boot_delta_df) <- c(
"Vehicle",
"IGF1",
"IGF2"
)
boot_delta_long <- boot_delta_df %>%
mutate(
bootstrap = dplyr::row_number()
) %>%
tidyr::pivot_longer(
cols = c(Vehicle, IGF1, IGF2),
names_to = "Supplementation",
values_to = "delta_slope"
) %>%
mutate(
Supplementation = factor(
Supplementation,
levels = c("Vehicle", "IGF1", "IGF2")
)
)
fig3_bootstrap <- ggplot(
boot_delta_long,
aes(
x = delta_slope,
fill = Supplementation,
color = Supplementation
)
) +
geom_density(
alpha = 0.65,
linewidth = 0.8
) +
geom_vline(
xintercept = 0,
linetype = "dashed",
linewidth = 0.5
) +
scale_fill_manual(
values = igf_colors
) +
scale_color_manual(
values = igf_colors
) +
labs(
x = expression(Delta*" slope (Week 8 - Week 1)"),
y = "Density"
) +
theme_classic(base_size = 12) +
theme(
legend.position = "none"
)
fig3_bootstrap

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"
)+
guides(
color = guide_legend(
nrow = 2,
byrow = TRUE
)
)
body_mass_plot

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)