<p>The more genes you have the more robust the scaling factor is (among the reason why one doesn't normalize to ERCC spike-ins without a compelling reason), so I suppose in theory it's better to filter after determining the scale factor. Having said that, I'd be surprised if the results changed much either way. Unless you end up filtering out a LOT of genes the scaling factors should be fairly robust to the change.</p>

CC BY-SA 3.0
2017-07-27T14:13:25.247Z
Since edgeR uses a robust estimator for the scaling factor (TMM?), you’re right, it shouldn’t make much difference.
Konrad Rudolph
CC BY-SA 3.0
2017-07-27T15:44:16.950Z
tximport's documentation implies that I need to supply my own offset when moving data into edgeR.  If I create an offset matrix using my above code and then remove a large portion of lowly expressed genes, will the previously created offset matrix be incorrect?  Do I even need to supply an offset in this case as I think edgeR can calculate it automatically.
J0HN_TIT0R
CC BY-SA 3.0
2017-07-27T06:37:14.703Z
2017-07-27T06:37:14.703Z
Devon Ryan
<p>I have RNA seq data which I've quantified using Kallisto.  I'd like to use tximport to transform the read count data into input for EdgeR, following the R code supplied in the tximport documentation:</p>

<pre class="lang-r prettyprint-override"><code>cts &lt;- txi$counts
normMat &lt;- txi$length
normMat &lt;- normMat/exp(rowMeans(log(normMat)))
library(edgeR)
o &lt;- log(calcNormFactors(cts/normMat)) + log(colSums(cts/normMat))
y &lt;- DGEList(cts)
y$offset &lt;- t(t(log(normMat)) + o)
# y is now ready for estimate dispersion functions see edgeR User's Guide
</code></pre>

<p>I would ideally follow this up with EdgeR's exactTest.  However, I'd also like to remove genes with low read counts using code such as this:</p>

<pre class="lang-r prettyprint-override"><code>filterCounts &lt;- function(counts) {
  cpms &lt;- cpm(counts)
  keep &lt;- rowSums(cpms &gt; 1) &gt;= 1
  counts[keep,]
}
</code></pre>

<p>The only issue is that I can't tell whether I should remove the genes with low read counts before or after I normality the counts while importing with tximport in the first code.  I'm thinking that it would be best to do this before, editing out the abundance, counts, and length rows of the txi data frame which correspond to lowly expressed genes, but I would like this to be confirmed before I proceed.</p>

<rna-seq><r><edger><best-practice>
When performing differential expression analysis, should genes with low read counts be removed before or after normalization?
# When performing differential expression analysis, should genes with low read counts be removed before or after normalization?

(Asked by: username_0 on 2017-07-27)

I have RNA seq data which I've quantified using Kallisto.  I'd like to use tximport to transform the read count data into input for EdgeR, following the R code supplied in the tximport documentation:
cts <- txi$counts
normMat <- txi$length
normMat <- normMat/exp(rowMeans(log(normMat)))
library(edgeR)
o <- log(calcNormFactors(cts/normMat)) + log(colSums(cts/normMat))
y <- DGEList(cts)
y$offset <- t(t(log(normMat)) + o)
# y is now ready for estimate dispersion functions see edgeR User's Guide

I would ideally follow this up with EdgeR's exactTest.  However, I'd also like to remove genes with low read counts using code such as this:
filterCounts <- function(counts) {
  cpms <- cpm(counts)
  keep <- rowSums(cpms > 1) >= 1
  counts[keep,]
}

The only issue is that I can't tell whether I should remove the genes with low read counts before or after I normality the counts while importing with tximport in the first code.  I'm thinking that it would be best to do this before, editing out the abundance, counts, and length rows of the txi data frame which correspond to lowly expressed genes, but I would like this to be confirmed before I proceed.

**Tags:** rna-seq, r, edger, best-practice

---

## 1 answers

### Answer by username_1 on 2017-07-27. Score: 6 | Accepted answer

The more genes you have the more robust the scaling factor is (among the reason why one doesn't normalize to ERCC spike-ins without a compelling reason), so I suppose in theory it's better to filter after determining the scale factor. Having said that, I'd be surprised if the results changed much either way. Unless you end up filtering out a LOT of genes the scaling factors should be fairly robust to the change.

> **Comments:**
> **username_2**: Since edgeR uses a robust estimator for the scaling factor (TMM?), you’re right, it shouldn’t make much difference.  
> **username_0**: tximport's documentation implies that I need to supply my own offset when moving data into edgeR.  If I create an offset matrix using my above code and then remove a large portion of lowly expressed genes, will the previously created offset matrix be incorrect?  Do I even need to supply an offset in this case as I think edgeR can calculate it automatically.  

---

