Data import and preparation
Purpose: Import the pre-autotomy/diet dataset and
regeneration dataset and reconstruct the analysis groups used throughout
the paper.
Approach: The two analysis files are imported,
animals with substantial secondary tail loss are excluded, treatment
factors are reconstructed explicitly, and the restricted-diet IGF
dataset is created. The code also prints the weeks and sample counts
represented in each dataset.
Result/Decision: All later analyses use these
cleaned datasets and explicit group definitions. IGF comparisons use
Restricted + Vehicle, Restricted + IGF1, and Restricted + IGF2 so that
diet is held constant.
diet <- read.csv("WL.analysis.csv", stringsAsFactors=FALSE, check.names=FALSE)
data <- read.csv("R.analysis.currated.csv", stringsAsFactors=FALSE, check.names=FALSE)
names(diet) <- trimws(names(diet)); names(data) <- trimws(names(data))
# Animals experiencing substantial secondary tail loss were excluded entirely.
excluded_animals <- c("BC121", "BC144", "BC383", "BC561")
data <- data %>% filter(!Animal_ID %in% excluded_animals)
# Reconstruct analysis factors explicitly.
data <- data %>%
mutate(
Treatment=factor(Treatment, levels=c("AdLib","DR","DR.IGF1","DR.IGF2")),
Diet=case_when(Treatment=="AdLib" ~ "AdLib",
Treatment %in% c("DR","DR.IGF1","DR.IGF2") ~ "Restricted",
TRUE ~ NA_character_),
Diet=factor(Diet, levels=c("AdLib","Restricted")),
IGF_type=case_when(Treatment %in% c("AdLib","DR") ~ "No_IGF",
Treatment=="DR.IGF1" ~ "IGF1",
Treatment=="DR.IGF2" ~ "IGF2",
TRUE ~ NA_character_),
IGF_type=factor(IGF_type, levels=c("No_IGF","IGF1","IGF2"))
)
# IGF analyses: restricted-diet animals only.
igf_data <- data %>%
filter(Diet=="Restricted") %>%
mutate(
Supplementation=case_when(Treatment=="DR" ~ "Vehicle",
Treatment=="DR.IGF1" ~ "IGF1",
Treatment=="DR.IGF2" ~ "IGF2"),
Supplementation=factor(Supplementation, levels=c("Vehicle","IGF1","IGF2"))
)
str(data)
## 'data.frame': 608 obs. of 17 variables:
## $ Animal_ID : chr "BC039" "BC039" "BC039" "BC039" ...
## $ ToeClip : chr "1455" "1455" "1455" "1455" ...
## $ BC_Cage : int 32 32 32 32 32 32 32 32 28 28 ...
## $ Treatment : Factor w/ 4 levels "AdLib","DR","DR.IGF1",..: 3 3 3 3 3 3 3 3 1 1 ...
## $ Tail : num 73 73 73 73 73 73 73 73 69 69 ...
## $ SVL : int 46 46 46 46 46 46 46 46 48 48 ...
## $ Week : int 1 2 3 4 5 6 7 8 1 2 ...
## $ Mass : num 2.1 2.07 2.1 2.1 2.24 ...
## $ Dose : num 2.38 2.38 2.38 2.38 2.38 ...
## $ Perc.WeightLoss : num 18 19.3 18.2 18.2 12.7 ...
## $ Regeneration : num 0 0.15 6 11 16 20 22 24 0 0.1 ...
## $ Rate_Reg : num NA 0.15 5.85 5 5 4 2 2 NA 0.1 ...
## $ Rate_Perc : num NA 0.217 8.478 7.246 7.246 ...
## $ Perc.Regeneration: num 0 0.217 8.696 15.942 23.188 ...
## $ Eggs : int 0 1 0 0 0 0 0 0 0 0 ...
## $ Diet : Factor w/ 2 levels "AdLib","Restricted": 2 2 2 2 2 2 2 2 1 1 ...
## $ IGF_type : Factor w/ 3 levels "No_IGF","IGF1",..: 2 2 2 2 2 2 2 2 1 1 ...
table(data$Treatment, useNA="ifany")
##
## AdLib DR DR.IGF1 DR.IGF2
## 160 136 160 152
table(igf_data$Supplementation, useNA="ifany")
##
## Vehicle IGF1 IGF2
## 136 160 152
# Confirm which weeks are actually represented in each dataset.
sort(unique(diet$Week))
## [1] -4 -2 -1 0
sort(unique(data$Week))
## [1] 1 2 3 4 5 6 7 8
data %>% count(Week)
igf_data %>% count(Week)
Published Analyses
Analyses corresponding directly to the primary statistical tests
reported in the manuscript.
Baseline characteristics and dietary manipulation
Purpose: Determine whether animals were comparable
before the experiment and confirm that the feeding manipulation produced
the intended difference in energetic state.
Approach: All four randomized treatment groups are
compared for initial SVL, initial body mass, and original tail length.
Pre-autotomy percent mass lost is then compared between High Diet/AdLib
and Low Diet/Restricted animals.
Result/Decision: Initial size measures did not show
evidence of meaningful pre-existing treatment differences. The feeding
manipulation successfully altered energetic state: restricted females
lost significantly more body mass before autotomy than ad libitum-fed
females. Pre-autotomy percent mass loss is retained as the manipulation
check and prospective energetic-state measure.
pre_diet <- diet %>% filter(Week==-4)
diet_preautotomy <- diet %>% filter(Week==-1)
model_baseline_svl <- lm(SVL ~ Treatment, data=pre_diet)
model_baseline_mass <- lm(Mass ~ Treatment, data=pre_diet)
model_baseline_tail <- lm(Tail ~ Treatment, data=pre_diet)
anova(model_baseline_svl); summary(model_baseline_svl)
##
## Call:
## lm(formula = SVL ~ Treatment, data = pre_diet)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.900 -1.200 -0.200 1.100 4.706
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 45.9000 0.4218 108.816 <2e-16 ***
## TreatmentDR 0.3941 0.6223 0.633 0.529
## TreatmentDR.IGF1 0.3000 0.5965 0.503 0.617
## TreatmentDR.IGF2 0.8368 0.6043 1.385 0.170
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.886 on 72 degrees of freedom
## Multiple R-squared: 0.02653, Adjusted R-squared: -0.01403
## F-statistic: 0.6542 on 3 and 72 DF, p-value: 0.5829
anova(model_baseline_mass); summary(model_baseline_mass)
##
## Call:
## lm(formula = Mass ~ Treatment, data = pre_diet)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.8368 -0.3412 -0.0487 0.3016 1.2372
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.83280 0.10631 26.647 <2e-16 ***
## TreatmentDR 0.19896 0.15684 1.269 0.209
## TreatmentDR.IGF1 0.12180 0.15034 0.810 0.421
## TreatmentDR.IGF2 0.09694 0.15231 0.636 0.527
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4754 on 72 degrees of freedom
## Multiple R-squared: 0.02259, Adjusted R-squared: -0.01814
## F-statistic: 0.5547 on 3 and 72 DF, p-value: 0.6467
anova(model_baseline_tail); summary(model_baseline_tail)
##
## Call:
## lm(formula = Tail ~ Treatment, data = pre_diet)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19.000 -4.250 0.875 4.292 20.500
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 73.000 1.814 40.232 <2e-16 ***
## TreatmentDR 1.500 2.743 0.547 0.5864
## TreatmentDR.IGF1 5.250 2.566 2.046 0.0449 *
## TreatmentDR.IGF2 5.778 2.566 2.252 0.0278 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.698 on 64 degrees of freedom
## (8 observations deleted due to missingness)
## Multiple R-squared: 0.09969, Adjusted R-squared: 0.05749
## F-statistic: 2.362 on 3 and 64 DF, p-value: 0.0795
model_diet_loss <- lm(Perc_WL ~ Diet, data=diet_preautotomy)
anova(model_diet_loss); summary(model_diet_loss)
##
## Call:
## lm(formula = Perc_WL ~ Diet, data = diet_preautotomy)
##
## Residuals:
## Min 1Q Median 3Q Max
## -18.1313 -4.6672 0.7973 4.0723 20.1000
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.104 1.562 0.707 0.482225
## DietDR 6.761 1.817 3.722 0.000407 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.626 on 67 degrees of freedom
## (7 observations deleted due to missingness)
## Multiple R-squared: 0.1713, Adjusted R-squared: 0.159
## F-statistic: 13.85 on 1 and 67 DF, p-value: 0.0004068
diet_preautotomy %>% group_by(Diet) %>%
summarise(n=sum(!is.na(Perc_WL)), mean=mean(Perc_WL,na.rm=TRUE),
sd=sd(Perc_WL,na.rm=TRUE), min=min(Perc_WL,na.rm=TRUE),
max=max(Perc_WL,na.rm=TRUE), .groups="drop")
Primary analysis: concurrent energetic state and regeneration
Purpose: Test whether energetic state during
regeneration is associated with cumulative tail regeneration and whether
that association changes as regeneration proceeds.
Approach: All animals with concurrent
percent-mass-loss and percent-regeneration measurements are included.
Cumulative percent regeneration is modeled as a function of Week,
concurrent percent body-mass loss, and their interaction. Week-specific
energetic-state slopes are estimated with emtrends.
Original tail length is not included because percent regeneration
already standardizes regenerated length by original tail length.
Result/Decision: The Week × percent-mass-loss
interaction is the key test of whether energetic-state/regeneration
coupling changes over time. Week-specific slopes identify when the
concurrent association becomes detectable. Because energetic state and
cumulative regeneration are measured during the same sampling period,
this is interpreted as a contemporaneous association rather than
evidence of temporal direction.
model_concurrent <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss +
(0 + Week | Animal_ID),
data = data,
REML = TRUE
)
summary(model_concurrent)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss + (0 + Week | Animal_ID)
## Data: data
##
## REML criterion at convergence: 2466.9
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.1043 -0.5528 0.0326 0.5991 4.1094
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID Week 1.842 1.357
## Residual 9.317 3.052
## Number of obs: 443, groups: Animal_ID, 65
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) -5.733687 0.605632 380.631393 -9.467 <2e-16 ***
## Week 4.194725 0.241281 176.014403 17.385 <2e-16 ***
## Perc.WeightLoss 0.039747 0.031454 384.895061 1.264 0.207
## Week:Perc.WeightLoss 0.015209 0.009393 425.001317 1.619 0.106
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL
## Week -0.482
## Prc.WghtLss -0.847 0.408
## Wk:Prc.WghL 0.540 -0.631 -0.661
# Check random-effects structure
lme4::isSingular(
model_concurrent,
tol = 1e-4
)
## [1] FALSE
lme4::VarCorr(model_concurrent)
## Groups Name Std.Dev.
## Animal_ID Week 1.3571
## Residual 3.0523
# Type III tests
anova(
model_concurrent,
type = 3
)
concurrent_slopes <- emmeans::emtrends(
model_concurrent, ~ Week, var="Perc.WeightLoss", at=list(Week=1:8))
summary(concurrent_slopes, infer=TRUE)
IGF modification of the concurrent association
Purpose: Test whether IGF1 or IGF2 modifies the
concurrent relationship between energetic state and regeneration.
Approach: Only Restricted + Vehicle, Restricted +
IGF1, and Restricted + IGF2 animals are included. Cumulative percent
regeneration is modeled as Week × concurrent percent body-mass loss ×
supplementation. Week-specific emtrends estimate the
energetic-state slope within each supplementation group, and
Tukey-adjusted pairwise contrasts test whether slopes differ among
Vehicle, IGF1, and IGF2.
Result/Decision: The three-way interaction is the
overall test of whether energetic-state/regeneration coupling develops
differently among supplementation groups. Week-specific pairwise slope
contrasts identify when groups diverge. A slope that differs from zero
within an IGF group is not, by itself, evidence that the group differs
from Vehicle.
model_concurrent_igf <- lmerTest::lmer(
Perc.Regeneration ~
Week * Perc.WeightLoss * Supplementation +
(0 + Week | Animal_ID),
data = igf_data,
REML = TRUE
)
summary(model_concurrent_igf)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * Supplementation +
## (0 + Week | Animal_ID)
## Data: igf_data
##
## REML criterion at convergence: 1770
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.8675 -0.5192 0.0242 0.5533 4.2062
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID Week 1.481 1.217
## Residual 8.469 2.910
## Number of obs: 323, groups: Animal_ID, 47
##
## Fixed effects:
## Estimate Std. Error df
## (Intercept) -4.817918 1.348654 273.117271
## Week 4.107748 0.606744 198.661666
## Perc.WeightLoss 0.017091 0.062352 271.483238
## SupplementationIGF1 1.148264 1.907778 280.700833
## SupplementationIGF2 0.649132 2.336884 274.490113
## Week:Perc.WeightLoss 0.004442 0.022035 307.871357
## Week:SupplementationIGF1 -0.512792 0.772174 185.343989
## Week:SupplementationIGF2 -1.397426 0.805884 207.515649
## Perc.WeightLoss:SupplementationIGF1 -0.058274 0.097326 290.958591
## Perc.WeightLoss:SupplementationIGF2 -0.068238 0.108575 272.625667
## Week:Perc.WeightLoss:SupplementationIGF1 0.011664 0.031131 304.606042
## Week:Perc.WeightLoss:SupplementationIGF2 0.068538 0.030933 302.035891
## t value Pr(>|t|)
## (Intercept) -3.572 0.000418 ***
## Week 6.770 1.42e-10 ***
## Perc.WeightLoss 0.274 0.784206
## SupplementationIGF1 0.602 0.547736
## SupplementationIGF2 0.278 0.781393
## Week:Perc.WeightLoss 0.202 0.840376
## Week:SupplementationIGF1 -0.664 0.507459
## Week:SupplementationIGF2 -1.734 0.084398 .
## Perc.WeightLoss:SupplementationIGF1 -0.599 0.549804
## Perc.WeightLoss:SupplementationIGF2 -0.628 0.530207
## Week:Perc.WeightLoss:SupplementationIGF1 0.375 0.708157
## Week:Perc.WeightLoss:SupplementationIGF2 2.216 0.027456 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL SpIGF1 SpIGF2 Wk:P.WL W:SIGF1 W:SIGF2
## Week -0.537
## Prc.WghtLss -0.859 0.422
## SpplmntIGF1 -0.707 0.379 0.607
## SpplmntIGF2 -0.577 0.310 0.496 0.408
## Wk:Prc.WghL 0.583 -0.787 -0.598 -0.412 -0.337
## Wk:SpplIGF1 0.422 -0.786 -0.332 -0.537 -0.243 0.618
## Wk:SpplIGF2 0.404 -0.753 -0.318 -0.286 -0.549 0.592 0.592
## Pr.WL:SIGF1 0.550 -0.271 -0.641 -0.872 -0.318 0.383 0.439 0.204
## Pr.WL:SIGF2 0.493 -0.243 -0.574 -0.349 -0.920 0.343 0.191 0.498
## W:P.WL:SIGF1 -0.413 0.557 0.423 0.617 0.238 -0.708 -0.735 -0.419
## W:P.WL:SIGF2 -0.415 0.560 0.426 0.294 0.596 -0.712 -0.440 -0.789
## P.WL:SIGF1 P.WL:SIGF2 W:P.WL:SIGF1
## Week
## Prc.WghtLss
## SpplmntIGF1
## SpplmntIGF2
## Wk:Prc.WghL
## Wk:SpplIGF1
## Wk:SpplIGF2
## Pr.WL:SIGF1
## Pr.WL:SIGF2 0.368
## W:P.WL:SIGF1 -0.677 -0.243
## W:P.WL:SIGF2 -0.273 -0.647 0.504
lme4::isSingular(
model_concurrent_igf,
tol = 1e-4
)
## [1] FALSE
lme4::VarCorr(model_concurrent_igf)
## Groups Name Std.Dev.
## Animal_ID Week 1.2170
## Residual 2.9101
anova(
model_concurrent_igf,
type = 3
)
concurrent_igf_slopes <- emmeans::emtrends(
model_concurrent_igf, ~ Supplementation | Week, var="Perc.WeightLoss",
at=list(Week=1:8))
concurrent_igf_slopes_df <- as.data.frame(summary(concurrent_igf_slopes, infer=TRUE))
concurrent_igf_slopes_df
concurrent_igf_contrasts <- pairs(concurrent_igf_slopes, adjust="tukey")
concurrent_igf_contrasts_df <- as.data.frame(concurrent_igf_contrasts)
concurrent_igf_contrasts_df
Publication Figures
Code used to generate the manuscript figures and their individual
publication panels.
Figure 1: dietary manipulation and concurrent association
Purpose: Generate the panels showing the dietary
manipulation, regeneration through time, and the overall concurrent
energetic-state/regeneration relationship.
Approach: Panel A displays pre-autotomy percent
body-mass loss by diet. Panel B displays descriptive
percent-regeneration trajectories for High versus Low Diet animals. The
remaining panels visualize week-specific energetic-state slopes from the
primary concurrent model and the model-predicted relationship at Week
6.
Result/Decision: Figure 1 shows the dietary
manipulation and the development of energetic-state/regeneration
coupling across regeneration. The pooled Low Diet trajectory includes
Vehicle, IGF1, and IGF2 animals and is descriptive; it should not be
interpreted as an isolated causal effect of dietary restriction after
supplementation begins.
fig1a_data <- diet_preautotomy %>%
mutate(Diet_display=factor(Diet,levels=c("AdLib","Restricted"),
labels=c("High Diet","Low Diet")))
fig1a <- ggplot(fig1a_data,aes(Diet_display,Perc_WL)) +
geom_violin(fill="grey80",trim=FALSE) +
geom_boxplot(width=.12,outlier.shape=NA,fill="white") +
geom_jitter(width=.08,shape=21,fill="white",size=1.8,alpha=.8) +
labs(title="Dietary restriction increased mass loss",x="Diet treatment",
y="Percent body-mass loss") + theme_classic(base_size=12)
fig1a

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

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

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

