7 votos

La generación de t-distribuidos al azar los números: un menor número cercano a cero.

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

enter image description here

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")

9voto

Lev Puntos 2212

Versión corta: el problema que se encuentra con NumPy x.std() que no dividir por el derecho grados de libertad.

Repetir el experimento en la I muestra ninguna discrepancia: ya sea comparando el histograma con la teórica del Estudiante $t$ densidad con tres grados de libertad

enter image description here

o la uniformidad de la transformación de la muestra por el teórico del Estudiante $t$ cdf con tres grados de libertad

enter image description here

o el correspondiente QQ-plot:

enter image description here

La muestra de tamaño 10⁵ se produce de la siguiente forma en R:

X=matrix(rnorm(4*1e5),ncol=4)
Z=sqrt(4)*apply(X,1,mean)/apply(X,1,sd)

El test de Kolmogorov-Smirnov también se produce una aceptación de la nula:

> ks.test(Z,"pt",df=3)

    One-sample Kolmogorov-Smirnov test

data:  Z
D = 0.0039382, p-value = 0.08992
alternative hypothesis: two-sided

para una muestra, y

>  ks.test(Z,"pt",df=3)

    One-sample Kolmogorov-Smirnov test

data:  Z
 D = 0.0019529, p-value = 0.8402
 alternative hypothesis: two-sided

para la próxima.

Sin embargo, NumPy no define el estándar varianza de la norma (Gosset): se utiliza en lugar de la raíz de $$\frac{1}{n}\sum_{i=1}^n (x_i-\bar{x})^2$$ lo que conduce a una $t$ distribución inflado por $$\sqrt\frac{n}{n-1}$$ y, por tanto, la discrepancia observada:

> ks.test(sqrt(4/3)*Z,"pt",df=3)

        One-sample Kolmogorov-Smirnov test

data:  Z
D = 0.030732, p-value < 2.2e-16
alternative hypothesis: two-sided

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X