Nothing
## ---- include = FALSE---------------------------------------------------------
options(rmarkdown.html_vignette.check_title = FALSE)
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
## ----setup--------------------------------------------------------------------
library(PoolDilutionR)
OneSample_dat <- subset(Morris2023, subset = id == "71")
print(OneSample_dat)
## ----Solve for P and k--------------------------------------------------------
results <- pdr_optimize(
time = OneSample_dat$time_days, # time as a vector
m = OneSample_dat$cal12CH4ml + OneSample_dat$cal13CH4ml, # total pool size
n = OneSample_dat$cal13CH4ml, # pool size of heavy isotopologue
P = 0.1, # inital production rate for optim()
pool = "CH4", # indicates use of default fractionation constants for methane
m_prec = 0.001, # instrument precision for total pool size, as standard deviation
ap_prec = 0.01, # instrument precision for atom percent, as standard deviation
)
## ----print(results)-----------------------------------------------------------
print(results)
## ----OneSample Results Dataframe----------------------------------------------
pdr_optimize_df(
time = OneSample_dat$time_days,
m = OneSample_dat$cal12CH4ml + OneSample_dat$cal13CH4ml,
n = OneSample_dat$cal13CH4ml,
P = 0.1,
pool = "CH4",
m_prec = 0.001,
ap_prec = 0.01
)
## ----Multi-sample Example Input, fig.height = 5, fig.width = 8, fig.align='center'----
# create long data for plotting
library(tidyr)
long_Morris2023 <- pivot_longer(Morris2023, cols = cal12CH4ml:AP_obs)
library(ggplot2)
ggplot(
data = long_Morris2023,
aes(time_days, value, color = id)
) +
geom_point() +
geom_line() +
facet_wrap(~name, scales = "free_y")
## ----lapply(PoolDilutionR), message = FALSE-----------------------------------
samples <- split(Morris2023, Morris2023$id)
all_results <- lapply(samples, FUN = function(samples) {
pdr_optimize_df(
time = samples$time_days,
m = samples$cal12CH4ml + samples$cal13CH4ml,
n = samples$cal13CH4ml,
P = 0.1,
pool = "CH4",
m_prec = 0.001,
ap_prec = 0.01,
quiet = TRUE,
include_progress = FALSE
)
})
all_results <- do.call(rbind, all_results)
## ----Six samples with all preds, echo=FALSE, message = FALSE, results='hide'----
pk_results <- list()
incdat_out <- list()
all_predictions <- list()
library(tibble)
for (i in unique(Morris2023$id)) {
message("------------------- ", i)
# Isolate this sample's data
dat <- Morris2023[Morris2023$id == i, ]
result <- pdr_optimize(
time = dat$time_days,
m = dat$cal12CH4ml + dat$cal13CH4ml,
n = dat$cal13CH4ml,
P = 0.1,
pool = "CH4",
m_prec = 0.001,
ap_prec = 0.01,
quiet = TRUE,
include_progress = TRUE
)
# Save progress details separately so they don't print below
progress_detail <- result$progress
result$progress <- NULL
P <- result$par["P"]
id <- dat$id[1]
pk_results[[i]] <- tibble(
id = id,
P = P,
k = result$par["k"],
k0 = result$initial_par["k"],
convergence = result$convergence,
message = result$message
)
# Predict based on the optimized parameters
pred <- pdr_predict(
time = dat$time_days,
m0 = dat$cal12CH4ml[1] + dat$cal13CH4ml[1],
n0 = dat$cal13CH4ml[1],
P = P,
k = result$par["k"],
pool = "CH4"
)
dat <- cbind(dat, pred)
# Predict based on ALL the models that were tried
x <- split(progress_detail, seq_len(nrow(progress_detail)))
all_preds <- lapply(x, FUN = function(x) {
y1 <- data.frame(
P = x$P[1],
k = x$k[1],
time = seq(min(dat$time_days), max(dat$time_days), length.out = 20)
)
y2 <- pdr_predict(
time = y1$time,
m0 = dat$cal12CH4ml[1] + dat$cal13CH4ml[1],
n0 = dat$cal13CH4ml[1],
P = x$P[1],
k = x$k[1],
pool = "CH4"
)
cbind(y1, y2)
})
all_predictions[[i]] <- do.call(rbind, all_preds)
all_predictions[[i]]$id <- id
# Calculate implied consumption (ml) based on predictions
# Equation 4: dm/dt = P - C, so C = P - dm/dt
total_methane <- dat$cal12CH4ml + dat$cal13CH4ml
change_methane <- c(0, diff(total_methane))
change_time <- c(0, diff(dat$time_days))
dat$Pt <- P * change_time # P is ml/day
# amount of methane produced at time (t) of this incubation, a volume in mL
dat$Ct <- dat$Pt - change_methane
incdat_out[[i]] <- dat
}
pk_results <- do.call(rbind, pk_results)
incdat_out <- do.call(rbind, incdat_out)
all_predictions <- do.call(rbind, all_predictions)
## ----Future Note, include = FALSE, echo = FALSE-------------------------------
# For consideration, include link here to additional supplementary materials that include code for making the plots below
## ----Multisample Fit APE, echo = FALSE, fig.height = 5.5, fig.width = 8.25----
# ----- Plot AP results -----
ggplot(incdat_out, aes(time_days, AP_obs, color = id)) +
geom_point(aes(shape = ""), size = 4) +
geom_line(
data = all_predictions,
aes(time, AP_pred, group = paste(id, P, k)), color = "grey", linetype = 2
) +
geom_line(aes(y = AP_pred, group = id, linetype = ""),
size = 1.5
) +
scale_linetype_manual(
name = "Prediction",
values = "dotted"
) +
scale_shape_manual(
name = "Observations",
values = 20
) +
scale_color_discrete(guide = "none") +
facet_wrap(~id, scales="free_y") +
xlab("\n Timestep \n") +
ylab("\n (13C-CH4/Total CH4) x 100 \n") +
ggtitle("\n Atom% 13C \n") +
theme(legend.position = "bottom")
## ----Multisample Fit Total Pool, echo = FALSE, fig.height = 5.5, fig.width = 8.25----
ggplot(incdat_out, aes(time_days, cal12CH4ml + cal13CH4ml, color = id)) +
geom_point(aes(shape = ""), size = 4) +
geom_line(
data = all_predictions,
aes(time, mt, group = paste(id, P, k)), color = "grey", linetype = 2
) +
geom_line(aes(y = mt, group = id, linetype = ""),
size = 1.5
) +
scale_linetype_manual(
name = "Prediction",
values = "dotted"
) +
scale_shape_manual(
name = "Observations",
values = 20
) +
scale_color_discrete(guide = "none") +
facet_wrap(~id, scales="free_y") +
xlab("\n Timestep \n") +
ylab("\n Volume (mL) \n") +
ggtitle("\n Total Methane \n") +
theme(legend.position = "bottom")
## ----Optimize frac rates, fig.height = 4, fig.width = 6-----------------------
# In this example, we assume that P and k are known, but that fractionation rates are unknown.
Sample64_dat <- subset(Morris2023, subset = id == "64")
new_fit <- pdr_optimize_df(
time = Sample64_dat$time_days,
m = Sample64_dat$cal12CH4ml + Sample64_dat$cal13CH4ml,
n = Sample64_dat$cal13CH4ml,
P = 8,
k = 1,
params_to_optimize = c("frac_P", "frac_k"),
m_prec = 0.001,
ap_prec = 0.01
)
newFitFracP <- new_fit[new_fit$par == "frac_P", ]$value
newFitFrack <- new_fit[new_fit$par == "frac_k", ]$value
# dataframe with new fit (optimizing P_frac and k_frac)
y_new <- pdr_predict(
time = Sample64_dat$time_days,
m0 = Sample64_dat$cal12CH4ml[1] + Sample64_dat$cal13CH4ml[1],
n0 = Sample64_dat$cal13CH4ml[1],
P = 8,
k = 1,
frac_P = newFitFracP,
frac_k = newFitFrack
)
dat_new <- cbind(Sample64_dat, y_new)
dat_new$oldAPpred <- incdat_out[incdat_out$id == "64", ]$AP_pred
# graph new fit
ggplot(data = dat_new) +
geom_point(aes(time_days, AP_pred, shape = "New Prediction", color = "New Prediction"),
size = 3, fill = "#619CFF"
) +
geom_point(aes(time_days, AP_obs, shape = "Observations", color = "Observations"),
size = 3
) +
geom_point(aes(time_days, oldAPpred, shape = "Old Prediction", color = "Old Prediction"),
size = 3
) +
scale_shape_manual(
name = "Sample 64",
breaks = c("New Prediction", "Observations", "Old Prediction"),
values = c("New Prediction" = 21, "Observations" = 16, "Old Prediction" = 1)
) +
scale_color_manual(
name = "Sample 64",
breaks = c("New Prediction", "Observations", "Old Prediction"),
values = c("New Prediction" = "black", "Observations" = "#619CFF", "Old Prediction" = "#619CFF")
) +
ylab("Atom%13C\n")
print(new_fit)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.