Title: | Cellular Energetics Analysis Software |
---|---|
Description: | Measuring cellular energetics is essential to understanding a matrix’s (e.g. cell, tissue or biofluid) metabolic state. The Agilent Seahorse machine is a common method to measure real-time cellular energetics, but existing analysis tools are highly manual or lack functionality. The Cellular Energetics Analysis Software (ceas) R package fills this analytical gap by providing modular and automated Seahorse data analysis and visualization using the methods described by Mookerjee et al. (2017) <doi:10.1074/jbc.m116.774471>. |
Authors: | Rachel House [aut, cre] |
Maintainer: | Rachel House <[email protected]> |
License: | MIT + file LICENSE |
Version: | 1.3.0 |
Built: | 2025-01-21 06:12:11 UTC |
Source: | https://github.com/jamespeapen/ceas |
Generate the ATP Plot
atp_plot( energetics, model = "ols", error_bar = "ci", conf_int = 0.95, size = 2, shape = 16, basal_vs_max = "basal", glyc_vs_resp = "glyc", group_label = "Experimental group", sep_reps = FALSE, ci_method = "Wald" )
atp_plot( energetics, model = "ols", error_bar = "ci", conf_int = 0.95, size = 2, shape = 16, basal_vs_max = "basal", glyc_vs_resp = "glyc", group_label = "Experimental group", sep_reps = FALSE, ci_method = "Wald" )
energetics |
A table of calculated glycolysis and OXPHOS rates.
Returned by |
model |
The linear model used to estimate mean and confidence
intervals: ordinary least squares ( |
error_bar |
Whether to plot error bars as standard deviation ( |
conf_int |
The confidence interval percentage. Should be between 0 and 1 |
size |
Size of the points |
shape |
Shape of the points |
basal_vs_max |
Whether to plot |
glyc_vs_resp |
Whether to plot glycolysis ( |
group_label |
Label for the experimental group to populate the legend title |
sep_reps |
Whether to calculate summary statistics on the groups with
replicates combined. The current default |
ci_method |
The method used to compute confidence intervals for the
mixed-effects model: |
Note: When we use the term 'max' in the package documentation we mean the maximal experimental OCR and ECAR values rather than absolute biological maximums.
a ggplot
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics <- get_energetics( partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1 ) atp_plot(energetics, sep_reps = FALSE) atp_plot(energetics, basal_vs_max = "max", sep_reps = FALSE) atp_plot( energetics, basal_vs_max = "basal", glyc_vs_resp = "resp", sep_reps = TRUE ) # to change fill, the geom_point shape number should be between 15 and 25 atp_plot( energetics, sep_reps = FALSE ) + ggplot2::scale_fill_manual( values = c("#e36500", "#b52356", "#3cb62d", "#328fe1") ) # to change color, use ggplot2::scale_color_manual atp_plot(energetics, sep_reps = FALSE) + ggplot2::scale_color_manual( values = c("#e36500", "#b52356", "#3cb62d", "#328fe1") )
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics <- get_energetics( partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1 ) atp_plot(energetics, sep_reps = FALSE) atp_plot(energetics, basal_vs_max = "max", sep_reps = FALSE) atp_plot( energetics, basal_vs_max = "basal", glyc_vs_resp = "resp", sep_reps = TRUE ) # to change fill, the geom_point shape number should be between 15 and 25 atp_plot( energetics, sep_reps = FALSE ) + ggplot2::scale_fill_manual( values = c("#e36500", "#b52356", "#3cb62d", "#328fe1") ) # to change color, use ggplot2::scale_color_manual atp_plot(energetics, sep_reps = FALSE) + ggplot2::scale_color_manual( values = c("#e36500", "#b52356", "#3cb62d", "#328fe1") )
Generate the Bioenergetic Scope Plot
bioscope_plot( energetics, model = "ols", error_bar = "ci", conf_int = 0.95, size = 2, basal_shape = 1, max_shape = 19, group_label = "Experimental Group", sep_reps = FALSE, ci_method = "Wald" )
bioscope_plot( energetics, model = "ols", error_bar = "ci", conf_int = 0.95, size = 2, basal_shape = 1, max_shape = 19, group_label = "Experimental Group", sep_reps = FALSE, ci_method = "Wald" )
energetics |
A table of calculated glycolysis and OXPHOS rates.
Returned by |
model |
The linear model used to estimate mean and confidence
intervals: ordinary least squares ( |
error_bar |
Whether to plot error bars as standard deviation ( |
conf_int |
The confidence interval percentage. Should be between 0 and 1 |
size |
Size of the points |
basal_shape |
Shape of the points for basal values |
max_shape |
Shape of the points for max values |
group_label |
Label for the experimental group to populate the legend title |
sep_reps |
Whether to calculate summary statistics on the groups with
replicates combined. The current default |
ci_method |
The method used to compute confidence intervals for the
mixed-effects model: |
bioscope_plot |
Creates a 2D plot visualizing the mean and standard deviation basal and maximal ATP production from glycolysis and OXPHOS for each experimental group |
a ggplot
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics <- get_energetics( partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1 ) bioscope_plot(energetics, sep_reps = FALSE) # to change fill, the geom_point shape should be between 15 and 20. # These shapes are filled without border and will correctly show on the legend. bioscope_plot( energetics, sep_reps = TRUE, size = 3, basal_shape = 2, max_shape = 17 # empty and filled triangle ) + ggplot2::scale_fill_manual( values = c("#e36500", "#b52356", "#3cb62d", "#328fe1") ) # to change color, use ggplot2::scale_color_manual bioscope_plot(energetics, sep_reps = FALSE) + ggplot2::scale_color_manual( values = c("#e36500", "#b52356", "#3cb62d", "#328fe1") )
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics <- get_energetics( partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1 ) bioscope_plot(energetics, sep_reps = FALSE) # to change fill, the geom_point shape should be between 15 and 20. # These shapes are filled without border and will correctly show on the legend. bioscope_plot( energetics, sep_reps = TRUE, size = 3, basal_shape = 2, max_shape = 17 # empty and filled triangle ) + ggplot2::scale_fill_manual( values = c("#e36500", "#b52356", "#3cb62d", "#328fe1") ) # to change color, use ggplot2::scale_color_manual bioscope_plot(energetics, sep_reps = FALSE) + ggplot2::scale_color_manual( values = c("#e36500", "#b52356", "#3cb62d", "#328fe1") )
Runs linear mixed-effects models on the ATP measure columns from
get_energetics
with replicates as the random-effect. Estimates mean and
confidence intervals for ATP production from glycolysis and OXPHOS at points
defined in partition_data
energetics_lme_summary(atp_col, energetics, conf_int, ci_method)
energetics_lme_summary(atp_col, energetics, conf_int, ci_method)
atp_col |
The column name of the ATP measure - one of "ATP_basal_resp", "ATP_max_resp", "ATP_basal_glyc", "ATP_max_glyc" |
energetics |
a data.table of Seahorse OCR and ECAR rates (from |
conf_int |
The confidence interval percentage. Should be between 0 and 1 |
ci_method |
The method used to compute confidence intervals for the
mixed-effects model: |
a data.table with mean and the confidence interval bounds by experimental group
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics <- get_energetics( partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1 ) # Only for one column. For the full energetics table run # `get_energetics_summary` with `model = "mixed"`. energetics_lme_summary( "ATP_max_resp", energetics, conf_int = 0.95, ci_method = "Wald" )
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics <- get_energetics( partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1 ) # Only for one column. For the full energetics table run # `get_energetics_summary` with `model = "mixed"`. energetics_lme_summary( "ATP_max_resp", energetics, conf_int = 0.95, ci_method = "Wald" )
Helper function to calculate mean and standard deviation of ATP production
from glycolysis and OXPHOS at points defined in partition_data
and with
values calculated using the get_energetics
function. Should only be called
from get_energetics_summary
as the function itself only operaes on a
vector without any of the grouping that get_energetics
does.
energetics_ols_summary(atp_col, error_metric, conf_int)
energetics_ols_summary(atp_col, error_metric, conf_int)
atp_col |
The column name of the ATP measure - one of "ATP_basal_resp", "ATP_max_resp", "ATP_basal_glyc", "ATP_max_glyc" |
error_metric |
Whether to calculate error as standard deviation ( |
conf_int |
The confidence interval percentage. Should be between 0 and 1 |
a data.table with mean and the confidence interval bounds by experimental group
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics <- get_energetics(partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1) # Only for one row and across all groups and replicates. # For the full correctly grouped energetics table run # `get_energetics_summary` with `model = "ols"`. energetics_ols_summary(energetics$ATP_max_resp, error_metric = "ci", conf_int = 0.95)
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics <- get_energetics(partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1) # Only for one row and across all groups and replicates. # For the full correctly grouped energetics table run # `get_energetics_summary` with `model = "ols"`. energetics_ols_summary(energetics$ATP_max_resp, error_metric = "ci", conf_int = 0.95)
Calculates ATP production from glycolysis and OXPHOS at points defined in patitioned_data
get_energetics(partitioned_data, ph, pka, buffer)
get_energetics(partitioned_data, ph, pka, buffer)
partitioned_data |
a data.table of organized Seahorse OCR and ECAR
rates based on timepoints from the assay cycle. Returned by |
ph |
pH value for energetics calculation (for XF Media, 7.5) |
pka |
pKa value for energetics calculation (for XF Media, 6.063) |
buffer |
buffer for energetics calculation (for XF Media, 0.1 mpH/pmol H+) |
TODO: check that all symbols are defined
Proton production rate (PPR):
calculates the proton production from glucose during its conversion to bicarbonate and assuming max
of 1
calculates the proton production from glucose during its conversion to lactate +
Joules of ATP (JATP) production:
with
= 0.167 for glucose (0.242 for glycogen).
with = 2.486 and
= 0.167.
a data.table
of glycolysis and OXPHOS rates
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics <- get_energetics( partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1 ) head(energetics, n = 10)
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics <- get_energetics( partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1 ) head(energetics, n = 10)
Calculates mean and standard deviation of ATP production from glycolysis and
OXPHOS at points defined in partition_data
and with values calculated
using the get_energetics
function via ordinary least squares or a
mixed-effects model
get_energetics_summary( energetics, model = "ols", error_metric = "ci", conf_int = 0.95, sep_reps = FALSE, ci_method = "Wald" )
get_energetics_summary( energetics, model = "ols", error_metric = "ci", conf_int = 0.95, sep_reps = FALSE, ci_method = "Wald" )
energetics |
a data.table of Seahorse OCR and ECAR rates (from |
model |
The model used to estimate mean and confidence intervals:
ordinary least squares ( |
error_metric |
Whether to calculate error as standard deviation ( |
conf_int |
The confidence interval percentage. Should be between 0 and 1 |
sep_reps |
Whether to calculate summary statistics on the groups with
replicates combined. The current default |
ci_method |
The method used to compute confidence intervals for the
mixed-effects model: |
To get the means and confidence intervals for experiments with replicates,
users can either use sep_reps = TRUE
to get replicate-level summary
statistics or set model = "mixed"
to use a linear mixed-effects model on
with replicate as the random-effect. The confidence intervals are generated
using confint(method = "Wald")
.
a list of groups from the data
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics_list <- get_energetics( partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1 ) energetics_summary <- get_energetics_summary(energetics_list, sep_reps = FALSE) head(energetics_summary[, c(1:5)], n = 10) head(energetics_summary[, c(1, 2, 6, 7)], n = 10)
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates) energetics_list <- get_energetics( partitioned_data, ph = 7.4, pka = 6.093, buffer = 0.1 ) energetics_summary <- get_energetics_summary(energetics_list, sep_reps = FALSE) head(energetics_summary[, c(1:5)], n = 10) head(energetics_summary[, c(1, 2, 6, 7)], n = 10)
Summarize OCR and ECAR as mean and bounded standard deviations or standard error with confidence intervals
get_rate_summary( seahorse_rates, measure = "OCR", assay, model = "ols", error_metric = "ci", conf_int = 0.95, sep_reps = FALSE, ci_method = "Wald" )
get_rate_summary( seahorse_rates, measure = "OCR", assay, model = "ols", error_metric = "ci", conf_int = 0.95, sep_reps = FALSE, ci_method = "Wald" )
seahorse_rates |
data.table Seahorse OCR and ECAR rates (imported using |
measure |
Whether to calculate summary for |
assay |
What assay to calculate summary for (e.g. "MITO" or "GLYCO") |
model |
The model used to estimate mean and confidence intervals: |
error_metric |
Whether to calculate error as standard deviations ( |
conf_int |
The confidence interval percentage. Should be between 0 and 1 |
sep_reps |
Whether to calculate summary statistics on the groups with
replicates combined. The current default |
ci_method |
The method used to compute confidence intervals for the
mixed-effects model: |
a data.table with means, standard deviations/standard error with bounds around the mean(sd or confidence intervals)
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) combined_reps <- get_rate_summary( seahorse_rates, measure = "OCR", assay = "MITO", model = "ols", error_metric = "ci", conf_int = 0.95, sep_reps = FALSE ) head(combined_reps, n = 10) # separate replicates sep_reps <- get_rate_summary( seahorse_rates, measure = "OCR", assay = "MITO", model = "ols", error_metric = "ci", conf_int = 0.95, sep_reps = TRUE ) head(sep_reps, n = 10) # mixed effects model reps_as_random_effects <- get_rate_summary( seahorse_rates, measure = "OCR", assay = "MITO", model = "mixed", error_metric = "ci", conf_int = 0.95, sep_reps = FALSE ) head(reps_as_random_effects, n = 10)
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) combined_reps <- get_rate_summary( seahorse_rates, measure = "OCR", assay = "MITO", model = "ols", error_metric = "ci", conf_int = 0.95, sep_reps = FALSE ) head(combined_reps, n = 10) # separate replicates sep_reps <- get_rate_summary( seahorse_rates, measure = "OCR", assay = "MITO", model = "ols", error_metric = "ci", conf_int = 0.95, sep_reps = TRUE ) head(sep_reps, n = 10) # mixed effects model reps_as_random_effects <- get_rate_summary( seahorse_rates, measure = "OCR", assay = "MITO", model = "mixed", error_metric = "ci", conf_int = 0.95, sep_reps = FALSE ) head(reps_as_random_effects, n = 10)
Wrapper to create a 2D plot visualizing the mean and standard deviation basal and maximal ATP production from glycolysis and OXPHOS for each experimental group Create a Bioenergetic scope plot from input Seahorse Wave export, long-form rates excel files
make_bioscope_plot(rep_list, ph, pka, buffer, sheet = 2)
make_bioscope_plot(rep_list, ph, pka, buffer, sheet = 2)
rep_list |
A list of Seahorse Wave excel export files. One file per replicate. Group all replicates for a given experiment in a single folder, and write that folder's path in "seahorse_data". You can use 'list.files("seahorse_data") "full.names=TRUE") to get the paths to the files. |
ph |
pH value for energetics calculation (for XF Media, 7.5) |
pka |
pKa value for energetics calculation (for XF Media, 6.063) |
buffer |
buffer for energetics calculation (for XF Media, 0.1 mpH/pmol H+) |
sheet |
The number of the excel sheet containing the long-form Seahorse data. Default is 2 because the long-form output from Seahorse Wave is on sheet 2 |
a ggplot
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) make_bioscope_plot(rep_list, ph = 7.4, pka = 6.093, buffer = 0.1)
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) make_bioscope_plot(rep_list, ph = 7.4, pka = 6.093, buffer = 0.1)
Normalizes input data according to a sample normalization measure (e.g. cell
number or g of protein). It assumes your data is background
normalized.
normalize( seahorse_rates, norm_csv, norm_column = "well", norm_method = "minimum" )
normalize( seahorse_rates, norm_csv, norm_column = "well", norm_method = "minimum" )
seahorse_rates |
The seahorse rates table read by the |
norm_csv |
A csv file with either well or experimental group in column 1 and the sample normalization measure in column 2. Headers are ignored. |
norm_column |
Whether to normalize by |
norm_method |
How to normalize each well or experimental group (specified by
See details. |
This normalization is distinct from the background normalization done by the
Wave software. If the data are not background normalized, read_data()
will
output a warning showing rows with OCR, ECAR and PER values greater than 0.
When norm_method
is set to "self"
, each OCR, ECAR, and PER value is
divided by the measure it"self". OCR and ECAR values are divided by the
corresponding raw value in the "measure" column: an intra-well or
experimental group normalization. Each normalized value is then interpreted
as pmol/min per measure (e.g. pmol/min/cell or pmol/min/g of
protein.
When set to "minimum"
, each OCR, ECAR, and PER value is normalized by the
minimum value in the norm_csv
"measure" column. In this method, every
"measure" column's value in the provided CSV file is divided by the lowest
of the "measure" values to get a normalization factor for each well or
experimental group. The OCR, ECAR, and PER values in each well or
experimental group are divided by their corresponding normalization factors.
Compared to "self"
, this is an inter-well/experimental group normalization
based on the lowest "measure"
. The results may be interpreted as pmol/min
per minimum of the measure (eg: group cell count or g of protein.)
a normalized seahorse_rates data.table
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) norm_csv <- system.file("extdata", package = "ceas") |> list.files(pattern = "^norm.csv", full.names = TRUE) read.csv(norm_csv) seahorse_rates <- read_data(rep_list, sheet = 2) head(seahorse_rates, n = 10) # normalize by experimental group based on the minimum cell count or protein quantity seahorse_rates.normalized <- normalize( seahorse_rates, norm_csv, norm_column = "exp_group", norm_method = "minimum" ) head(seahorse_rates.normalized, n = 10)
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) norm_csv <- system.file("extdata", package = "ceas") |> list.files(pattern = "^norm.csv", full.names = TRUE) read.csv(norm_csv) seahorse_rates <- read_data(rep_list, sheet = 2) head(seahorse_rates, n = 10) # normalize by experimental group based on the minimum cell count or protein quantity seahorse_rates.normalized <- normalize( seahorse_rates, norm_csv, norm_column = "exp_group", norm_method = "minimum" ) head(seahorse_rates.normalized, n = 10)
Organizes Seahorse OCR and ECAR rates based on defined time points (i.e. the Measurement column) during the experiment. This time point can be specified if you are modifying the Mito and Glyco Stress Test (i.e. from 3 measurements per cycle to X measurements)
partition_data( seahorse_rates, assay_types = list(basal = "MITO", uncoupled = "MITO", maxresp = "MITO", nonmito = "MITO", no_glucose_glyc = "GLYCO", glucose_glyc = "GLYCO", max_glyc = "GLYCO"), basal_tp = 3, uncoupled_tp = 6, maxresp_tp = 8, nonmito_tp = 12, no_glucose_glyc_tp = 3, glucose_glyc_tp = 6, max_glyc_tp = 8 )
partition_data( seahorse_rates, assay_types = list(basal = "MITO", uncoupled = "MITO", maxresp = "MITO", nonmito = "MITO", no_glucose_glyc = "GLYCO", glucose_glyc = "GLYCO", max_glyc = "GLYCO"), basal_tp = 3, uncoupled_tp = 6, maxresp_tp = 8, nonmito_tp = 12, no_glucose_glyc_tp = 3, glucose_glyc_tp = 6, max_glyc_tp = 8 )
seahorse_rates |
A data.table of OCR and ECAR rates returned by |
assay_types |
A list that configures data partitioning based on the type of assay. See details. |
basal_tp |
Basal respiration time point. Must be less than |
uncoupled_tp |
ATP-coupled respiration time point. Must be less than |
maxresp_tp |
Maximal uncoupled respiration time point. Must be less than |
nonmito_tp |
Non-mitochondrial respiration time point. Must be larger than |
no_glucose_glyc_tp |
No glucose added acidification time point. Must be less than |
glucose_glyc_tp |
Glucose-associated acidification time point. Must be less than |
max_glyc_tp |
Maximal acidification time point. Must be less than |
Note: When we use the term 'max' in the package documentation we mean the maximal experimental OCR and ECAR values rather than absolute biological maximums.
partition_data
sets up the rates data for ATP calculations by the
get_energetics
function. To do this, it takes a list assay_types
with
the named values basal
, uncoupled
, maxresp
, nonmito
,
no_glucose_glyc
, glucose_glyc
, and max_glyc
. In the default setting,
it is configured for an experiment with both Mito and Glyco assays. However,
partitioning can be configured for other experimental conditions.
Only MITO data:
partitioned_data <- partition_data( seahorse_rates, assay_types = list( basal = "MITO", uncoupled = "MITO", maxresp = "MITO", nonmito = "MITO", no_glucose_glyc = NA, glucose_glyc = "MITO", max_glyc = NA ), basal_tp = 3, uncoupled_tp = 6, maxresp_tp = 8, nonmito_tp = 12, no_glucose_glyc_tp = NA, glucose_glyc_tp = 3, max_glyc_tp = NA )
Respiratory control ratio (RCR) and glycolytic capacity (GC) assay:
partitioned_data <- partition_data( seahorse_rates, assay_types = list( basal = "RCR", uncoupled = "RCR", maxresp = "RCR," nonmito = "RCR", no_glucose_glyc = NA, glucose_glyc = "GC", max_glyc = "GC" ), basal_tp = 3, uncoupled_tp = 6, maxresp_tp = 8, nonmito_tp = 12, no_glucose_glyc = NA, glucose_glyc_tp = 3, max_glyc_tp = 9 )
Data according to Mookerjee et al. 2017 J Biol Chem;292:7189-207.
partitioned_data <- partition_data( seahorse_rates, assay_types = list( basal = "RefAssay", uncoupled = "RefAssay", maxresp = NA, nonmito = "RefAssay", no_glucose_glyc = "RefAssay", glucose_glyc = "RefAssay", max_glyc = NA ), basal_tp = 5, uncoupled_tp = 10, nonmito_tp = 12, maxresp = NA, no_glucose_glyc_tp = 1, glucose_glyc_tp = 5, max_glyc = NA )
Also see the vignette.
a list of named time points from each assay cycle
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates)
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) partitioned_data <- partition_data(seahorse_rates)
Generate OCR and ECAR plots
rate_plot( seahorse_rates, measure = "OCR", assay = "MITO", model = "ols", error_bar = "ci", conf_int = 0.95, group_label = "Experimental group", linewidth = 2, sep_reps = FALSE, ci_method = "Wald" )
rate_plot( seahorse_rates, measure = "OCR", assay = "MITO", model = "ols", error_bar = "ci", conf_int = 0.95, group_label = "Experimental group", linewidth = 2, sep_reps = FALSE, ci_method = "Wald" )
seahorse_rates |
data.table Seahorse OCR and ECAR rates (imported using |
measure |
Whether to plot |
assay |
What assay to plot (e.g. "MITO" or "GLYCO") |
model |
The model used to estimate mean and confidence intervals: |
error_bar |
Whether to plot error bars as standard deviation ( |
conf_int |
The confidence interval percentage. Should be between 0 and 1 |
group_label |
Label for the experimental group to populate the legend title |
linewidth |
Width for the lines, passed to |
sep_reps |
Whether to calculate summary statistics on the groups with
replicates combined. The current default |
ci_method |
The method used to compute confidence intervals for the
mixed-effects model: |
a ggplot
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) rate_plot( seahorse_rates, measure = "OCR", error_bar = "ci", conf_int = 0.95, sep_reps = FALSE ) rate_plot( seahorse_rates, measure = "OCR", error_bar = "ci", conf_int = 0.95, sep_reps = TRUE )
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) rate_plot( seahorse_rates, measure = "OCR", error_bar = "ci", conf_int = 0.95, sep_reps = FALSE ) rate_plot( seahorse_rates, measure = "OCR", error_bar = "ci", conf_int = 0.95, sep_reps = TRUE )
Reads input seahore data from an excel Seahorse Wave File. It assumes your data is background normalized.
read_data( rep_list, norm = NULL, sheet = 2, delimiter = " ", norm_column = "exp_group", norm_method = "minimum" )
read_data( rep_list, norm = NULL, sheet = 2, delimiter = " ", norm_column = "exp_group", norm_method = "minimum" )
rep_list |
A list of Seahorse Wave excel export files. One file per
replicate. If your data is in a directory called "seahorse_data", use
|
norm |
A csv file with the experimental groups and their normalization
values. Leave unset if normalization is not required. See |
sheet |
The number of the excel sheet containing the long-form Seahorse data. Default is 2 because the long-form output from Seahorse Wave is on sheet 2 |
delimiter |
The delimiter between the group name and the assay type in the Group column of the wave output. e.g. "Group1 MITO" would use a space character as delimiter. |
norm_column |
Whether to normalize by |
norm_method |
How to normalize each well or experimental group (specified by
See the |
Although ceas enables integration of multiple biological and/or technical replicates, previous work has reported high inter-plate variation (Yepez et. al 2018). If you don't want your replicate data combined, you can either:
make sure that the names of the common groups between the replicates are different.
in downstream analyses (get_energetics_summary
, bioscope_plot
,
rate_plot
, atp_plot
), use sep_reps = TRUE
to do all calculations and
plotting separately for each replicate.
NOTE: to maintain backwards compatibility sep_reps
is currently
FALSE
by default, but will be set to TRUE
in a future release.
a seahorse_rates table
Yépez et al. 2018 OCR-Stats: Robust estimation and statistical testing of mitochondrial respiration activities using Seahorse XF Analyzer PLOS ONE 2018;13:e0199938. doi:10.1371/journal.pone.0199938
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) head(seahorse_rates, n = 10) # normalization by well using raw cell count or protein quantity norm_csv <- system.file("extdata", package = "ceas") |> list.files(pattern = "well_norm.csv", full.names = TRUE) seahorse_rates.norm <- read_data( rep_list, norm = norm_csv, norm_column = "well", norm_method = "self", sheet = 2 ) head(seahorse_rates.norm, n = 10)
rep_list <- system.file("extdata", package = "ceas") |> list.files(pattern = "*.xlsx", full.names = TRUE) seahorse_rates <- read_data(rep_list, sheet = 2) head(seahorse_rates, n = 10) # normalization by well using raw cell count or protein quantity norm_csv <- system.file("extdata", package = "ceas") |> list.files(pattern = "well_norm.csv", full.names = TRUE) seahorse_rates.norm <- read_data( rep_list, norm = norm_csv, norm_column = "well", norm_method = "self", sheet = 2 ) head(seahorse_rates.norm, n = 10)