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:
Single-cell data: EpiTrace measures accessibility per cell - Cells with more mitotic divisions have lost clock-like accessibility - The algorithm directly measures this loss
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-cellEpiTraceAge_Convergence()- Iterative refinement, no automatic transformationEpiTraceAge()- 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
Mixing bulk and single-cell data: Always analyze them separately, then compare results
Forgetting to document: Always note whether you’re using raw or transformed EpiTrace age
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