Mereproduksi sosok "Statistik Usia Komputer" dari Efron dan Hastie


8

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,xf0(x)f1(x)t(x)01xf1f0x

α=Prf0{t(x)=1},
β=Prf1{t(x)=0}.

Biarkan menjadi rasio kemungkinan ,L.(x)

L.(x)=f1(x)f0(x)

Jadi, lemma Neyman-Pearson mengatakan bahwa aturan pengujian bentuk adalah algoritma pengujian hipotesis yang optimaltc(x)

tc(x)={1jika log L.(x)c0jika log L.(x)<c.

Untuk , dan ukuran sampel n = 10 berapa nilainya untuk \ alpha dan \ beta untuk cutoff c = 0.4 ?f0N(0,1),f1N(0,5,1)n=10αβc=0,4

  • Dari Gambar 2.2 of Computer Age statistik Inference oleh Efron dan Hastie kita memiliki:
    • α=0,10 dan untuk cutoffβ=0,38c=0,4
  • Saya menemukan dan untuk cutoff menggunakan dua pendekatan yang berbeda: A) simulasi dan B) secara analitis .α=0,15β=0,30c=0,4

Saya akan sangat menghargai jika seseorang dapat menjelaskan kepada saya cara mendapatkan dan untuk cutoff . Terima kasih.α=0,10β=0,38c=0,4

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 dihasilkanxf0(x)f1(x)t(x)01xf1f0x , dan sebaliknya,

α=Prf0{t(x)=1},
β=Prf1{t(x)=0}.

Biarkan menjadi rasio kemungkinan , L.(x)

L.(x)=f1(x)f0(x)

