"""
Author: Padarn Wilson

Performance of normal reference plug-in estimator vs silverman. Sample is drawn
from a mixture of gaussians. Distribution has been chosen to be reasoanbly close
to normal.
"""

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

from statsmodels.distributions.mixture_rvs import mixture_rvs
import statsmodels.nonparametric.api as npar

# example from test_kde.py mixture of two normal distributions
np.random.seed(12345)
x = mixture_rvs(
    [0.1, 0.9],
    size=200,
    dist=[stats.norm, stats.norm],
    kwargs=(dict(loc=0, scale=0.5), dict(loc=1, scale=0.5)),
)

kde = npar.KDEUnivariate(x)


kernel_names = [
    "Gaussian",
    "Epanechnikov",
    "Biweight",
    "Triangular",
    "Triweight",
    "Cosine",
]

kernel_switch = ["gau", "epa", "tri", "biw", "triw", "cos"]


def true_pdf(x):
    pdf = 0.1 * stats.norm.pdf(x, loc=0, scale=0.5)
    pdf += 0.9 * stats.norm.pdf(x, loc=1, scale=0.5)
    return pdf


fig = plt.figure()
for ii, kn in enumerate(kernel_switch):

    ax = fig.add_subplot(2, 3, ii + 1)  # without uniform

    ax.hist(x, bins=20, density=True, alpha=0.25)

    kde.fit(kernel=kn, bw="silverman", fft=False)
    ax.plot(kde.support, kde.density)

    kde.fit(kernel=kn, bw="normal_reference", fft=False)
    ax.plot(kde.support, kde.density)

    ax.plot(kde.support, true_pdf(kde.support), color="black", linestyle="--")

    ax.set_title(kernel_names[ii])


ax.legend(["silverman", "normal reference", "true pdf"], loc="lower right")
ax.set_title("200 points")
plt.show()