# Panels are exported separately below for assembly in BioRender.
# Export Figure 1 panels separately for assembly in BioRender
ggsave(
"Figure1A_Diet_mass_loss.png",
fig1a,
width = 3.5, height = 3,
units = "in", dpi = 600, bg = "white"
)
ggsave(
"Figure1B_Diet_regeneration.png",
fig1b,
width = 4, height = 3,
units = "in", dpi = 600, bg = "white"
)
ggsave(
"Figure1C_Energetic_state_slopes.png",
fig1d,
width = 4.5, height = 3.2,
units = "in", dpi = 600, bg = "white"
)
ggsave(
"Figure1_Week6_popout.png",
fig1c,
width = 2.4, height = 2.6,
units = "in", dpi = 600, bg = "grey90"
)
Figure 2: IGF modification of the concurrent relationship
Purpose: Generate the panels used to visualize how
the energetic-state/regeneration relationship differs among Vehicle,
IGF1, and IGF2 animals.
Approach: Figure 2 is generated from the
restricted-diet concurrent IGF model and its emtrends
results. The code creates week-specific slopes and confidence intervals,
a Week 6 model-based visualization, the change in slope from Week 2 to
Week 8, and bootstrap distributions used to visualize uncertainty.
Result/Decision: Figure 2 is interpreted using
treatment-specific slopes together with Tukey-adjusted pairwise slope
contrasts. The figure describes modification of
energetic-state/regeneration coupling rather than a simple treatment
effect on regeneration.
# Treatment colors used throughout Figure 2
igf_colors <- c(
"Vehicle" = "grey40",
"IGF1" = "#E87722",
"IGF2" = "#0C2340"
)
# ------------------------------------------------------------
# Figure 2A: week-specific energetic-state slopes
# ------------------------------------------------------------
concurrent_igf_slopes_df <- as.data.frame(
summary(concurrent_igf_slopes, infer = TRUE)
)
concurrent_igf_contrasts_df <- as.data.frame(
pairs(concurrent_igf_slopes, adjust = "tukey")
)
igf2_vs_vehicle <- concurrent_igf_contrasts_df %>%
filter(contrast %in% c("Vehicle - IGF2", "IGF2 - Vehicle")) %>%
mutate(
sig = case_when(
p.value < .001 ~ "***",
p.value < .01 ~ "**",
p.value < .05 ~ "*",
p.value < .10 ~ "†",
TRUE ~ ""
)
) %>%
dplyr::select(Week, p.value, sig) %>%
left_join(
concurrent_igf_slopes_df %>%
filter(Supplementation == "IGF2") %>%
dplyr::select(Week, upper.CL),
by = "Week"
)
fig2_slopes <- ggplot(
concurrent_igf_slopes_df,
aes(Week, Perc.WeightLoss.trend, color = Supplementation)
) +
geom_hline(yintercept = 0, linetype = "dashed") +
geom_errorbar(
aes(ymin = lower.CL, ymax = upper.CL),
width = .15,
position = position_dodge(width = .25)
) +
geom_point(size = 4, position = position_dodge(width = .25)) +
geom_text(
data = igf2_vs_vehicle,
aes(Week, upper.CL + .05, label = sig),
inherit.aes = FALSE,
color = "#0C2340",
fontface = "bold",
size = 6
) +
scale_color_manual(values = igf_colors) +
scale_x_continuous(breaks = 1:8) +
labs(
x = "Week",
y = "Slope of regeneration vs.\npercent mass lost",
color = "Supplementation"
) +
theme_classic(base_size = 12) +
theme(legend.position = "bottom")
fig2_slopes

