<p>Automated gating methods are gaining popularity over manual and time consuming analysis in say <a href="https://www.flowjo.com/" rel="nofollow noreferrer">FlowJo</a>, you should take a look at the <a href="http://bioconductor.org/packages/release/bioc/html/openCyto.html" rel="nofollow noreferrer">openCyto</a> bioconductor package this is a framework which builds on top of existing Bioconductor infrastructure for flow cytometry <a href="http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003806" rel="nofollow noreferrer">(PLOS compbio paper)</a> with the aim of making various analysis routes more accessible to the researcher by assisting getting data into and out various gating algorithms. You can find a nice intro <a href="http://bioconductor.org/packages/release/bioc/vignettes/openCyto/inst/doc/openCytoVignette.html" rel="nofollow noreferrer">here</a> which starts with importing a manual gating scheme from FlowJo and a how-to on 1D and 2D gating can also be found <a href="https://www.bioconductor.org/packages/devel/bioc/vignettes/openCyto/inst/doc/HowToAutoGating.html" rel="nofollow noreferrer">here</a>. </p>

<p>An excellent YouTube intro to analysing flow data in R by Ryan Duggan <a href="https://www.youtube.com/watch?v=_B7mo6dB3BU" rel="nofollow noreferrer">Cytometry on Air</a> is worth watching especially for those which have no R experience and are curious as to what can be achieved.  Additionally it's worth having a look at the growing list of Bioconductor packages and datasets that exists for flow data: <a href="https://www.bioconductor.org/help/search/index.html?q=cytometry/" rel="nofollow noreferrer">https://www.bioconductor.org/help/search/index.html?q=cytometry/</a></p>

CC BY-SA 3.0
2017-06-04T12:09:34.170Z
2017-06-04T12:09:34.170Z
Matt Bashton
<p>There are quite a few algorithms developed for the automatic classification of multidimensional flow cytometry data, you can see a (not so recent?) review here: <a href="http://www.nature.com/nmeth/journal/v10/n3/full/nmeth.2365.html" rel="nofollow noreferrer">http://www.nature.com/nmeth/journal/v10/n3/full/nmeth.2365.html</a>. In your case, you are interested in the <strong>unsupervised</strong> methods, since you do not have data from single populations (which would provide you "labels" associated to each sample), as I understood. </p>

<p>In other words, if you have your data set as a matrix of 5 million samples (cells) with 14 dimensions (FC values) each, then you are looking basically for algorithms that will do a <em>clustering</em> of the samples into groups. By the way your description of each sample belonging to a multivariate Normal distribution leads to a <strong>Gaussian Mixture Model</strong>, which can be estimated from your data using e.g. the scikit-learn library for python: <a href="http://scikit-learn.org/stable/modules/mixture.html" rel="nofollow noreferrer">http://scikit-learn.org/stable/modules/mixture.html</a></p>

CC BY-SA 3.0
2017-06-04T11:13:06.240Z
2017-06-04T11:13:06.240Z
Leo Martins
<p>Our research institute processes a lot of flow cytometry data, but the produced data is under-utilised due to the effort required to process it. A typical run will produce 5 million events (ideally one event per cell), with up to 14 dimensions of [ideally] log-normal fluorescence values for particular groups of cells ("populations"). Due to various systematic errors, negative values, scatter, and a non-zero "zero" value can happen, but I'm going to ignore those for the purpose of this question and assume that the data are well-distributed.</p>

<p>Researchers will typically probe these data using manual filters (set up specifically for each experiment) to find populations of interest. I suppose a picture might help. This one shows three identifiable cell populations, in order of size one at about (X/Ly6C:2,Y/CD86:2), one at about (4.5,3), and one small population at (2,4).</p>

<p><a href="https://i.sstatic.net/ErbhE.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/ErbhE.png" alt="CD86 vs Ly6C flow plot"></a></p>

<p>Here's another plot that has two cell populations that are close to each other, such that the population "humps" overlap substantially.</p>

<p><a href="https://i.sstatic.net/jJ72F.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/jJ72F.png" alt="B220 vs CD11b flow plot"></a> </p>

<p>Manual filters are typically used because it can be very difficult to distinguish between a noisy data point from a large cell population and a less noisy data point from a small cell population, particularly when considering populations that make up about 0.01% of the total cells.</p>

