Skip to contents

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.

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()