De acuerdo a una receta que le dan en la Wikipedia, he intentado generación de la t de Student, distribuidos al azar los números con tres grados de libertad. Yo también generan estos números con numpy en-construido generador de número aleatorio para la distribución t. Sin embargo, creo que los números que me genera el uso de la Wikipedia de la prescripción no se alinean bien con el análisis de la forma de la distribución. La siguiente figura muestra las cinco de la muestra los histogramas para cada caso: manual (Wikipedia) generación (fila superior) y el de python en-construido generación (fila inferior). Siento que alrededor de $x = 0$, hay algún problema. Yo estoy en lo correcto en mi observación? Si sí, ¿qué está mal con la forma en que estoy haciendo? Mi código de python también es dado a continuación..
Cada histograma contiene $10000$ números y la curva verde representa el análisis de la distribución de
import numpy as np
import matplotlib.pyplot as plt
plt.style.use("seaborn")
import seaborn as sns
from scipy.stats import t
"""Generate t distributed values"""
def f(x, mu):
n = len(x)
return np.sqrt(n) * (x.mean()-mu)/ x.std()
mu = 0
df = 3
for i in range(5):
plt.subplot(2,5,i+1)
t_vals = [f(np.random.normal(loc = mu, size = df + 1), mu) for i in range(10000)]
sns.distplot(t_vals, kde = False, norm_hist = True)
x = np.linspace(-5, 5, 100)
plt.plot(x, t.pdf(x, df))
plt.xlim([-5, 5])
plt.xlabel(r"$x$")
if i == 0:
plt.ylabel(r"$p(x)$")
if i == 2:
plt.title("Manually generated")
for i in range(5):
plt.subplot(2,5,i+6)
t_vals = np.random.standard_t(df, size = 10000)
sns.distplot(t_vals, kde = False, norm_hist = True)
x = np.linspace(-5, 5, 100)
plt.plot(x, t.pdf(x, df))
plt.xlim([-5, 5])
plt.xlabel(r"$x$")
if i == 0:
plt.ylabel(r"$p(x)$")
if i == 2:
plt.title("Generated using python")
plt.tight_layout()
plt.savefig("t_dists.pdf", bboxinches = "tight")