# ------------------------------------------------------------
# Week 6 model-based popout
# ------------------------------------------------------------
week6_igf <- igf_data %>%
filter(
Week == 6,
!is.na(Perc.WeightLoss),
!is.na(Perc.Regeneration)
)
week6_igf_grid <- expand.grid(
Week = 6,
Perc.WeightLoss = seq(
min(week6_igf$Perc.WeightLoss, na.rm = TRUE),
max(week6_igf$Perc.WeightLoss, na.rm = TRUE),
length.out = 100
),
Supplementation = factor(
c("Vehicle", "IGF1", "IGF2"),
levels = c("Vehicle", "IGF1", "IGF2")
)
)
week6_igf_grid$Predicted <- predict(
model_concurrent_igf,
newdata = week6_igf_grid,
re.form = NA
)
fig2_week6 <- ggplot() +
geom_point(
data = week6_igf,
aes(Perc.WeightLoss, Perc.Regeneration, color = Supplementation),
alpha = .55
) +
geom_line(
data = week6_igf_grid,
aes(Perc.WeightLoss, Predicted, color = Supplementation),
linewidth = 1.3
) +
scale_color_manual(values = igf_colors) +
labs(
x = "Percent body-mass loss",
y = "Percent regeneration"
) +
theme_classic(base_size = 11) +
theme(legend.position = "none")
fig2_week6

# ------------------------------------------------------------
# Figure 2B: cumulative change in energetic-state slope
# Week 8 minus Week 2
# ------------------------------------------------------------
fig2_cumulative_data <- concurrent_igf_slopes_df %>%
filter(Week %in% c(2, 8)) %>%
dplyr::select(
Supplementation,
Week,
Perc.WeightLoss.trend
) %>%
tidyr::pivot_wider(
names_from = Week,
values_from = Perc.WeightLoss.trend,
names_prefix = "Week_"
) %>%
mutate(change = Week_8 - Week_2)
fig2_cumulative <- ggplot(
fig2_cumulative_data,
aes(
x = Supplementation,
y = change,
fill = Supplementation
)
) +
geom_hline(yintercept = 0, linetype = "dashed") +
geom_col(width = .65) +
scale_fill_manual(values = igf_colors) +
labs(
x = "Supplementation",
y = expression(Delta ~ slope)
) +
theme_classic(base_size = 11) +
theme(legend.position = "none")
fig2_cumulative

# ------------------------------------------------------------
# Figure 2C: parametric bootstrap distributions
# ------------------------------------------------------------
set.seed(123)
boot_fixed_effects <- function(fit) {
lme4::fixef(fit)
}
fig2_bootstrap <- lme4::bootMer(
model_concurrent_igf,
FUN = boot_fixed_effects,
nsim = 500,
type = "parametric"
)
fig2_bootstrap_df <- as.data.frame(fig2_bootstrap$t)
names(fig2_bootstrap_df) <- names(lme4::fixef(model_concurrent_igf))
bootstrap_terms <- grep(
"Week:Perc\\.WeightLoss",
names(fig2_bootstrap_df),
value = TRUE
)
fig2_bootstrap_long <- fig2_bootstrap_df %>%
dplyr::select(all_of(bootstrap_terms)) %>%
tidyr::pivot_longer(
cols = everything(),
names_to = "term",
values_to = "estimate"
) %>%
mutate(
Supplementation = case_when(
grepl("IGF1", term) ~ "IGF1",
grepl("IGF2", term) ~ "IGF2",
TRUE ~ "Vehicle"
),
Supplementation = factor(
Supplementation,
levels = c("Vehicle", "IGF1", "IGF2")
)
)
fig2_bootstrap_plot <- ggplot(
fig2_bootstrap_long,
aes(estimate, fill = Supplementation)
) +
geom_density(alpha = .9) +
geom_vline(xintercept = 0, linetype = "dashed") +
scale_fill_manual(values = igf_colors) +
labs(
x = "Bootstrap estimate",
y = "Density",
fill = "Supplementation"
) +
theme_classic(base_size = 11) +
theme(legend.position = "none")
fig2_bootstrap_plot