(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 tc(x)

tc(x)={1jika log L.(x)c0jika log L.(x)<c.

(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 ...

masukkan deskripsi gambar di sini

Di mana dimungkinkan untuk menyimpulkan bahwa cutoff akan menyiratkan dan .c=0.4α=0.10β=0.38

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:

masukkan deskripsi gambar di sini

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:(c,α,β)αβc

  • dari buku yang kita miliki(c=0.4,α=0.10,β=0.38)
  • dari simulasi saya, kami memiliki:
    • (c=0.4,α=0.15,β=0,30)
    • (c=0.8,α=0,10,β=0,39)

Tampaknya cutoff dari simulasi saya setara dengan cutoff dari buku.c=0.8c=0,4

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

f0N(0,1)
f1N(0,5,1)

kemudian

f(x|μ,σ2)=saya=1n12πσ2e-(xsaya-μ)22σ2

Bahkan,

L.(x)=f1(x)f0(x)

begitu,

L.(x)=f1(x|μ1,σ2)f0(x|μ0,σ2)=saya=1n12πσ2e-(xsaya-μ1)22σ2saya=1n12πσ2e-(xsaya-μ0)22σ2

Oleh karena itu, dengan melakukan beberapa penyederhanaan aljabar (seperti di bawah), kita akan memiliki:

L.(x)=(12πσ2)ne-saya=1n(xsaya-μ1)22σ2(12πσ2)ne-saya=1n(xsaya-μ0)22σ2

=e-saya=1n(xsaya-μ1)2+saya=1n(xsaya-μ0)22σ2

=e-saya=1n(xsaya2-2xsayaμ1+μ12)+saya=1n(xsaya2-2xsayaμ0+μ02)2σ2

=e-saya=1nxsaya2+2μ1saya=1nxsaya-saya=1nμ12+saya=1nxsaya2-2μ0saya=1nxsaya+saya=1nμ022σ2

=e2(μ1-μ0)saya=1nxsaya+n(μ02-μ12)2σ2
.

Jadi jika

tc(x)={1jika log L.(x)c0jika log L.(x)<c.

kemudian, untuk kita akan memiliki:catatan L.(x)c

catatan (e2(μ1-μ0)saya=1nxsaya+n(μ02-μ12)2σ2)c

2(μ1-μ0)saya=1nxsaya+n(μ02-μ12)2σ2c

saya=1nxsaya2cσ2-n(μ02-μ12)2(μ1-μ0)

saya=1nxsaya2cσ22(μ1-μ0)-n(μ02-μ12)2(μ1-μ0)

saya=1nxsayacσ2(μ1-μ0)-n(μ02-μ12)2(μ1-μ0)

saya=1nxsayacσ2(μ1-μ0)+n(μ12-μ02)2(μ1-μ0)

saya=1nxsayacσ2(μ1-μ0)+n(μ1-μ0)(μ1+μ0)2(μ1-μ0)

saya=1nxsayacσ2(μ1-μ0)+n(μ1+μ0)2

(1n)saya=1nxsaya(1n)(cσ2(μ1-μ0)+n(μ1+μ0)2)

saya=1nxsayancσ2n(μ1-μ0)+(μ1+μ0)2

x¯cσ2n(μ1-μ0)+(μ1+μ0)2

x¯kdimana k=cσ2n(μ1-μ0)+(μ1+μ0)2

yang menghasilkan

tc(x)={1jika x¯k0jika x¯<k.dimana k=cσ2n(μ1-μ0)+(μ1+μ0)2

Untuk menghitung dan , kita tahu bahwa:αβ

α=Prf0{t(x)=1},
β=Prf1{t(x)=0}.

begitu,

α=Prf0{x¯k},β=Prf1{x¯<k}. dimana k=cσ2n(μ1-μ0)+(μ1+μ0)2

Untuk ...α

α=Prf0{x¯k}=Prf0{x¯-μ0k-μ0}

α=Prf0{x¯-μ0σnk-μ0σn}

α=Prf0{skor-zk-μ0σn} dimana k=cσ2n(μ1-μ0)+(μ1+μ0)2

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 ...β

β=Prf1{x¯<k}=Prf1{x¯-μ1<k-μ1}

β=Prf1{x¯-μ1σn<k-μ1σn}

β=Prf1{skor-z<k-μ1σn} dimana k=cσ2n(μ1-μ0)+(μ1+μ0)2

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αβ

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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. :)


3
Bagi saya, pertanyaan apa pun yang mengharuskan pembaca menjelajahi 11 halaman kode komputer, statistik, dan aljabar tidak mungkin dibaca oleh siapa pun, apalagi dijawab dengan meyakinkan. Jika Anda tertarik untuk mengejar ini, karena Anda tampaknya berasal dari waktu dan perhatian yang telah Anda habiskan untuk itu, mungkin saya menyarankan Anda mengidentifikasi inti masalah dan melihat apakah Anda dapat menjelaskannya dan menanyakan pertanyaan Anda dalam ruang satu atau paling banyak dua halaman materi?
Whuber

1
Hai @whuber, terima kasih atas saran Anda! Tujuan saya adalah memposting detail (kode sumber dan penjelasan) untuk memungkinkan siapa saja mereproduksi hasil saya, tetapi tampaknya strategi ini tidak bekerja dengan baik seperti yang Anda amati dengan benar :). Terima kasih lagi. Kemudian saya mengedit pertanyaan untuk merangkum keraguan saya di awal posting. Saya harap ini berhasil.
Francisco Fonseca

Jawaban:


3

Dalam situs web buku Computer Age Statistics Inference , ada sesi diskusi di mana Trevor Hastie dan Brad Efron sering membalas beberapa pertanyaan. Jadi, saya memposting pertanyaan ini di sana (seperti di bawah ini) dan menerima konfirmasi dari Trevor Hastie bahwa ada kesalahan dalam buku yang akan diperbaiki (dengan kata lain, simulasi dan perhitungan saya - sebagaimana diterapkan dalam Python dalam pertanyaan ini - sudah benar ).

masukkan deskripsi gambar di sini

Ketika Trevor Hastie menjawab bahwa "Faktanya c = .75 untuk plot itu" berarti bahwa pada gambar di bawah ini (Gambar 2.2 asli dari buku) cutoff harus bukannya :cc=0,75c=0,4

masukkan deskripsi gambar di sini

Jadi, dengan menggunakan fungsi saya alpha_simulation(.), beta_simulation(.), alpha_calculation(.)dan beta_calculation(.)(yang kode Python lengkap tersedia dalam pertanyaan ini) saya mendapat dan untuk cutoff sebagai konfirmasi bahwa kode saya benar.α=0,10β=0,38c=0,75

alpha_simulated_c075 = alpha_simulation(0.75, f0_density, f1_density, sample_size, replicates)
beta_simulated_c075 = beta_simulation(0.75, f0_density, f1_density, sample_size, replicates)

alpha_calculated_c075 = alpha_calculation(0.75, 0.0, 0.5, 1.0, sample_size)
beta_calculated_c075 = beta_calculation(0.75, 0.0, 0.5, 1.0, sample_size)

print("Simulated: c=0.75, alpha={0:.2f}, beta={1:.2f}".format(alpha_simulated_c075, beta_simulated_c075))
print("Calculated: c=0.75, alpha={0:.2f}, beta={1:.2f}".format(alpha_calculated_c075, beta_calculated_c075))

masukkan deskripsi gambar di sini

Akhirnya, ketika Trevor Hastie menjawab bahwa "... menghasilkan ambang untuk x 0,4" itu berarti bahwa dalam persamaan di bawah ini (lihat bagian B dari pertanyaan ini):k=0,4

x¯kdimana k=cσ2n(μ1-μ0)+(μ1+μ0)2

yang menghasilkan

tc(x)={1jika x¯k0jika x¯<k.dimana k=cσ2n(μ1-μ0)+(μ1+μ0)2

Jadi, dengan Python kita bisa mendapatkan untuk cutoff seperti di bawah ini:k=0,4c=0,75

n = 10
m_0 = 0.0
m_1 = 0.5
variance = 1.0
c = 0.75

k = (c*variance)/(n*(m_1-m_0)) + (m_1+m_0)/2.0
threshold_for_x = k

print("threshold for x (when cutoff c=0.75) = {0:.1f}".format(threshold_for_x))

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.