Die zusammengefasste Version meiner Frage
(26. Dezember 2018)
Ich versuche, Abbildung 2.2 aus Computer Age Statistical Inference von Efron und Hastie zu reproduzieren , aber aus irgendeinem Grund, den ich nicht verstehen kann, stimmen die Zahlen nicht mit denen im Buch überein.
Angenommen, wir versuchen, zwischen zwei möglichen Wahrscheinlichkeitsdichtefunktionen für die beobachteten Daten , einer Nullhypothesendichte und einer alternativen Dichte . Eine Testregel besagt, welche Wahl, oder , wir treffen werden, wenn wir die Daten beobachtet haben . Jede solche Regel weist zwei häufig auftretende Fehlerwahrscheinlichkeiten auf: Auswahl von wenn tatsächlich generiert hat , und umgekehrt;
Sei das Wahrscheinlichkeitsverhältnis ,
Das Neyman-Pearson-Lemma besagt also, dass die der Form der optimale Algorithmus zum Testen von Hypothesen ist
Für und die Stichprobengröße wären die Werte für und für einen Cutoff ?
- Aus Abbildung 2.2 der statistischen Inferenz des Computerzeitalters von Efron und Hastie haben wir:
- β = 0,38 c = 0,4 und für einen Cutoff
- Ich fand und für einen Cutoff Verwendung von zwei verschiedenen Ansätzen: A) Simulation und B) analytisch .
Ich würde mich freuen, wenn mir jemand erklären könnte, wie man und für einen Cutoff erhält . Vielen Dank.
Die zusammengefasste Version meiner Frage endet hier. Ab sofort finden Sie:
- In Abschnitt A) Details und vollständiger Python-Code meines Simulationsansatzes .
- In Abschnitt B) Details und vollständiger Python-Code des analytischen Ansatzes.
A) Mein Simulationsansatz mit vollständigem Python-Code und Erklärungen
(20. Dezember 2018)
Von dem Buch ...
In diesem Sinne bietet das Neyman-Pearson-Lemma einen optimalen Algorithmus zum Testen von Hypothesen. Dies ist vielleicht die eleganteste der frequentistischen Konstruktionen. In seiner einfachsten Formulierung geht das NP-Lemma davon aus, dass wir versuchen, zwischen zwei möglichen Wahrscheinlichkeitsdichtefunktionen für die beobachteten Daten , einer Nullhypothesendichte und einer alternativen Dichte . Eine Testregel besagt, welche Wahl, oder , wir treffen werden, wenn wir die Daten beobachtet haben . Jede solche Regel weist zwei häufig auftretende Fehlerwahrscheinlichkeiten auf: Auswahl von wenn tatsächlich generiert wird und umgekehrt
Sei das Wahrscheinlichkeitsverhältnis ,
(Quelle: Efron, B. & Hastie, T. (2016). Statistische Inferenz des Computerzeitalters: Algorithmen, Evidenz und Datenwissenschaft. Cambridge: Cambridge University Press. )
Also habe ich den folgenden Python-Code implementiert ...
import numpy as np
def likelihood_ratio(x, f1_density, f0_density):
return np.prod(f1_density.pdf(x)) / np.prod(f0_density.pdf(x))
Wieder aus dem Buch ...
und definiere die durch
(Quelle: Efron, B. & Hastie, T. (2016). Statistische Inferenz des Computerzeitalters: Algorithmen, Evidenz und Datenwissenschaft. Cambridge: Cambridge University Press. )
Also habe ich den folgenden Python-Code implementiert ...
def Neyman_Pearson_testing_rule(x, cutoff, f0_density, f1_density):
lr = likelihood_ratio(x, f1_density, f0_density)
llr = np.log(lr)
if llr >= cutoff:
return 1
else:
return 0
Zum Schluss aus dem Buch ...
Wo man schließen kann, dass ein Cutoff und impliziert .
Also habe ich den folgenden Python-Code implementiert ...
def alpha_simulation(cutoff, f0_density, f1_density, sample_size, replicates):
NP_test_results = []
for _ in range(replicates):
x = f0_density.rvs(size=sample_size)
test = Neyman_Pearson_testing_rule(x, cutoff, f0_density, f1_density)
NP_test_results.append(test)
return np.sum(NP_test_results) / float(replicates)
def beta_simulation(cutoff, f0_density, f1_density, sample_size, replicates):
NP_test_results = []
for _ in range(replicates):
x = f1_density.rvs(size=sample_size)
test = Neyman_Pearson_testing_rule(x, cutoff, f0_density, f1_density)
NP_test_results.append(test)
return (replicates - np.sum(NP_test_results)) / float(replicates)
und der Code ...
from scipy import stats as st
f0_density = st.norm(loc=0, scale=1)
f1_density = st.norm(loc=0.5, scale=1)
sample_size = 10
replicates = 12000
cutoffs = []
alphas_simulated = []
betas_simulated = []
for cutoff in np.arange(3.2, -3.6, -0.4):
alpha_ = alpha_simulation(cutoff, f0_density, f1_density, sample_size, replicates)
beta_ = beta_simulation(cutoff, f0_density, f1_density, sample_size, replicates)
cutoffs.append(cutoff)
alphas_simulated.append(alpha_)
betas_simulated.append(beta_)
und der Code ...
import matplotlib.pyplot as plt
%matplotlib inline
# Reproducing Figure 2.2 from simulation results.
plt.xlabel('$\\alpha$')
plt.ylabel('$\\beta$')
plt.xlim(-0.1, 1.05)
plt.ylim(-0.1, 1.05)
plt.axvline(x=0, color='b', linestyle='--')
plt.axvline(x=1, color='b', linestyle='--')
plt.axhline(y=0, color='b', linestyle='--')
plt.axhline(y=1, color='b', linestyle='--')
figure_2_2 = plt.plot(alphas_simulated, betas_simulated, 'ro', alphas_simulated, betas_simulated, 'k-')
um so etwas zu erhalten:
das sieht ähnlich aus wie die ursprüngliche Figur aus dem Buch, aber die 3-Tupel aus meiner Simulation haben unterschiedliche Werte von und im Vergleich zu denen des Buches für denselben Cutoff . Zum Beispiel:
- aus dem Buch, das wir haben
- Aus meiner Simulation haben wir:
Es scheint, dass der Cutoff aus meiner Simulation dem Cutoff aus dem Buch entspricht.
Ich würde mich freuen, wenn mir jemand erklären könnte, was ich hier falsch mache. Vielen Dank.
B) Mein Berechnungsansatz mit vollständigem Python-Code und Erklärungen
(26. Dezember 2018)
alpha_simulation(.), beta_simulation(.)
Wir haben immer noch versucht, den Unterschied zwischen den Ergebnissen meiner Simulation ( ) und den im Buch vorgestellten zu verstehen. Mit Hilfe eines Freundes von mir (Sofia) haben wir und analytisch berechnet, anstatt über Simulation. .
Einmal das
dann
Außerdem,
damit,
Wenn wir also einige algebraische Vereinfachungen durchführen (wie unten), haben wir:
Also, wenn
dann haben wir für :
ergebend
Um und zu berechnen , wissen wir, dass:
damit,
Für ...
Also habe ich den folgenden Python-Code implementiert:
def alpha_calculation(cutoff, m_0, m_1, variance, sample_size):
c = cutoff
n = sample_size
sigma = np.sqrt(variance)
k = (c*variance)/(n*(m_1-m_0)) + (m_1+m_0)/2.0
z_alpha = (k-m_0)/(sigma/np.sqrt(n))
# Pr{z_score >= z_alpha}
return 1.0 - st.norm(loc=0, scale=1).cdf(z_alpha)
Für ...
Daraus resultiert der folgende Python-Code:
def beta_calculation(cutoff, m_0, m_1, variance, sample_size):
c = cutoff
n = sample_size
sigma = np.sqrt(variance)
k = (c*variance)/(n*(m_1-m_0)) + (m_1+m_0)/2.0
z_beta = (k-m_1)/(sigma/np.sqrt(n))
# Pr{z_score < z_beta}
return st.norm(loc=0, scale=1).cdf(z_beta)
und der Code ...
alphas_calculated = []
betas_calculated = []
for cutoff in cutoffs:
alpha_ = alpha_calculation(cutoff, 0.0, 0.5, 1.0, sample_size)
beta_ = beta_calculation(cutoff, 0.0, 0.5, 1.0, sample_size)
alphas_calculated.append(alpha_)
betas_calculated.append(beta_)
und der Code ...
# Reproducing Figure 2.2 from calculation results.
plt.xlabel('$\\alpha$')
plt.ylabel('$\\beta$')
plt.xlim(-0.1, 1.05)
plt.ylim(-0.1, 1.05)
plt.axvline(x=0, color='b', linestyle='--')
plt.axvline(x=1, color='b', linestyle='--')
plt.axhline(y=0, color='b', linestyle='--')
plt.axhline(y=1, color='b', linestyle='--')
figure_2_2 = plt.plot(alphas_calculated, betas_calculated, 'ro', alphas_calculated, betas_calculated, 'k-')
um eine Zahl und Werte für und zu erhalten, die meiner ersten Simulation sehr ähnlich sind
Und schließlich, um die Ergebnisse zwischen Simulation und Berechnung nebeneinander zu vergleichen ...
df = pd.DataFrame({
'cutoff': np.round(cutoffs, decimals=2),
'simulated alpha': np.round(alphas_simulated, decimals=2),
'simulated beta': np.round(betas_simulated, decimals=2),
'calculated alpha': np.round(alphas_calculated, decimals=2),
'calculate beta': np.round(betas_calculated, decimals=2)
})
df
ergebend
Dies zeigt, dass die Ergebnisse der Simulation denen des analytischen Ansatzes sehr ähnlich (wenn nicht sogar gleich) sind.
Kurz gesagt, ich brauche immer noch Hilfe, um herauszufinden, was in meinen Berechnungen falsch sein könnte. Vielen Dank. :) :)