Body-mass trajectory figure
Purpose: Visualize body-mass change across the full
experiment for all four treatment combinations.
Approach: Pre-autotomy percent mass loss and
regeneration-period percent mass loss are combined into one longitudinal
plotting dataset. Individual trajectories are shown lightly, with group
means overlaid using the same treatment palette as the other
figures.
Result/Decision: This figure provides descriptive
context for body-mass change before and during regeneration.
Post-autotomy values include the physical loss of tail tissue and should
not be interpreted as a direct measure of whole-body energy balance.
pre_traj <- diet %>%
filter(Week <= 0, !is.na(Perc_WL)) %>%
dplyr::select(Animal_ID, Week, Perc.WeightLoss = Perc_WL) %>%
left_join(
data %>% dplyr::select(Animal_ID, Treatment) %>% distinct(),
by = "Animal_ID"
)
regen_traj <- data %>%
filter(Week > 0, !is.na(Perc.WeightLoss)) %>%
dplyr::select(Animal_ID, Week, Perc.WeightLoss, Treatment)
trajectory_data <- bind_rows(pre_traj, regen_traj) %>%
mutate(
Group = case_when(
Treatment == "AdLib" ~ "AdLib",
Treatment == "DR" ~ "Vehicle",
Treatment == "DR.IGF1" ~ "IGF1",
Treatment == "DR.IGF2" ~ "IGF2"
),
Group = factor(
Group,
levels = c("AdLib", "Vehicle", "IGF1", "IGF2")
)
)
trajectory_colors <- c(
"AdLib" = "grey40",
"Vehicle" = "grey70",
"IGF1" = "#E87722",
"IGF2" = "#0C2340"
)
body_mass_plot <- ggplot(
trajectory_data,
aes(Week, Perc.WeightLoss, color = Group)
) +
geom_line(
aes(group = Animal_ID),
alpha = .12,
linewidth = .5
) +
stat_summary(
aes(group = Group),
fun = mean,
geom = "line",
linewidth = 1.2
) +
stat_summary(
aes(group = Group),
fun = mean,
geom = "point",
size = 3
) +
geom_hline(
yintercept = 0,
linetype = "dashed",
color = "grey40"
) +
geom_vline(
xintercept = 0,
linetype = "dotted",
color = "grey40"
) +
scale_color_manual(
values = trajectory_colors,
labels = c(
"AdLib" = "High Diet",
"Vehicle" = "Low Diet + Vehicle",
"IGF1" = "Low Diet + IGF1",
"IGF2" = "Low Diet + IGF2"
)
) +
scale_x_continuous(
breaks = c(-4, -2, -1, 0, 1:8)
) +
labs(
x = "Week",
y = "Percent body-mass loss",
color = "Treatment"
) +
theme_classic(base_size = 12) +
theme(
legend.position = "bottom"
)
body_mass_plot

