La versión resumida de mi pregunta.
(26 de diciembre de 2018)
Estoy tratando de reproducir la Figura 2.2 de la Inferencia estadística de la era de la computadora de Efron y Hastie, pero por alguna razón que no puedo entender, los números no se corresponden con los del libro.
Supongamos que estamos tratando de decidir entre dos posibles funciones de densidad de probabilidad para los datos observados , una densidad de hipótesis nula y una densidad alternativa . Una regla de prueba dice qué opción, o , haremos con los datos observados. Cualquiera de estas reglas tiene dos probabilidades asociadas de error frecuentista: elegir cuando en realidad generado , y viceversa,
Dejar ser la razón de verosimilitud ,
Entonces, el lema de Neyman-Pearson dice que la regla de prueba del formulario es el algoritmo óptimo de prueba de hipótesis
por y tamaño de muestra ¿Cuáles serían los valores para y para un corte ?
- De la Figura 2.2 de la Inferencia estadística de la era de la computadora de Efron y Hastie tenemos:
- y para un corte
- encontré y para un corte utilizando dos enfoques diferentes: A) simulación y B) analíticamente .
Agradecería que alguien me explicara cómo obtener y para un corte . Gracias.
La versión resumida de mi pregunta termina aquí. A partir de ahora encontrarás:
- En la sección A) detalles y código completo de Python de mi enfoque de simulación .
- En la sección B) detalles y código completo de Python del enfoque analítico .
A) Mi enfoque de simulación con código completo de Python y explicaciones
(20 de diciembre de 2018)
Del libro ...
En el mismo espíritu, el lema de Neyman-Pearson proporciona un algoritmo de prueba de hipótesis óptimo. Esta es quizás la más elegante de las construcciones frecuentistas. En su formulación más simple, el lema NP supone que estamos tratando de decidir entre dos posibles funciones de densidad de probabilidad para los datos observados, una densidad de hipótesis nula y una densidad alternativa . Una regla de prueba dice qué opción, o , haremos habiendo observado los datos . Cualquiera de estas reglas tiene dos probabilidades asociadas de error frecuentista: elegir cuando en realidad generado , y viceversa,
Dejar ser la razón de verosimilitud ,
(Fuente: Efron, B. y Hastie, T. (2016). Inferencia estadística de la era de la computadora: algoritmos, evidencia y ciencia de datos. Cambridge: Cambridge University Press. )
Entonces, implementé el código de Python a continuación ...
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))
De nuevo, del libro ...
y definir la regla de prueba por
(Fuente: Efron, B. y Hastie, T. (2016). Inferencia estadística de la era de la computadora: algoritmos, evidencia y ciencia de datos. Cambridge: Cambridge University Press. )
Entonces, implementé el código de Python a continuación ...
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
Finalmente, del libro ...
Donde es posible concluir que un límite implicará y .
Entonces, implementé el código de Python a continuación ...
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)
y el código ...
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_)
y el código ...
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-')
para obtener algo como esto:
que se parece a la figura original del libro, pero las 3 tuplas de mi simulación tiene diferentes valores de y cuando se compara con los del libro para el mismo límite . Por ejemplo:
- del libro que tenemos
- de mi simulación tenemos:
Parece que el límite de mi simulación es equivalente al corte del libro.
Agradecería que alguien me explicara qué estoy haciendo mal aquí. Gracias.
B) Mi enfoque de cálculo con código completo de Python y explicaciones
(26 de diciembre de 2018)
Aún tratando de entender la diferencia entre los resultados de mi simulación ( alpha_simulation(.), beta_simulation(.)
) y los presentados en el libro, con la ayuda de un amigo estadístico (Sofía), calculamos y analíticamente en lugar de a través de la simulación, entonces ...
Una vez que
entonces
Además,
entonces,
Por lo tanto, al realizar algunas simplificaciones algebraicas (como se muestra a continuación), tendremos:
Así que si
entonces para tendremos:
Resultando en
Para calcular y , lo sabemos:
entonces,
por ...
Entonces, implementé el código de Python a continuación:
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)
por ...
resultando en el código de python a continuación:
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)
y el código ...
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_)
y el código ...
# 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-')
para obtener una figura y valores para y muy similar a mi primera simulación
Y finalmente para comparar los resultados entre simulación y cálculo lado a lado ...
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
Resultando en
Esto muestra que los resultados de la simulación son muy similares (si no los mismos) a los del enfoque analítico.
En resumen, todavía necesito ayuda para descubrir qué podría estar mal en mis cálculos. Gracias. :)