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

fig1b

fig1d

fig1c

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

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

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

# ------------------------------------------------------------
# Figure 2C: parametric bootstrap distributions of derived treatment-specific change
# in energetic-state slope from Week 1 to Week 8
# ------------------------------------------------------------
set.seed(123)
boot_slope_changes <- function(fit) {
b <- lme4::fixef(fit)
slope_at_week <- function(group, week) {
slope <- unname(b["Perc.WeightLoss"] + week * b["Week:Perc.WeightLoss"])
if (group == "IGF1") {
slope <- slope + unname(
b["Perc.WeightLoss:SupplementationIGF1"] +
week * b["Week:Perc.WeightLoss:SupplementationIGF1"]
)
}
if (group == "IGF2") {
slope <- slope + unname(
b["Perc.WeightLoss:SupplementationIGF2"] +
week * b["Week:Perc.WeightLoss:SupplementationIGF2"]
)
}
slope
}
c(
Vehicle = slope_at_week("Vehicle", 8) - slope_at_week("Vehicle", 1),
IGF1 = slope_at_week("IGF1", 8) - slope_at_week("IGF1", 1),
IGF2 = slope_at_week("IGF2", 8) - slope_at_week("IGF2", 1)
)
}
fig2_bootstrap <- lme4::bootMer(
model_concurrent_igf,
FUN = boot_slope_changes,
nsim = 500,
type = "parametric"
)
fig2_bootstrap_df <- as.data.frame(fig2_bootstrap$t)
names(fig2_bootstrap_df) <- c("Vehicle", "IGF1", "IGF2")
fig2_bootstrap_long <- fig2_bootstrap_df %>%
tidyr::pivot_longer(
cols = everything(),
names_to = "Supplementation",
values_to = "estimate"
) %>%
mutate(
Supplementation = factor(
Supplementation,
levels = c("Vehicle", "IGF1", "IGF2")
)
)
fig2_bootstrap_plot <- ggplot(
fig2_bootstrap_long,
aes(estimate, fill = Supplementation)
) +
geom_density(alpha = .9) +
geom_vline(xintercept = 0, linetype = "dashed") +
scale_fill_manual(values = igf_colors) +
labs(
x = expression(Delta ~ "slope (Week 8 - Week 1)"),
y = "Density",
fill = "Supplementation"
) +
theme_classic(base_size = 11) +
theme(legend.position = "none")
fig2_bootstrap_plot

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

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)