Validation
Sensitivity and temporal checks used to evaluate whether the
manuscript conclusions are robust to alternative definitions, outcomes,
and potential confounds.
Temporal specificity of the energetic-state association
The primary concurrent analysis cannot determine whether energetic
state precedes regenerative performance. This section therefore asks the
same biological question using energetic-state measures that occur
before the regenerative response. These analyses are
complementary, not interchangeable.
These analyses evaluate whether the association is also detectable
when energetic state precedes the regenerative
response. They distinguish a pre-existing/prospective energetic effect
from a contemporaneous association that emerges during regeneration.
Pre-autotomy energetic state
Purpose: Test whether energetic state established
before autotomy predicts the subsequent regeneration trajectory and
whether later IGF supplementation modifies that prospective
relationship.
Approach: A single pre-autotomy percent-mass-loss
value is calculated for each animal from Week -4 to Week -1. This value
precedes tail autotomy and IGF administration, avoiding the contribution
of physically removed tail tissue to the energetic-state measure. The
overall prospective relationship is evaluated in all animals, and IGF
modification is evaluated within the restricted-diet comparison.
Result/Decision: The prospective pre-autotomy
analyses did not provide strong evidence that pre-existing mass loss
predicts the later regeneration trajectory or that IGF clearly modifies
that prospective relationship. This analysis is retained as temporal
validation and supports interpreting the primary result as an
association with ongoing energetic state during regeneration rather than
a simple pre-existing energetic deficit that determines later
regeneration.
pre_autotomy_state <- diet %>%
filter(Week %in% c(-4,-1)) %>%
dplyr::select(Animal_ID, Diet, Week, Mass) %>%
mutate(Timepoint=case_when(Week==-4 ~ "Mass_WeekMinus4",
Week==-1 ~ "Mass_WeekMinus1")) %>%
dplyr::select(Animal_ID,Diet,Timepoint,Mass) %>%
pivot_wider(names_from=Timepoint, values_from=Mass) %>%
mutate(PreAutotomy_MassLoss=((Mass_WeekMinus4-Mass_WeekMinus1)/Mass_WeekMinus4)*100)
regen_preautotomy <- data %>%
left_join(pre_autotomy_state %>% dplyr::select(Animal_ID,PreAutotomy_MassLoss),
by="Animal_ID")
regen_preautotomy_igf <- regen_preautotomy %>%
filter(Diet=="Restricted") %>%
mutate(Supplementation=case_when(Treatment=="DR" ~ "Vehicle",
Treatment=="DR.IGF1" ~ "IGF1",
Treatment=="DR.IGF2" ~ "IGF2"),
Supplementation=factor(Supplementation,levels=c("Vehicle","IGF1","IGF2")))
pre_autotomy_state %>% group_by(Diet) %>%
summarise(n=sum(!is.na(PreAutotomy_MassLoss)),
mean=mean(PreAutotomy_MassLoss,na.rm=TRUE),
sd=sd(PreAutotomy_MassLoss,na.rm=TRUE),
min=min(PreAutotomy_MassLoss,na.rm=TRUE),
max=max(PreAutotomy_MassLoss,na.rm=TRUE), .groups="drop")
model_preautotomy <- lmerTest::lmer(
Perc.Regeneration ~ Week * PreAutotomy_MassLoss + (1|Animal_ID),
data=regen_preautotomy)
summary(model_preautotomy); anova(model_preautotomy,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * PreAutotomy_MassLoss + (1 | Animal_ID)
## Data: regen_preautotomy
##
## REML criterion at convergence: 2757.5
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.1181 -0.5777 0.0766 0.5872 3.2970
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 20.23 4.498
## Residual 21.83 4.673
## Number of obs: 443, groups: Animal_ID, 65
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) -4.92415 0.94998 132.90172 -5.183 7.91e-07 ***
## Week 4.53173 0.13158 387.48965 34.441 < 2e-16 ***
## PreAutotomy_MassLoss 0.02021 0.10856 134.91235 0.186 0.853
## Week:PreAutotomy_MassLoss -0.03387 0.01526 391.15015 -2.219 0.027 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week PrA_ML
## Week -0.568
## PrAttmy_MsL -0.634 0.358
## Wk:PrAtt_ML 0.352 -0.618 -0.564
preautotomy_slopes <- emmeans::emtrends(
model_preautotomy, ~ Week, var="PreAutotomy_MassLoss", at=list(Week=1:8))
summary(preautotomy_slopes,infer=TRUE)
model_preautotomy_igf <- lmerTest::lmer(
Perc.Regeneration ~ Week * PreAutotomy_MassLoss * Supplementation + (1|Animal_ID),
data=regen_preautotomy_igf)
summary(model_preautotomy_igf); anova(model_preautotomy_igf,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * PreAutotomy_MassLoss * Supplementation +
## (1 | Animal_ID)
## Data: regen_preautotomy_igf
##
## REML criterion at convergence: 1957.9
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.8282 -0.6009 0.0905 0.5889 3.4852
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 18.00 4.243
## Residual 18.55 4.307
## Number of obs: 323, groups: Animal_ID, 47
##
## Fixed effects:
## Estimate Std. Error df
## (Intercept) -5.66921 2.78862 90.26898
## Week 4.94035 0.43055 280.31013
## PreAutotomy_MassLoss 0.20357 0.29436 91.30071
## SupplementationIGF1 2.46619 3.53911 86.92605
## SupplementationIGF2 1.61728 3.49713 90.24467
## Week:PreAutotomy_MassLoss -0.11434 0.04607 280.06647
## Week:SupplementationIGF1 -1.77901 0.51212 278.58905
## Week:SupplementationIGF2 -1.27604 0.52323 279.12124
## PreAutotomy_MassLoss:SupplementationIGF1 -0.38486 0.38159 90.50596
## PreAutotomy_MassLoss:SupplementationIGF2 -0.30380 0.37328 89.73145
## Week:PreAutotomy_MassLoss:SupplementationIGF1 0.22788 0.05760 284.20872
## Week:PreAutotomy_MassLoss:SupplementationIGF2 0.17249 0.05575 278.57520
## t value Pr(>|t|)
## (Intercept) -2.033 0.044991 *
## Week 11.474 < 2e-16 ***
## PreAutotomy_MassLoss 0.692 0.490970
## SupplementationIGF1 0.697 0.487763
## SupplementationIGF2 0.462 0.644864
## Week:PreAutotomy_MassLoss -2.482 0.013660 *
## Week:SupplementationIGF1 -3.474 0.000595 ***
## Week:SupplementationIGF2 -2.439 0.015361 *
## PreAutotomy_MassLoss:SupplementationIGF1 -1.009 0.315872
## PreAutotomy_MassLoss:SupplementationIGF2 -0.814 0.417876
## Week:PreAutotomy_MassLoss:SupplementationIGF1 3.957 9.61e-05 ***
## Week:PreAutotomy_MassLoss:SupplementationIGF2 3.094 0.002177 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week PrA_ML SpIGF1 SpIGF2 Wk:PA_ML W:SIGF1 W:SIGF2
## Week -0.574
## PrAttmy_MsL -0.836 0.496
## SpplmntIGF1 -0.788 0.453 0.659
## SpplmntIGF2 -0.797 0.458 0.667 0.628
## Wk:PrAtt_ML 0.489 -0.867 -0.578 -0.385 -0.390
## Wk:SpplIGF1 0.483 -0.841 -0.417 -0.565 -0.385 0.729
## Wk:SpplIGF2 0.473 -0.823 -0.408 -0.372 -0.576 0.713 0.692
## PA_ML:SIGF1 0.645 -0.383 -0.771 -0.815 -0.514 0.446 0.472 0.315
## PA_ML:SIGF2 0.659 -0.391 -0.789 -0.520 -0.813 0.456 0.329 0.480
## W:PA_ML:SIGF1 -0.391 0.693 0.462 0.452 0.312 -0.800 -0.818 -0.570
## W:PA_ML:SIGF2 -0.404 0.716 0.478 0.319 0.480 -0.826 -0.602 -0.845
## PA_ML:SIGF1 PA_ML:SIGF2 W:PA_ML:SIGF1
## Week
## PrAttmy_MsL
## SpplmntIGF1
## SpplmntIGF2
## Wk:PrAtt_ML
## Wk:SpplIGF1
## Wk:SpplIGF2
## PA_ML:SIGF1
## PA_ML:SIGF2 0.608
## W:PA_ML:SIGF1 -0.562 -0.365
## W:PA_ML:SIGF2 -0.368 -0.575 0.661
preautotomy_igf_slopes <- emmeans::emtrends(
model_preautotomy_igf, ~ Supplementation | Week, var="PreAutotomy_MassLoss",
at=list(Week=1:8))
summary(preautotomy_igf_slopes,infer=TRUE)
pairs(preautotomy_igf_slopes,adjust="tukey")
## Week = 1:
## contrast estimate SE df t.ratio p.value
## Vehicle - IGF1 0.1570 0.352 65.4 0.445 0.8966
## Vehicle - IGF2 0.1313 0.344 64.6 0.381 0.9230
## IGF1 - IGF2 -0.0257 0.311 65.2 -0.083 0.9962
##
## Week = 2:
## contrast estimate SE df t.ratio p.value
## Vehicle - IGF1 -0.0709 0.331 51.2 -0.214 0.9750
## Vehicle - IGF2 -0.0412 0.322 50.2 -0.128 0.9910
## IGF1 - IGF2 0.0297 0.293 51.8 0.101 0.9943
##
## Week = 3:
## contrast estimate SE df t.ratio p.value
## Vehicle - IGF1 -0.2988 0.318 43.7 -0.938 0.6193
## Vehicle - IGF2 -0.2137 0.309 42.5 -0.691 0.7698
## IGF1 - IGF2 0.0851 0.282 44.2 0.302 0.9510
##
## Week = 4:
## contrast estimate SE df t.ratio p.value
## Vehicle - IGF1 -0.5267 0.316 42.1 -1.666 0.2301
## Vehicle - IGF2 -0.3862 0.306 40.5 -1.264 0.4234
## IGF1 - IGF2 0.1405 0.278 41.6 0.505 0.8694
##
## Week = 5:
## contrast estimate SE df t.ratio p.value
## Vehicle - IGF1 -0.7546 0.324 46.0 -2.327 0.0620
## Vehicle - IGF2 -0.5587 0.312 43.9 -1.790 0.1847
## IGF1 - IGF2 0.1959 0.283 43.6 0.693 0.7686
##
## Week = 6:
## contrast estimate SE df t.ratio p.value
## Vehicle - IGF1 -0.9824 0.342 55.8 -2.872 0.0156
## Vehicle - IGF2 -0.7312 0.328 53.2 -2.228 0.0756
## IGF1 - IGF2 0.2513 0.294 50.4 0.854 0.6714
##
## Week = 7:
## contrast estimate SE df t.ratio p.value
## Vehicle - IGF1 -1.2103 0.368 72.5 -3.288 0.0044
## Vehicle - IGF2 -0.9037 0.352 69.5 -2.564 0.0331
## IGF1 - IGF2 0.3067 0.313 62.5 0.981 0.5914
##
## Week = 8:
## contrast estimate SE df t.ratio p.value
## Vehicle - IGF1 -1.4382 0.401 96.6 -3.588 0.0015
## Vehicle - IGF2 -1.0762 0.383 93.6 -2.807 0.0166
## IGF1 - IGF2 0.3621 0.336 80.7 1.076 0.5315
##
## Degrees-of-freedom method: kenward-roger
## P value adjustment: tukey method for comparing a family of 3 estimates
Lagged energetic state predicting subsequent regeneration
Purpose: Test whether energetic state at the
beginning of an interval predicts the amount of new regeneration
produced during the following interval.
Approach: Restricted + Vehicle, Restricted + IGF1,
and Restricted + IGF2 animals with consecutive observations are arranged
longitudinally. Percent body-mass loss at the beginning of an interval
is paired with the subsequent increment in absolute regeneration and
percent regeneration, giving the energetic-state measure temporal
precedence over the response interval.
Result/Decision: The lagged analysis did not provide
strong evidence that energetic state prospectively predicts the next
increment of regeneration. Together with the pre-autotomy analysis, this
indicates that the strongest energetic-state/regeneration relationship
is concurrent rather than clearly prospective.
lagged_data <- igf_data %>%
filter(Week %in% 1:8) %>%
arrange(Animal_ID,Week) %>%
group_by(Animal_ID) %>%
mutate(
Lagged_MassLoss=Perc.WeightLoss,
Next_Regeneration=lead(Regeneration),
Next_PercRegeneration=lead(Perc.Regeneration),
Next_Week=lead(Week),
Subsequent_Regeneration=Next_Regeneration-Regeneration,
Subsequent_PercRegeneration=Next_PercRegeneration-Perc.Regeneration
) %>%
ungroup() %>%
filter(Next_Week-Week==1)
lagged_data %>% count(Week,Next_Week)
lagged_data %>% group_by(Animal_ID) %>% summarise(n_intervals=n(),.groups="drop") %>% count(n_intervals)
Alternative regeneration metrics
Purpose: Determine whether the conclusions depend on
how regeneration is quantified.
Approach: The restricted-diet IGF comparison is
repeated using absolute regenerated tail length and weekly regeneration
rate. Original tail length is included for outcomes expressed in
absolute length.
Result/Decision: These models are retained as
sensitivity analyses because percent regeneration, absolute tissue
growth, and weekly rate describe related but non-identical aspects of
regeneration. Agreement supports robustness; differences are interpreted
as outcome-specific rather than used to replace the primary
response.
model_absolute_length <- lmerTest::lmer(
Regeneration ~ Week*Perc.WeightLoss*Supplementation + Tail + (1|Animal_ID),
data=igf_data)
summary(model_absolute_length); anova(model_absolute_length,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Regeneration ~ Week * Perc.WeightLoss * Supplementation + Tail +
## (1 | Animal_ID)
## Data: igf_data
##
## REML criterion at convergence: 1693.1
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.67150 -0.61652 0.09798 0.56924 3.07970
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 7.344 2.710
## Residual 7.807 2.794
## Number of obs: 322, groups: Animal_ID, 47
##
## Fixed effects:
## Estimate Std. Error df t value
## (Intercept) 2.53086 4.71762 49.80487 0.536
## Week 2.34142 0.34664 288.17199 6.755
## Perc.WeightLoss -0.01672 0.06811 300.19027 -0.245
## SupplementationIGF1 0.97985 2.31519 231.54073 0.423
## SupplementationIGF2 -0.02972 2.83635 260.20984 -0.010
## Tail -0.06461 0.06178 47.33144 -1.046
## Week:Perc.WeightLoss 0.01215 0.01515 286.16302 0.802
## Week:SupplementationIGF1 0.40772 0.44769 292.75462 0.911
## Week:SupplementationIGF2 -0.39101 0.50079 287.35368 -0.781
## Perc.WeightLoss:SupplementationIGF1 -0.05167 0.10589 308.57806 -0.488
## Perc.WeightLoss:SupplementationIGF2 -0.03604 0.12505 308.21672 -0.288
## Week:Perc.WeightLoss:SupplementationIGF1 -0.02248 0.02267 300.76121 -0.991
## Week:Perc.WeightLoss:SupplementationIGF2 0.03392 0.02295 284.23858 1.478
## Pr(>|t|)
## (Intercept) 0.594
## Week 7.9e-11 ***
## Perc.WeightLoss 0.806
## SupplementationIGF1 0.673
## SupplementationIGF2 0.992
## Tail 0.301
## Week:Perc.WeightLoss 0.423
## Week:SupplementationIGF1 0.363
## Week:SupplementationIGF2 0.436
## Perc.WeightLoss:SupplementationIGF1 0.626
## Perc.WeightLoss:SupplementationIGF2 0.773
## Week:Perc.WeightLoss:SupplementationIGF1 0.322
## Week:Perc.WeightLoss:SupplementationIGF2 0.141
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model_weekly_rate <- lmerTest::lmer(
Rate_Reg ~ Week*Perc.WeightLoss*Supplementation + Tail + (1|Animal_ID),
data=igf_data)
summary(model_weekly_rate); anova(model_weekly_rate,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Rate_Reg ~ Week * Perc.WeightLoss * Supplementation + Tail +
## (1 | Animal_ID)
## Data: igf_data
##
## REML criterion at convergence: 1361.5
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.5875 -0.6218 -0.2074 0.4436 6.2109
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 0.1381 0.3716
## Residual 6.8460 2.6165
## Number of obs: 278, groups: Animal_ID, 46
##
## Fixed effects:
## Estimate Std. Error df t value
## (Intercept) 0.75595 2.88429 139.96753 0.262
## Week 0.57983 0.47879 264.38271 1.211
## Perc.WeightLoss 0.28390 0.13422 216.85799 2.115
## SupplementationIGF1 5.08544 3.11390 226.98473 1.633
## SupplementationIGF2 3.63828 3.38139 222.83676 1.076
## Tail -0.03788 0.02720 32.75872 -1.393
## Week:Perc.WeightLoss -0.04060 0.02309 264.42963 -1.758
## Week:SupplementationIGF1 -0.70606 0.55611 264.81077 -1.270
## Week:SupplementationIGF2 -0.70067 0.60516 264.71540 -1.158
## Perc.WeightLoss:SupplementationIGF1 -0.26791 0.16041 230.03234 -1.670
## Perc.WeightLoss:SupplementationIGF2 -0.20752 0.16653 227.99464 -1.246
## Week:Perc.WeightLoss:SupplementationIGF1 0.04086 0.02866 264.64813 1.426
## Week:Perc.WeightLoss:SupplementationIGF2 0.04291 0.02962 264.31185 1.448
## Pr(>|t|)
## (Intercept) 0.7936
## Week 0.2270
## Perc.WeightLoss 0.0356 *
## SupplementationIGF1 0.1038
## SupplementationIGF2 0.2831
## Tail 0.1731
## Week:Perc.WeightLoss 0.0799 .
## Week:SupplementationIGF1 0.2053
## Week:SupplementationIGF2 0.2480
## Perc.WeightLoss:SupplementationIGF1 0.0962 .
## Perc.WeightLoss:SupplementationIGF2 0.2140
## Week:Perc.WeightLoss:SupplementationIGF1 0.1550
## Week:Perc.WeightLoss:SupplementationIGF2 0.1487
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Original tail-length sensitivity
Purpose: Determine whether explicitly controlling
for original tail length changes the energetic-state/IGF conclusions for
percent regeneration.
Approach: The primary restricted-diet
percent-regeneration model is repeated with original tail length
included as an additional covariate.
Result/Decision: This is secondary because original
tail length already contributes to the denominator of percent
regeneration. The no-Tail model remains the preferred
percent-regeneration analysis; this model tests sensitivity to explicit
adjustment for initial tail length.
model_tail_sensitivity <- lmerTest::lmer(
Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + Tail + (1|Animal_ID),
data=igf_data)
summary(model_tail_sensitivity); anova(model_tail_sensitivity,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * Supplementation +
## Tail + (1 | Animal_ID)
## Data: igf_data
##
## REML criterion at convergence: 1970.5
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.9111 -0.5262 0.1124 0.5350 3.5702
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 16.16 4.020
## Residual 19.02 4.361
## Number of obs: 323, groups: Animal_ID, 47
##
## Fixed effects:
## Estimate Std. Error df
## (Intercept) 13.213432 7.075965 50.260370
## Week 4.236546 0.539984 290.708618
## Perc.WeightLoss 0.033786 0.105948 302.747557
## SupplementationIGF1 3.368255 3.560472 236.334676
## SupplementationIGF2 1.884904 4.372909 261.109106
## Tail -0.240628 0.092564 47.462931
## Week:Perc.WeightLoss -0.010191 0.023599 288.583065
## Week:SupplementationIGF1 -0.281928 0.697034 294.969429
## Week:SupplementationIGF2 -1.284194 0.780195 289.644224
## Perc.WeightLoss:SupplementationIGF1 -0.134307 0.164191 309.296432
## Perc.WeightLoss:SupplementationIGF2 -0.106108 0.193859 308.285358
## Week:Perc.WeightLoss:SupplementationIGF1 -0.001259 0.035255 302.552132
## Week:Perc.WeightLoss:SupplementationIGF2 0.071966 0.035762 286.389469
## t value Pr(>|t|)
## (Intercept) 1.867 0.0677 .
## Week 7.846 8.28e-14 ***
## Perc.WeightLoss 0.319 0.7500
## SupplementationIGF1 0.946 0.3451
## SupplementationIGF2 0.431 0.6668
## Tail -2.600 0.0124 *
## Week:Perc.WeightLoss -0.432 0.6662
## Week:SupplementationIGF1 -0.404 0.6862
## Week:SupplementationIGF2 -1.646 0.1009
## Perc.WeightLoss:SupplementationIGF1 -0.818 0.4140
## Perc.WeightLoss:SupplementationIGF2 -0.547 0.5845
## Week:Perc.WeightLoss:SupplementationIGF1 -0.036 0.9715
## Week:Perc.WeightLoss:SupplementationIGF2 2.012 0.0451 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
IGF dose sensitivity
Purpose: Test whether variation in administered IGF
dose explains differences between IGF1 and IGF2 animals.
Approach: Only IGF-treated restricted animals are
included because Vehicle animals received no IGF dose. The IGF model is
fit with and without Dose and compared using AIC, and the model
including Dose is examined directly.
Result/Decision: Dose is retained as a sensitivity
check rather than a primary predictor. The comparison evaluates whether
modest variation in administered dose materially improves explanation of
regenerative performance beyond supplementation identity and
energetic-state terms.
igf_dose_data <- igf_data %>%
filter(Supplementation %in% c("IGF1","IGF2")) %>%
group_by(Animal_ID) %>% fill(Dose,.direction="downup") %>% ungroup() %>%
mutate(Supplementation=droplevels(Supplementation))
model_dose0 <- lmerTest::lmer(
Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + (1|Animal_ID),
data=igf_dose_data, REML=FALSE)
model_dose <- lmerTest::lmer(
Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + Dose + (1|Animal_ID),
data=igf_dose_data, REML=FALSE)
AIC(model_dose0,model_dose)
summary(model_dose); anova(model_dose,type=3)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * Supplementation +
## Dose + (1 | Animal_ID)
## Data: igf_dose_data
##
## AIC BIC logLik -2*log(L) df.resid
## 1386.9 1424.8 -682.5 1364.9 221
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.1128 -0.5579 0.1367 0.5209 2.9280
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 13.69 3.700
## Residual 15.96 3.995
## Number of obs: 232, groups: Animal_ID, 34
##
## Fixed effects:
## Estimate Std. Error df
## (Intercept) -12.811849 5.464079 41.611339
## Week 3.888356 0.405912 222.790296
## Perc.WeightLoss -0.128000 0.116073 225.994427
## SupplementationIGF2 -1.857827 4.031246 197.737812
## Dose 5.074029 2.454100 37.523852
## Week:Perc.WeightLoss -0.007641 0.024131 230.107478
## Week:SupplementationIGF2 -0.957394 0.655995 217.966737
## Perc.WeightLoss:SupplementationIGF2 0.045936 0.188749 227.106737
## Week:Perc.WeightLoss:SupplementationIGF2 0.070355 0.034449 222.832549
## t value Pr(>|t|)
## (Intercept) -2.345 0.0239 *
## Week 9.579 <2e-16 ***
## Perc.WeightLoss -1.103 0.2713
## SupplementationIGF2 -0.461 0.6454
## Dose 2.068 0.0456 *
## Week:Perc.WeightLoss -0.317 0.7518
## Week:SupplementationIGF2 -1.459 0.1459
## Perc.WeightLoss:SupplementationIGF2 0.243 0.8079
## Week:Perc.WeightLoss:SupplementationIGF2 2.042 0.0423 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL SpIGF2 Dose Wk:P.WL W:SIGF P.WL:S
## Week -0.221
## Prc.WghtLss -0.195 0.726
## SpplmntIGF2 -0.158 0.419 0.491
## Dose -0.907 -0.090 -0.172 -0.090
## Wk:Prc.WghL 0.183 -0.900 -0.784 -0.372 0.094
## Wk:SpplIGF2 0.145 -0.618 -0.448 -0.763 0.048 0.556
## Pr.WL:SIGF2 0.126 -0.446 -0.614 -0.902 0.099 0.481 0.765
## W:P.WL:SIGF -0.136 0.629 0.548 0.684 -0.057 -0.700 -0.920 -0.790
Post-autotomy body-mass trajectories
Purpose: Test whether IGF supplementation itself
produced different post-treatment body-mass trajectories that could
provide an alternative explanation for the regeneration results.
Approach: Restricted + Vehicle, Restricted + IGF1,
and Restricted + IGF2 animals are compared for percent change in body
mass relative to the Week -1 pre-autotomy measurement. Week-specific
trajectory slopes are estimated and compared among supplementation
groups.
Result/Decision: Body-mass trajectories did not
differ significantly among supplementation groups (Week ×
Supplementation, p = 0.23), and pairwise trajectory slopes were
nonsignificant. There is no evidence that IGF2 produced a uniquely
different post-treatment body-mass trajectory. Because the baseline
precedes autotomy, post-autotomy mass change includes physical tail
removal and is not interpreted as a direct measure of whole-body energy
balance.
pre_autotomy_mass <- diet %>% filter(Week==-1) %>%
dplyr::select(Animal_ID,PreAutotomy_Mass=Mass) %>% distinct()
post_igf_mass <- igf_data %>%
filter(Week %in% c(2,4,6,8), !is.na(Mass)) %>%
left_join(pre_autotomy_mass,by="Animal_ID") %>%
mutate(Percent_Mass_Change=((Mass-PreAutotomy_Mass)/PreAutotomy_Mass)*100)
model_post_igf_mass <- lmerTest::lmer(
Percent_Mass_Change ~ Week*Supplementation + (1|Animal_ID), data=post_igf_mass)
summary(model_post_igf_mass); anova(model_post_igf_mass,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Percent_Mass_Change ~ Week * Supplementation + (1 | Animal_ID)
## Data: post_igf_mass
##
## REML criterion at convergence: 1025.9
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.4911 -0.4713 -0.0123 0.5277 3.8203
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 29.63 5.444
## Residual 28.39 5.328
## Number of obs: 157, groups: Animal_ID, 46
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) -11.1939 2.4593 123.4563 -4.552 1.26e-05 ***
## Week -0.4673 0.4015 115.4443 -1.164 0.247
## SupplementationIGF1 0.2233 3.2914 122.5491 0.068 0.946
## SupplementationIGF2 -3.5735 3.2464 122.4341 -1.101 0.273
## Week:SupplementationIGF1 0.8454 0.5271 115.8798 1.604 0.112
## Week:SupplementationIGF2 0.7516 0.5175 113.9692 1.452 0.149
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week SpIGF1 SpIGF2 W:SIGF1
## Week -0.712
## SpplmntIGF1 -0.747 0.532
## SpplmntIGF2 -0.758 0.540 0.566
## Wk:SpplIGF1 0.543 -0.762 -0.705 -0.411
## Wk:SpplIGF2 0.553 -0.776 -0.413 -0.712 0.591
post_mass_slopes <- emmeans::emtrends(model_post_igf_mass,~Supplementation,var="Week")
summary(post_mass_slopes,infer=TRUE)
pairs(post_mass_slopes,adjust="tukey")
## contrast estimate SE df t.ratio p.value
## Vehicle - IGF1 -0.8454 0.528 116 -1.601 0.2495
## Vehicle - IGF2 -0.7516 0.518 114 -1.450 0.3189
## IGF1 - IGF2 0.0937 0.473 114 0.198 0.9786
##
## Degrees-of-freedom method: kenward-roger
## P value adjustment: tukey method for comparing a family of 3 estimates
Exploration
Additional model-structure and descriptive analyses used to
understand the data, investigate reviewer questions, and guide final
modeling decisions. These are separated from the primary published tests
and formal sensitivity analyses.
Random-effects structure validation
Purpose: Evaluate whether repeated measurements are
adequately represented by animal-specific intercepts alone or whether
animals also differ in their regeneration trajectories through time.
Approach: Alternative random-effects structures are
treated as model-structure checks for the longitudinal regeneration
analyses. The comparison focuses on whether allowing animal-specific
Week slopes changes model fit, singularity, or uncertainty around
energetic-state interactions.
Result/Decision: These checks document the
model-selection process. Earlier comparisons indicated substantial
among-animal variation in longitudinal regeneration trajectories, while
intercept variance could approach zero in more flexible structures.
These diagnostics are kept separate from the biological hypothesis
tests.
Validation of the full regeneration period
Purpose: Confirm that the longitudinal conclusions
are not artifacts of restricting the analysis to an early portion of
regeneration and evaluate repeated-measures behavior across the full
dataset.
Approach: Early-week and full-period versions of the
restricted-diet IGF model are fit, within-animal repeatability is
summarized, and residual magnitude is compared across weeks.
Result/Decision: These analyses are retained as
model validation because the energetic-state association develops over
time and later observations are biologically important. They assess
whether the full regeneration period can be retained without evidence
that later weeks alone create the longitudinal pattern.
model_early_weeks <- lmerTest::lmer(
Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + (1|Animal_ID),
data=igf_data %>% filter(Week<=4))
model_full_weeks <- lmerTest::lmer(
Perc.Regeneration ~ Week*Perc.WeightLoss*Supplementation + (1|Animal_ID),
data=igf_data)
summary(model_early_weeks); anova(model_early_weeks,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * Supplementation +
## (1 | Animal_ID)
## Data: igf_data %>% filter(Week <= 4)
##
## REML criterion at convergence: 969.6
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.6225 -0.6837 0.0866 0.5502 3.5391
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 2.559 1.600
## Residual 10.598 3.256
## Number of obs: 179, groups: Animal_ID, 47
##
## Fixed effects:
## Estimate Std. Error df t value
## (Intercept) -5.45397 2.13919 155.46805 -2.550
## Week 4.22378 1.11999 166.31951 3.771
## Perc.WeightLoss -0.07595 0.09607 143.73511 -0.791
## SupplementationIGF1 -0.09456 3.34831 162.92144 -0.028
## SupplementationIGF2 -2.79696 4.09473 160.85495 -0.683
## Week:Perc.WeightLoss 0.04534 0.04942 164.85432 0.917
## Week:SupplementationIGF1 -0.57489 1.53468 163.12783 -0.375
## Week:SupplementationIGF2 -0.03947 1.67878 152.36390 -0.024
## Perc.WeightLoss:SupplementationIGF1 0.03157 0.16372 161.05432 0.193
## Perc.WeightLoss:SupplementationIGF2 0.16929 0.18635 159.87799 0.908
## Week:Perc.WeightLoss:SupplementationIGF1 0.01116 0.07621 164.82361 0.146
## Week:Perc.WeightLoss:SupplementationIGF2 -0.02409 0.07454 150.22910 -0.323
## Pr(>|t|)
## (Intercept) 0.011754 *
## Week 0.000225 ***
## Perc.WeightLoss 0.430486
## SupplementationIGF1 0.977504
## SupplementationIGF2 0.495549
## Week:Perc.WeightLoss 0.360291
## Week:SupplementationIGF1 0.708446
## Week:SupplementationIGF2 0.981271
## Perc.WeightLoss:SupplementationIGF1 0.847335
## Perc.WeightLoss:SupplementationIGF2 0.365008
## Week:Perc.WeightLoss:SupplementationIGF1 0.883754
## Week:Perc.WeightLoss:SupplementationIGF2 0.746953
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL SpIGF1 SpIGF2 Wk:P.WL W:SIGF1 W:SIGF2
## Week -0.794
## Prc.WghtLss -0.819 0.650
## SpplmntIGF1 -0.639 0.508 0.523
## SpplmntIGF2 -0.522 0.415 0.428 0.334
## Wk:Prc.WghL 0.718 -0.927 -0.770 -0.459 -0.375
## Wk:SpplIGF1 0.580 -0.730 -0.475 -0.833 -0.303 0.677
## Wk:SpplIGF2 0.530 -0.667 -0.434 -0.339 -0.830 0.619 0.487
## Pr.WL:SIGF1 0.481 -0.382 -0.587 -0.872 -0.251 0.452 0.741 0.255
## Pr.WL:SIGF2 0.422 -0.335 -0.516 -0.270 -0.916 0.397 0.245 0.747
## W:P.WL:SIGF1 -0.466 0.601 0.499 0.761 0.243 -0.648 -0.923 -0.401
## W:P.WL:SIGF2 -0.476 0.615 0.510 0.304 0.789 -0.663 -0.449 -0.944
## P.WL:SIGF1 P.WL:SIGF2 W:P.WL:SIGF1
## Week
## Prc.WghtLss
## SpplmntIGF1
## SpplmntIGF2
## Wk:Prc.WghL
## Wk:SpplIGF1
## Wk:SpplIGF2
## Pr.WL:SIGF1
## Pr.WL:SIGF2 0.303
## W:P.WL:SIGF1 -0.836 -0.257
## W:P.WL:SIGF2 -0.300 -0.822 0.430
summary(model_full_weeks); anova(model_full_weeks,type=3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Perc.Regeneration ~ Week * Perc.WeightLoss * Supplementation +
## (1 | Animal_ID)
## Data: igf_data
##
## REML criterion at convergence: 1974
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.8891 -0.5492 0.1063 0.5239 3.6505
##
## Random effects:
## Groups Name Variance Std.Dev.
## Animal_ID (Intercept) 18.93 4.351
## Residual 18.99 4.357
## Number of obs: 323, groups: Animal_ID, 47
##
## Fixed effects:
## Estimate Std. Error df
## (Intercept) -4.018033 2.478763 242.557024
## Week 4.338052 0.539645 290.716386
## Perc.WeightLoss -0.004628 0.105606 303.849755
## SupplementationIGF1 1.599782 3.564679 232.026387
## SupplementationIGF2 0.309570 4.415799 265.914483
## Week:Perc.WeightLoss -0.013992 0.023589 288.557548
## Week:SupplementationIGF1 -0.390114 0.698146 294.599968
## Week:SupplementationIGF2 -1.394936 0.780520 289.217760
## Perc.WeightLoss:SupplementationIGF1 -0.090226 0.164689 310.266636
## Perc.WeightLoss:SupplementationIGF2 -0.072661 0.195468 310.579911
## Week:Perc.WeightLoss:SupplementationIGF1 0.002789 0.035394 302.088587
## Week:Perc.WeightLoss:SupplementationIGF2 0.076005 0.035776 285.943832
## t value Pr(>|t|)
## (Intercept) -1.621 0.1063
## Week 8.039 2.3e-14 ***
## Perc.WeightLoss -0.044 0.9651
## SupplementationIGF1 0.449 0.6540
## SupplementationIGF2 0.070 0.9442
## Week:Perc.WeightLoss -0.593 0.5535
## Week:SupplementationIGF1 -0.559 0.5767
## Week:SupplementationIGF2 -1.787 0.0750 .
## Perc.WeightLoss:SupplementationIGF1 -0.548 0.5842
## Perc.WeightLoss:SupplementationIGF2 -0.372 0.7103
## Week:Perc.WeightLoss:SupplementationIGF1 0.079 0.9372
## Week:Perc.WeightLoss:SupplementationIGF2 2.124 0.0345 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Week Prc.WL SpIGF1 SpIGF2 Wk:P.WL W:SIGF1 W:SIGF2
## Week -0.591
## Prc.WghtLss -0.776 0.535
## SpplmntIGF1 -0.695 0.411 0.539
## SpplmntIGF2 -0.561 0.332 0.435 0.390
## Wk:Prc.WghL 0.558 -0.909 -0.675 -0.388 -0.313
## Wk:SpplIGF1 0.457 -0.773 -0.413 -0.644 -0.256 0.703
## Wk:SpplIGF2 0.409 -0.691 -0.370 -0.284 -0.695 0.629 0.534
## Pr.WL:SIGF1 0.497 -0.343 -0.641 -0.810 -0.279 0.433 0.617 0.237
## Pr.WL:SIGF2 0.419 -0.289 -0.540 -0.291 -0.881 0.365 0.223 0.679
## W:P.WL:SIGF1 -0.372 0.606 0.450 0.599 0.209 -0.666 -0.894 -0.419
## W:P.WL:SIGF2 -0.368 0.599 0.445 0.256 0.655 -0.659 -0.463 -0.928
## P.WL:SIGF1 P.WL:SIGF2 W:P.WL:SIGF1
## Week
## Prc.WghtLss
## SpplmntIGF1
## SpplmntIGF2
## Wk:Prc.WghL
## Wk:SpplIGF1
## Wk:SpplIGF2
## Pr.WL:SIGF1
## Pr.WL:SIGF2 0.346
## W:P.WL:SIGF1 -0.736 -0.243
## W:P.WL:SIGF2 -0.285 -0.747 0.439
performance::icc(model_full_weeks)
residual_data <- data.frame(
Week=model.frame(model_full_weeks)$Week,
residual=residuals(model_full_weeks)) %>%
mutate(absolute_residual=abs(residual))
model_residual_variation <- lm(absolute_residual ~ factor(Week),data=residual_data)
anova(model_residual_variation)
Body-mass trajectories across the experiment
Purpose: Provide a descriptive check of individual
and treatment-level body-mass trajectories across the full
experiment.
Approach: Pre-autotomy and regeneration-period
percent-mass-loss values are combined by animal and treatment. The same
treatment palette is used across figures.
Result/Decision: This descriptive dataset supports
visualization of the timing and variability of body-mass change. It is
not used as a direct measure of whole-body energy balance after
autotomy.
pre_traj <- diet %>% filter(Week<0,!is.na(Perc_WL)) %>%
dplyr::select(Animal_ID,Week,Perc.WeightLoss=Perc_WL) %>%
left_join(data %>% dplyr::select(Animal_ID,Treatment) %>% distinct(),by="Animal_ID")
regen_traj <- data %>% filter(Week>=0,!is.na(Perc.WeightLoss)) %>%
dplyr::select(Animal_ID,Week,Perc.WeightLoss,Treatment)
trajectory_data <- bind_rows(pre_traj,regen_traj) %>%
mutate(Group=case_when(Treatment=="AdLib"~"AdLib",Treatment=="DR"~"Vehicle",
Treatment=="DR.IGF1"~"IGF1",Treatment=="DR.IGF2"~"IGF2"))
Sample sizes
Purpose: Document the number of unique animals
contributing to the main concurrent, IGF, and lagged analyses.
Approach: Sample sizes are counted by unique
Animal_ID rather than by repeated observations. Counts are shown
separately for the full experiment, restricted-diet IGF comparison, and
lagged dataset.
Result/Decision: These counts make the transition
between the full four-group experiment and restricted-diet IGF analyses
explicit and prevent repeated observations from being mistaken for
independent sample size.
data %>% filter(!is.na(Perc.Regeneration),!is.na(Perc.WeightLoss)) %>%
distinct(Animal_ID,Treatment) %>% count(Treatment)
igf_data %>% filter(!is.na(Perc.Regeneration),!is.na(Perc.WeightLoss)) %>%
distinct(Animal_ID,Supplementation) %>% count(Supplementation)
lagged_data %>% distinct(Animal_ID,Supplementation) %>% count(Supplementation)