<p>As an additional complication, counting these populations can be difficult when populations overlap (as in the second image). A filter/slice through the plot that separates populations could count many cells as being members of the wrong population.</p>

<p>Can these populations be detected in an automated way? If it is assumed that the populations are spread in a gaussian fashion at some point in each dimension, is there some method that can be used to approximate the number of cells in each population, even when populations are close by?</p>

<flow-cytometry><peak-calling>
Finding peaks and estimating cell population sizes in multi-dimensional flow cytometry data
# Finding peaks and estimating cell population sizes in multi-dimensional flow cytometry data

(Asked by: username_0 on 2017-06-04)

Our research institute processes a lot of flow cytometry data, but the produced data is under-utilised due to the effort required to process it. A typical run will produce 5 million events (ideally one event per cell), with up to 14 dimensions of [ideally] log-normal fluorescence values for particular groups of cells ("populations"). Due to various systematic errors, negative values, scatter, and a non-zero "zero" value can happen, but I'm going to ignore those for the purpose of this question and assume that the data are well-distributed.

Researchers will typically probe these data using manual filters (set up specifically for each experiment) to find populations of interest. I suppose a picture might help. This one shows three identifiable cell populations, in order of size one at about (X/Ly6C:2,Y/CD86:2), one at about (4.5,3), and one small population at (2,4).

[![CD86 vs Ly6C flow plot](https://i.sstatic.net/ErbhE.png)](https://i.sstatic.net/ErbhE.png)

Here's another plot that has two cell populations that are close to each other, such that the population "humps" overlap substantially.

[![B220 vs CD11b flow plot](https://i.sstatic.net/jJ72F.png)](https://i.sstatic.net/jJ72F.png)

Manual filters are typically used because it can be very difficult to distinguish between a noisy data point from a large cell population and a less noisy data point from a small cell population, particularly when considering populations that make up about 0.01% of the total cells.

As an additional complication, counting these populations can be difficult when populations overlap (as in the second image). A filter/slice through the plot that separates populations could count many cells as being members of the wrong population.

Can these populations be detected in an automated way? If it is assumed that the populations are spread in a gaussian fashion at some point in each dimension, is there some method that can be used to approximate the number of cells in each population, even when populations are close by?

**Tags:** flow-cytometry, peak-calling

---

## 2 answers

### Answer by username_1 on 2017-06-04. Score: 2

Automated gating methods are gaining popularity over manual and time consuming analysis in say [FlowJo](https://www.flowjo.com/), you should take a look at the [openCyto](http://bioconductor.org/packages/release/bioc/html/openCyto.html) bioconductor package this is a framework which builds on top of existing Bioconductor infrastructure for flow cytometry [(PLOS compbio paper)](http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003806) with the aim of making various analysis routes more accessible to the researcher by assisting getting data into and out various gating algorithms. You can find a nice intro [here](http://bioconductor.org/packages/release/bioc/vignettes/openCyto/inst/doc/openCytoVignette.html) which starts with importing a manual gating scheme from FlowJo and a how-to on 1D and 2D gating can also be found [here](https://www.bioconductor.org/packages/devel/bioc/vignettes/openCyto/inst/doc/HowToAutoGating.html).

An excellent YouTube intro to analysing flow data in R by Ryan Duggan [Cytometry on Air](https://www.youtube.com/watch?v=_B7mo6dB3BU) is worth watching especially for those which have no R experience and are curious as to what can be achieved. Additionally it's worth having a look at the growing list of Bioconductor packages and datasets that exists for flow data: <https://www.bioconductor.org/help/search/index.html?q=cytometry/>


---

### Answer by username_2 on 2017-06-04. Score: 2

There are quite a few algorithms developed for the automatic classification of multidimensional flow cytometry data, you can see a (not so recent?) review here: <http://www.nature.com/nmeth/journal/v10/n3/full/nmeth.2365.html>. In your case, you are interested in the **unsupervised** methods, since you do not have data from single populations (which would provide you "labels" associated to each sample), as I understood.

In other words, if you have your data set as a matrix of 5 million samples (cells) with 14 dimensions (FC values) each, then you are looking basically for algorithms that will do a *clustering* of the samples into groups. By the way your description of each sample belonging to a multivariate Normal distribution leads to a **Gaussian Mixture Model**, which can be estimated from your data using e.g. the scikit-learn library for python: <http://scikit-learn.org/stable/modules/mixture.html>


---

