Compute per-period growth rates for time-course screens
Source:R/fit_SE.timecourse.R
compute_growth_rates.RdStage 1 of the time-course pipeline: fits a growth rate per well within each
time window, aggregates replicates, and normalises the rates to the control
wells of a reference period. The returned table keeps every treatment,
controls included, together with the raw rate and its standard deviation, so
it can be reported on directly. Pass it through
growth_rates_to_se to obtain the stage 2 input, or use
fit_SE.timecourse to run both stages at once.
Arguments
- se
SummarizedExperimentwith a log-fold-change assay.- periods
named list of numeric vectors of length 2; half-open time windows
c(start_hour, end_hour), seefit_SE.timecourse.- normalization_map
named character vector mapping every period to its reference period or to
"None", seefit_SE.timecourse.- lfc_assay
string or
NULL; name of the log-fold-change assay.NULLuses theinput_assayof the"time-course"fit profile (seeget_fit_profile).- rate_fn
function or
NULL; growth-rate estimator. It receives adata.tableholding the timepoints of one well within one window — including the duration column and the log-fold-change column — and must return a single numeric value: the growth rate in doublings per day.NULLuses the slope oflm(LogFoldChange ~ Duration).
Value
A data.table with one row per
(CellLine, Drug, Concentration, partner slots, period) — controls
included — holding GrowthRate (doublings/day), sd_GrowthRate
across replicate wells, rate_0 (the control baseline pooled over all
plates, NA for periods mapped to "None" and when no control rows
are present), NormalizedGrowthRate with sd_NormalizedGrowthRate
across replicate wells, and normalization_type. All of these
columns are always present, whatever the normalization map or the
availability of controls. NormalizedGrowthRate is NA where
the control baseline is not meaningfully positive: such a denominator
either inverts the sign of the ratio (when negative) or leaves it undefined
(when zero, within fitting tolerance) rather than scaling it, so no
meaningful normalized rate exists. A warning names the cell line and
period.
Details
Growth rates are computed per (Barcode, WellRow, WellColumn, CellLine,
Drug, Concentration, partner drug/concentration slots) group, so
single-agent, doublet and triplet arms are never pooled. Control wells are
detected via gDRutils::get_env_identifiers("untreated_tag"). Each well
is normalized to the mean control rate of its own plate and cell line before
the replicates are averaged, so plates that grow at different rates do not
widen the spread; a plate without a control of its own falls back to the
baseline pooled over all plates, with a warning.
Examples
if (FALSE) { # \dontrun{
periods <- list(early = c(0, 48), late = c(48, 96))
norm_map <- c(early = "None", late = "early")
growth_dt <- compute_growth_rates(se_tc, periods, norm_map)
# Stage 2 with any custom fit function:
se_fit <- gDRutils::apply_fit(
growth_rates_to_se(growth_dt),
fit_fn = my_fit_fn,
data_type = "time-course-metrics",
output_assay = "Metrics",
merge = "replace",
fit_source = "custom"
)
} # }