This vignette will show the most suitable commands to work with pulse-chase data.
Throughout this vignette, we will be using the GRAND-SLAM processed SLAM-seq data set from Herzog et al. 2017 [1]. The data set includes SLAM-seq pulse-chase samples of mouse embryonic stem cells (mESCs) with pulse durations of 0, 0.5, 1, 3, 6, 12, and 24 hours.
First we load the data and do the standard preprocessing steps. For more on these initial commands see the Loading data and working with grandR objects vignette.
In this step, we need to modify the sample names in the data, as the
names were not processed using systematic naming conventions. If
systematic sample names were used, the rename.sample
parameter would not be necessary. This parameter allows us to specify a
function for renaming the samples. The specified function removes all
occurrences of “.chase” and replaces 0.5 with 0_5. For example,
“mESC.0.5h.chase.B” becomes “mESC.0_5h.B” and “mESC.0h.chase.C” becomes
“mESC.0h.C”. The output of the function is the modified vector after
these replacements. This enables us to load the data using the design
vector.
d=ReadGRAND("https://zenodo.org/record/7612564/files/chase_notrescued.tsv.gz?download=1",
design=c(NA,"Time",Design$Replicate),
rename.sample=function(v)
gsub(".chase","",gsub("0.5h","0_5h",v))
)
d=FilterGenes(d)
d=Normalize(d)
The FitKinetics
function can be utilized to analyze
pulse-chase experiment data and estimate the synthesis and degradation
rates of genes. To perform this analysis, the type parameter of the
function should be set to “chase”. The function requires a grandR object
as input, which holds the data from the pulse-chase experiment.
In addition to the required input, the FitKinetics
function also has several optional parameters that allow for
customization of the analysis. For further information on these
parameters, please refer to the Kinetic
modeling vignette.
The FitKinetics
function uses the information in the
grandR object and the specified parameters to fit a non-linear least
squares model that describe the pulse-chase data. After fitting the
models, the function returns a grandR object with an added analysis
table that contains the inferred synthesis and degradation rates.
SetParallel()
d=FitKinetics(d,time="Time",type="chase")
The function GetAnalysisTable
can be used to retrieve
the results from this analysis.
head(GetAnalysisTable(d))
Gene | Symbol | Length | Type | kinetics.Synthesis | kinetics.Half-life | |
---|---|---|---|---|---|---|
Qsox1.155778412 | Qsox1.155778412 | Qsox1.155778412 | 258 | Unknown | 24.52101 | 3.450422 |
Ipo9.135384724 | Ipo9.135384724 | Ipo9.135384724 | 250 | Unknown | 42.98301 | 6.117657 |
Rpl37a.72713813 | Rpl37a.72713813 | Rpl37a.72713813 | 437 | Unknown | 180.89412 | 10.772538 |
Igfbp2.72852476 | Igfbp2.72852476 | Igfbp2.72852476 | 255 | Unknown | 215.53024 | 8.569694 |
Plekhb2.34879585 | Plekhb2.34879585 | Plekhb2.34879585 | 258 | Unknown | 35.69438 | 2.462591 |
Gmppa.75443176 | Gmppa.75443176 | Gmppa.75443176 | 252 | Unknown | 11.87146 | 6.073079 |
We can also visualize single genes graphically (this is the same gene as used in Fig 4a in Herzog et al. 2017 [1]):
PlotGeneProgressiveTimecourse(d,gene=Genes(d,"Dnmt3b",regex=TRUE),time="Time",type="chase")
The curves represent the fitted model for this gene. Note that we do
not specify the gene name directly, since here the gene names were
labeled differently, and the Genes()
function can be used
to find the matching label:
Genes(d,"Dnmt3b",regex=TRUE)
[1] "Dnmt3b.153687730"
In this step, we compare the half-life values obtained from the
FitKinetics
function with those from Herzog et al. The
latter was estimated by observing the decrease in mismatches during the
chase period, while our method also considers the GRAND-SLAM-estimated
NTR and posterior. To compare, we add Herzog et al’s half-life values to
our analysis table and create a scatter plot with half-life values on
both the x and y axes. The plot clearly shows a correlation between the
two sets of results, indicating that the FitKinetics
results are consistent with those from Herzog et al.
t=read.delim("https://zenodo.org/record/7612564/files/halflifes.tsv?download=1")
t$Gene=paste0(t$Name,".",t$End)
d = AddAnalysis(data = d,"kinetics",table = t,by="Gene")
PlotScatter(d,`kinetics.Half.life..h.`,`kinetics.Half-life`,
correlation = FormatCorrelation())+geom_abline()