Versi ringkas pertanyaan saya
(26 Desember 2018)
Saya mencoba mereproduksi Gambar 2.2 dari Computer Statistics Statistics Inference oleh Efron dan Hastie, tetapi untuk beberapa alasan yang saya tidak bisa mengerti, jumlahnya tidak sesuai dengan yang ada di buku.
Asumsikan kita mencoba untuk memutuskan antara dua kemungkinan fungsi kepadatan probabilitas untuk data yang diamati , kepadatan hipotesis nol dan kepadatan alternatif . Aturan pengujian mengatakan pilihan mana, atau , kita akan membuat memiliki data yang diamati . Setiap aturan seperti itu memiliki dua probabilitas kesalahan frequentist terkait: memilih ketika sebenarnya dihasilkan , dan sebaliknya,
Biarkan menjadi rasio kemungkinan ,
Jadi, lemma Neyman-Pearson mengatakan bahwa aturan pengujian bentuk adalah algoritma pengujian hipotesis yang optimal
Untuk , dan ukuran sampel n = 10 berapa nilainya untuk \ alpha dan \ beta untuk cutoff c = 0.4 ?
- Dari Gambar 2.2 of Computer Age statistik Inference oleh Efron dan Hastie kita memiliki:
- dan untuk cutoff
- Saya menemukan dan untuk cutoff menggunakan dua pendekatan yang berbeda: A) simulasi dan B) secara analitis .
Saya akan sangat menghargai jika seseorang dapat menjelaskan kepada saya cara mendapatkan dan untuk cutoff . Terima kasih.
Versi ringkas pertanyaan saya selesai di sini. Mulai sekarang Anda akan menemukan:
- Di bagian A) detail dan kode python lengkap dari pendekatan simulasi saya .
- Di bagian B) detail dan kode python lengkap dari pendekatan analitis .
A) Pendekatan simulasi saya dengan kode python lengkap dan penjelasannya
(20 Desember 2018)
Dari buku ...
Dalam semangat yang sama, lemma Neyman-Pearson menyediakan algoritma pengujian hipotesis yang optimal. Ini mungkin yang paling elegan dari konstruksi sering. Dalam perumusannya yang paling sederhana, NP lemma mengasumsikan kita mencoba untuk memutuskan antara dua kemungkinan fungsi kepadatan probabilitas untuk data yang diamati , kepadatan hipotesis nol dan kepadatan alternatif . Aturan pengujian mengatakan pilihan mana, atau , kita akan membuat memiliki data yang diamati . Setiap aturan seperti itu memiliki dua probabilitas kesalahan frequentist terkait: memilih ketika sebenarnya dihasilkan , dan sebaliknya,
Biarkan menjadi rasio kemungkinan ,
(Sumber: Efron, B., & Hastie, T. (2016). Statistik Statistik Usia Komputer: Algoritma, Bukti, dan Ilmu Data. Cambridge: Cambridge University Press. )
Jadi, saya menerapkan kode python di bawah ini ...
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))
Sekali lagi, dari buku ...
dan tentukan aturan pengujian oleh
(Sumber: Efron, B., & Hastie, T. (2016). Statistik Statistik Usia Komputer: Algoritma, Bukti, dan Ilmu Data. Cambridge: Cambridge University Press. )
Jadi, saya menerapkan kode python di bawah ini ...
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
Akhirnya, dari buku ...
Di mana dimungkinkan untuk menyimpulkan bahwa cutoff akan menyiratkan dan .
Jadi, saya menerapkan kode python di bawah ini ...
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)
dan kodenya ...
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_)
dan kodenya ...
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-')
untuk mendapatkan sesuatu seperti ini:
yang terlihat mirip dengan gambar asli dari buku, tetapi 3-tupel dari simulasi saya memiliki nilai dan jika dibandingkan dengan yang ada di buku untuk cutoff yang sama . Sebagai contoh:
- dari buku yang kita miliki
- dari simulasi saya, kami memiliki:
Tampaknya cutoff dari simulasi saya setara dengan cutoff dari buku.
Saya akan sangat menghargai jika seseorang dapat menjelaskan kepada saya apa yang saya lakukan salah di sini. Terima kasih.
B) Pendekatan perhitungan saya dengan kode python lengkap dan penjelasannya
(26 Desember 2018)
Masih mencoba memahami perbedaan antara hasil simulasi saya ( alpha_simulation(.), beta_simulation(.)
) dan yang disajikan dalam buku ini, dengan bantuan seorang teman ahli statistik (Sofia), kami menghitung dan analitis alih-alih melalui simulasi, jadi .. .
Sekali itu
kemudian
Bahkan,
begitu,
Oleh karena itu, dengan melakukan beberapa penyederhanaan aljabar (seperti di bawah), kita akan memiliki:
Jadi jika
kemudian, untuk kita akan memiliki:
yang menghasilkan
Untuk menghitung dan , kita tahu bahwa:
begitu,
Untuk ...
jadi, saya menerapkan kode python di bawah ini:
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)
Untuk ...
menghasilkan kode python di bawah ini:
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)
dan kodenya ...
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_)
dan kodenya ...
# 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-')
untuk mendapatkan angka dan nilai untuk dan sangat mirip dengan simulasi pertama saya
Dan akhirnya untuk membandingkan hasil antara simulasi dan perhitungan berdampingan ...
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
yang menghasilkan
Ini menunjukkan bahwa hasil simulasi sangat mirip (jika tidak sama) dengan orang-orang dari pendekatan analitis.
Singkatnya, saya masih butuh bantuan untuk mencari tahu apa yang mungkin salah dalam perhitungan saya. Terima kasih. :)