I have a simulated data set which is comprised of multiple sub-populations (or samples), each sub-population is drawn from, and described by, its own Gaussian distribution (although by chance, sub-populations can have identical distribution properties). Below, we can see this data set shown as a function of measurement index (or time):

enter image description here

Because this dataset is simulated, I know where the sub-population "boundaries are", and I have marked them on the plot (red lines indicate the sub-population mean, while blue is a $\mu\pm1\sigma$ boundary).

If one looks at the PDF of the entire data set, then we see something that resembles a Gaussian Mixture Distribution -- this may not be a Gaussian Mixture Distribution in the conventional sense, as the "weights" are defined by the number of points in a given sub-population, rather than the probability of an observation belonging to a component distribution of the mixture.


What I want to achieve, is the ability to split this dataset back into its component sub-populations. I think some kind of GMM based clustering may be the way to do this. I've tried using the R library Mclust, but had only limited success.

If I import the data as univariate, then I get some strange classification results (for G = 2 and G = 16):

enter image description here

As you can see, nothing looks very Gaussian.

If I keep the indexing (or temporal information), and import as $x-y$ data, then I get some more reasonable classification, but not in the way I would expect for this kind of data:

enter image description here

Here we can see that the clusters are being found as ellipsoids -- a consequence of the model choice and constraints. In my case I would expect/want a "rectangular" profile

I don't expect to be able to perfectly reconstruct the sub-populations, especially if they have very similar distribution properties, but I would like to find a method of decomposing the data set in an unbiased way -- i.e. remove the bias of my choice of decomposition if I were to do it manually.

If anyone can suggest a way I can achieve this, either with another R library, or another technique -- maybe my GMM approach is a dead end.

My fundamental objective is to split the data set into its constituent component sub-populations in an unbiased way.

  • 1
    $\begingroup$ Have you considered changpoint analysis where you attempt to estimate points in time when the mean and/or variance of the time series changes? $\endgroup$ – Ryan Volpi Jan 25 at 15:20
  • $\begingroup$ I haven't heard of this kind of analysis! Would you be willing to expand a bit on it? I'm open to other alternatives and I'm not wedded to the GMM, it just seemed the most intuitive. $\endgroup$ – Q.P. Jan 25 at 15:22
  • $\begingroup$ @RyanVolpi I just wanted to say thanks, as I did some research into this -- it's exactly what I want! $\endgroup$ – Q.P. Jan 25 at 21:09

Since it sounds like I answered your question, I'll expand a bit on my comment so that this question can hopefully be closed. GMMs are not well suited to this problem because, in the one dimensional case, they discard all temporal information and, in the two-dimensional case, they interpret the temporal information as a second dimension along which the data is randomly distributed. That's why you get round clusters in two dimensions.

What you actually want is to identify the points in time where the data generating process abruptly changes. This is called changepoint analysis. Many packages exist in R and Python. Just make sure to choose one which allows you to detect shifts in mean and variance.

  • $\begingroup$ I'm glad you decided to expand and leave an answer. I'm also going to award you a bounty as this was an incredibly fruitful area for me to investigate. Thanks again. $\endgroup$ – Q.P. Jan 29 at 16:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.