Betrachten Sie eine Summe von n
im Quadrat bei normalen Zufallsvariablen S = sum (Z^2(mu, sig^2))
. Gemäß this question hat S/sig^2
eine noncentral chi-squared distribution mit Freiheitsgraden = n
und Nicht-Zentralität Parameter = n*mu^2
.Scipy Nicht-zentrale Chi-Quadrat-Zufallsvariable
jedoch vergleichen N
dieser Variablen zu erzeugen S
durch squared Normale Summieren mit der Erzeugung von N
nichtzentrale Chi-Quadrat-Zufallsvariablen direkt scipy.ncx2
mit:
import numpy as np
from scipy.stats import ncx2, chi2
import matplotlib.pyplot as plt
n = 1000 # number of normals in sum
N_MC = 100000 # number of trials
mu = 0.05
sig = 0.3
### Generate sums of squared normals ###
Z = np.random.normal(loc=mu, scale=sig, size=(N_MC, n))
S = np.sum(Z**2, axis=1)
### Generate non-central chi2 RVs directly ###
dof = n
non_centrality = n*mu**2
NCX2 = sig**2 * ncx2.rvs(dof, non_centrality, size=N_MC)
# NCX2 = sig**2 * chi2.rvs(dof, size=N_MC) # for mu = 0.0
### Plot histos ###
fig, ax = plt.subplots()
ax.hist(S, bins=50, label='S')
ax.hist(NCX2, bins=50, label='NCX2', alpha=0.7)
ax.legend()
plt.show()
Dies führt in den Histogrammen
Ich glaube, die Mathematik ist richtig; Könnte die Diskrepanz ein Fehler in der ncx2
Implementierung sein? Einstellen mu = 0
und scipy.chi2
mit sieht viel besser aus:
Das scheint zu helfen. Würde es Ihnen etwas ausmachen, ein bisschen zu erarbeiten? – bcf
Ich fügte etwas Ausarbeitung hinzu. –