Fitting mixture of binomials

Sorry – you posted 2 figured and asked if it was DGP1 or DGP2. The scenario should be like DGP2 in principle.

The figure above is what I get from my simulations with a fixed fraction of 0.5 (as you said how you locked it).

See below

background_rate = 1e-4
signal_rate=5e-2

simulated_data = pd.DataFrame(
    data = [ss.norm.rvs(loc = 10_000, scale = 1_500, size = 500)],
    index = ["N"]
).T

simulated_data["N"] = simulated_data["N"].astype(int)
simulated_data["sample_type"] = [np.random.randint(2) for i in range(len(simulated_data))]

simulated_data["fraction"] = 0.5#ss.uniform.rvs(size=500)

simulated_data["background_counts"] = ss.binom.rvs(n=simulated_data["N"],p=background_rate)

simulated_data["non_fractional_signal_counts"] = ss.binom.rvs(n=simulated_data["N"],p=signal_rate)
cnd = simulated_data["sample_type"] == 0
simulated_data.loc[cnd,"non_fractional_signal_counts"] = 0

simulated_data["signal_counts"] = simulated_data["non_fractional_signal_counts"]*simulated_data["fraction"]
simulated_data["observed_counts"] = simulated_data["signal_counts"] + simulated_data["background_counts"]*(1-simulated_data["fraction"])

simulated_data["observed_counts"] = simulated_data["observed_counts"].astype(int)
for col in simulated_data:
    plt.figure(figsize=(7,5))
    sns.histplot(simulated_data[col])