data = auc_mtx[regulon_name].values.reshape(-1, 1)
gmm = mixture.GaussianMixture(n_components=2, covariance_type="full").fit(data)
avgs = gmm.means_
stds = np.sqrt(gmm.covariances_.reshape(-1, 1))
// The threshold is based on the distribution with the highest mean and is defined as (mu - 2 x std)
idx = np.argmax(avgs)
threshold = max(avgs[idx] - 2 * stds[idx], 0)
// This threshold cannot be lower than (mu + 2 x std) based on the distribution with the lowest mean.
idx = np.argmin(avgs)
lower_bound = avgs[idx] + 2 * stds[idx]