Latent Phase
Parmetric survival model for latent phase durataion
Shedding Threshold
Published FMDV shedding estimate is around 3.92
Hide code
<- antem_df %>%
donor_thresh filter(group == "donor" & dpi == 2) # day of contact with Group 2
$nasal donor_thresh
[1] 3.706999 6.411625
Hide code
mean(donor_thresh$nasal)
[1] 5.059312
Designate end of latent based on shed rate.
Hide code
<- antem_df %>%
latent_end_df filter(nasal >= 3.92 & nasal != 45) %>%
group_by(animal) %>%
filter(date == min(date)) %>%
mutate(latent_end = 1) %>%
ungroup()
Quick stats to check data
Hide code
%>%
latent_end_df summarise(mean_dpe = mean(dpe),
median_dpe = median(dpe),
min_range = min(dpe),
max_range = max(dpe))
mean_dpe | median_dpe | min_range | max_range |
---|---|---|---|
1.428571 | 1 | 1 | 4 |
Prepare Data
Scale Time Add an arbitrarily small value to eliminate zeros. Really not need with his specific data set, by an important step.
Hide code
$scaled_duration <- latent_end_df$dpe + 0.0001 latent_end_df
Scale Serum Scaling serum as potential covariate.
Hide code
$serum_0 <- latent_end_df$serum
latent_end_df$serum_0[latent_end_df$serum_0 == 45] = 0
latent_end_df$serum_0 <- as.numeric(scale(latent_end_df$serum_0, scale = T, center = F)) latent_end_df
Models
Response Variable Creating a survival object to ensure time and censored animals are correctly indicated.
Hide code
<- inla.surv(latent_end_df$scaled_duration, latent_end_df$latent_end) surv_obj
Parametric model for study-wide average duration.
Hide code
<- c(0.025, 0.05, 0.25, 0.5, 0.75, 0.95, 0.975)
return_quants
<- inla(surv_obj ~ 1 + serum_0,
latent_end_mod data = latent_end_df,
verbose=FALSE,
quantiles = return_quants,
family = "exponential.surv",
control.fixed = list(prec = 1, prec.intercept = 0.001),
control.compute=list(dic = TRUE, cpo = FALSE, waic = TRUE))
Treatment is specific to group
therefore using group
below to identify important differences.
Hide code
<- c(0.025, 0.05, 0.25, 0.5, 0.75, 0.95, 0.975)
return_quants
<- list(theta = list(prior="pc.prec",
pc_prec_iid param=c(1, 0.001)))
<- inla(surv_obj ~ 1 +
latent_aft_mod f(group,
model = "iid",
constr=FALSE,
hyper=pc_prec_iid),
data = latent_end_df,
verbose=FALSE,
quantiles = return_quants,
family = "lognormal.surv",
control.fixed = list(prec = 1, prec.intercept = 0.0001),
control.compute=list(dic = TRUE, cpo = FALSE, waic = TRUE))
Sample Marginals
Performing sampling on the model results
Hide code
<- compute_survival_marginals(latent_end_mod, 5) latent_samples
Check estimates at the 0.5 probability (median)
Hide code
<- find_closest_quant(latent_samples, 0.5)
median_latent median_latent
$quant0.025
[1] 0.501
$quant0.25
[1] 0.901
$quant0.5
[1] 1.201
$quant0.75
[1] 1.501
$quant0.975
[1] 2.501
Survival Curve
Hide code
plot_survival_marginals(latent_samples, x_max = 5, xlabel = "Latent Phase Duration")
AFT Treament Effects
Get treatment-level estimated duration
Hide code
<- latent_aft_mod$summary.random$group[,c(1:4,6,7,8, 10)]
aft_latent names(aft_latent) <- c("Group","Mean", "sd", "Q_0.025","Q_0.25", "Q_0.5", "Q_0.75", "Q_0.975")
<- latent_aft_mod$summary.fixed$mean
mean_aft
2:8] <- exp(aft_latent[,2:8] + mean_aft)
aft_latent[,<- exp(latent_aft_mod$summary.fixed[,c(1:3, 5:7, 9)])
study_wide rownames(study_wide) <- NULL
names(study_wide) <- c("Mean", "sd", "Q_0.025","Q_0.25", "Q_0.5", "Q_0.75", "Q_0.975")
$Group <- "study"
study_wide<- rbind(study_wide, aft_latent)
aft_latent aft_latent
Mean | sd | Q_0.025 | Q_0.25 | Q_0.5 | Q_0.75 | Q_0.975 | Group |
---|---|---|---|---|---|---|---|
1.270207 | 1.173833 | 0.9259857 | 1.148989 | 1.268414 | 1.401915 | 1.757435 | study |
1.381136 | 1.517493 | 1.0116252 | 1.247324 | 1.329053 | 1.515215 | 2.099118 | donor |
1.420993 | 1.509849 | 1.0590048 | 1.269587 | 1.378708 | 1.568838 | 2.110296 | Group 2 |
1.149395 | 1.507885 | 0.7736175 | 1.044813 | 1.185920 | 1.278711 | 1.545068 | Group 3 |
1.149395 | 1.507885 | 0.7736175 | 1.044813 | 1.185920 | 1.278711 | 1.545068 | Group 4 |
Compare treatment groups
Hide code
plot_aft_linerange(latent_aft_mod, y_min = 0, y_max = 2.5, brks = 0.5, ylimit = 2.5)
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
save latent samples
Hide code
saveRDS(latent_samples, here("assets/latent_samples.rds"))
saveRDS(median_latent, here("assets/latent_median.rds"))
saveRDS(aft_latent, here("assets/latent_aft_median.rds"))