Interpreting EpiTrace Age

Understanding Bulk vs Single-Cell EpiTrace Age

Important

EpiTrace age interpretation differs between bulk and single-cell ATAC-seq data

Key Points

  • Single-cell ATAC-seq: EpiTrace age is positively correlated with mitotic age - Higher EpiTrace age = Older cells (more mitotic divisions) - No transformation needed

  • Bulk ATAC-seq: EpiTrace age is negatively correlated with mitotic age - Higher EpiTrace age = Younger cell populations - Transformation: 1 - rank/max(rank) may be applied for visualization

Why the Difference?

The difference arises from how chromatin accessibility patterns are aggregated:

  1. Single-cell data: EpiTrace measures accessibility per cell - Cells with more mitotic divisions have lost clock-like accessibility - The algorithm directly measures this loss

  2. Bulk data: EpiTrace measures average accessibility across cell populations - Populations with more mitotic cells have lost clock-like accessibility - The inverse relationship emerges from population averaging

How EpiTrace Functions Handle This

EpiTrace functions do NOT automatically detect or transform based on data type:

  • RunEpiTraceAge() - Computes age without considering bulk vs single-cell

  • EpiTraceAge_Convergence() - Iterative refinement, no automatic transformation

  • EpiTraceAge() - Core age calculation function

You must manually apply the appropriate interpretation for your data type.

Practical Examples

Single-Cell Data Example

# Load single-cell ATAC data
data("scATAC_example")

# Run EpiTrace
obj <- EpiTrace_prepare_object(peakset, matrix, celltype)
obj <- RunEpiTraceAge(obj)

# Interpret: Higher EpiTraceAge = Older cells
# No transformation needed
plot(obj$EpiTraceAge_AllClock, main="EpiTrace Age (higher = older)")

Bulk Data Example

# Load bulk ATAC data
data("bulkATAC_example")

# Run EpiTrace
obj <- EpiTrace_prepare_object(peakset, matrix, celltype)
obj <- RunEpiTraceAge(obj)

# Interpret: Higher EpiTraceAge = Younger population
# For visualization, you may want to invert:
obj$EpiTraceAge_Inverted <- 1 - obj$EpiTraceAge_AllClock
plot(obj$EpiTraceAge_Inverted, main="EpiTrace Age (higher = older)")

When to Use Transformation

Do NOT transform (use raw EpiTrace age): * Single-cell data analysis * Comparing relative age ordering within cells * Using age as a continuous variable in downstream analysis

Consider transforming (e.g., 1 - rank/max(rank)): * Bulk data visualization * Making bulk results intuitive (“higher = older”) * Publication figures where biological age increases from left to right

Common Pitfalls

  1. Mixing bulk and single-cell data: Always analyze them separately, then compare results

  2. Forgetting to document: Always note whether you’re using raw or transformed EpiTrace age

  3. Comparing across platforms: Bulk and single-cell EpiTrace ages are not directly comparable

References

For more details, see: * Xiao et al. (2024) Nature Biotechnology - Methods section * Bulk_ATAC tutorial - Bulk data examples * scATAC_cIPSC tutorial - Single-cell data examples