2016-08-04 44 views
3

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 comparison of distros

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: distros good

Antwort

2

Das Problem im zweiten Satz der Frage lautet: "S/sig^2 hat eine nichtzentrale Chi-Quadrat-Verteilung mit Freiheitsgraden = n und Nicht-Zentralitätsparameter = n*mu^2. " Dieser Nicht-Zentralitätsparameter ist nicht korrekt. Es sollte n*(mu/sig)^2 sein.

Die Standarddefinition der nicht-zentrischen Chi-Quadrat-Verteilung ist, dass es die Summe der Quadrate von normalen Variablen ist, die mittlere mu und Standardabweichung 1 haben. Sie berechnen S mit normalen Variablen mit Standardabweichung sig. Lassen Sie uns diese Verteilung als N(mu, sig**2) schreiben. Durch die Verwendung der orts Skala Eigenschaften der Normalverteilung, wir haben

N(mu, sig**2) = mu + sig*N(0, 1) = sig*(mu/sig + N(0,1)) = sig*N(mu/sig, 1) 

die Quadrate variates von N(mu, sig**2) So Summieren Summieren der Quadrate der sig*N(mu/sig, 1) entspricht. Das ergibt sig**2 mal eine nicht-zentrale Chi-Quadrat-Zufallsvariable mit Nicht-Zentralität mu/sig.

Wenn Sie die Zeile ändern, in dem non_centrality zu berechnet wird

non_centrality = n*(mu/sig)**2 

die Histogramme in einer Reihe aufstellen, wie Sie es erwarten.

+0

Das scheint zu helfen. Würde es Ihnen etwas ausmachen, ein bisschen zu erarbeiten? – bcf

+0

Ich fügte etwas Ausarbeitung hinzu. –