Tái sản xuất số liệu của Thời đại máy tính suy luận thống kê từ Efron và Hastie


8

Phiên bản tóm tắt của câu hỏi của tôi

(Ngày 26 tháng 12 năm 2018)

Tôi đang cố gắng tái tạo Hình 2.2 từ Suy luận thống kê thời đại máy tính của Efron và Hastie, nhưng vì một số lý do mà tôi không thể hiểu, các con số không tương ứng với những con số trong cuốn sách.

Giả sử chúng ta đang cố gắng quyết định giữa hai hàm mật độ xác suất có thể có cho dữ liệu quan sát , mật độ giả thuyết null và mật độ thay thế . Quy tắc kiểm tra cho biết lựa chọn nào, hoặc , chúng tôi sẽ thực hiện có dữ liệu quan sát . Bất kỳ quy định như vậy có hai xác suất lỗi frequentist liên quan: chọn khi thực sự tạo ra , và ngược lại,xf0(x)f1(x)t(x)01xf1f0x

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

Đặt là tỷ lệ khả năng ,L(x)

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

Vì vậy, bổ đề Neyman về Pearson nói rằng quy tắc kiểm tra của mẫu là thuật toán kiểm tra giả thuyết tối ưutc(x)

tc(x)={1if log L(x)c0if log L(x)<c.

Đối với f0N(0,1),f1N(0.5,1) và cỡ mẫu n=10 giá trị sẽ là bao nhiêu cho αβ cho điểm cắt c=0.4 ?

  • Từ Hình 2.2 của suy luận thống kê thời đại máy tính của Efron và Hastie, chúng ta có:
    • α=0.10 và cho điểm cắtβ=0.38c=0.4
  • Tôi đã tìm thấy và cho điểm cắt bằng hai cách tiếp cận khác nhau: A) mô phỏngB) phân tích .α=0.15β=0.30c=0.4

Tôi sẽ đánh giá cao nếu ai đó có thể giải thích cho tôi cách lấy và cho điểm cắt . Cảm ơn.α= =0,10β= =0,38c= =0,4

Phiên bản tóm tắt của câu hỏi của tôi kết thúc ở đây. Từ bây giờ bạn sẽ tìm thấy:

  • Trong phần A) chi tiết và mã python hoàn chỉnh của phương pháp mô phỏng của tôi .
  • Trong phần B) chi tiết và mã trăn hoàn chỉnh của phương pháp phân tích .

A) Cách tiếp cận mô phỏng của tôi với mã python hoàn chỉnh và giải thích

(Ngày 20 tháng 12 năm 2018)

Từ cuốn sách ...

Theo tinh thần tương tự, bổ đề Neyman về Pearson cung cấp một thuật toán kiểm tra giả thuyết tối ưu. Đây có lẽ là thanh lịch nhất của các công trình thường xuyên. Trong công thức đơn giản nhất của nó, bổ đề NP giả định rằng chúng tôi đang cố gắng quyết định giữa hai hàm mật độ xác suất có thể có cho dữ liệu quan sát , mật độ giả thuyết null và mật độ thay thế . Quy tắc kiểm tra cho biết lựa chọn nào, hoặc , chúng tôi sẽ thực hiện có dữ liệu quan sát . Bất kỳ quy định như vậy đã hai liên quan đến xác suất lỗi frequentist: chọn khi thực sự tạoxf0(x)f1(x)t(x)01xf1f0x , và ngược lại,

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

Đặt là tỷ lệ khả năng , L(x)

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

(Nguồn: Efron, B., & Hastie, T. (2016). Suy luận thống kê thời đại máy tính: Thuật toán, bằng chứng và khoa học dữ liệu. Cambridge: Nhà xuất bản Đại học Cambridge. )

Vì vậy, tôi đã triển khai mã python bên dưới ...

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

Một lần nữa, từ cuốn sách ...

và xác định quy tắc kiểm tra bằng tc(x)

tc(x)= ={1nếu đăng nhập L(x)c0nếu đăng nhập L(x)<c.

(Nguồn: Efron, B., & Hastie, T. (2016). Suy luận thống kê thời đại máy tính: Thuật toán, bằng chứng và khoa học dữ liệu. Cambridge: Nhà xuất bản Đại học Cambridge. )

Vì vậy, tôi đã triển khai mã python bên dưới ...

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

Cuối cùng, từ cuốn sách ...

nhập mô tả hình ảnh ở đây

Trường hợp có thể kết luận rằng mức cắt sẽ ngụ ý và .c= =0,4α= =0,10β= =0,38

Vì vậy, tôi đã triển khai mã python bên dưới ...

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)

và mã ...

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_)

và mã ...

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-')

để có được một cái gì đó như thế này:

nhập mô tả hình ảnh ở đây

trông giống với hình gốc từ cuốn sách, nhưng 3 tuples từ mô phỏng của tôi có các giá trị khác nhau của và khi so sánh với các giá trị của cuốn sách cho cùng một điểm cắt . Ví dụ:(c,α,β)αβc

  • từ cuốn sách chúng tôi có(c=0.4,α=0.10,β=0.38)
  • từ mô phỏng của tôi, chúng tôi có:
    • (c=0.4,α=0.15,β=0.30)
    • (c=0.8,α=0.10,β=0.39)

Có vẻ như điểm cắt từ mô phỏng của tôi tương đương với điểm cắt từ cuốn sách.c=0,8c= =0,4

Tôi sẽ đánh giá cao nếu ai đó có thể giải thích cho tôi những gì tôi đang làm sai ở đây. Cảm ơn.

B) Cách tiếp cận tính toán của tôi với mã python hoàn chỉnh và giải thích

(Ngày 26 tháng 12 năm 2018)

Vẫn đang cố gắng tìm hiểu sự khác biệt giữa kết quả mô phỏng của tôi ( alpha_simulation(.), beta_simulation(.)) và những kết quả được trình bày trong cuốn sách, với sự giúp đỡ của một người bạn thống kê (Sofia) của tôi, chúng tôi đã tính toán và phân tích thay vì thông qua mô phỏng, vì vậy .. .αβ

Một lần đó

f0~N(0,1)
f1~N(0,5,1)

sau đó

f(x|μ,σ2)= =i=1n12πσ2e(xiμ)22σ2

Hơn thế nữa,

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

vì thế,

L(x)=f1(x|μ1,σ2)f0(x|μ0,σ2)=i=1n12πσ2e(xiμ1)22σ2i=1n12πσ2e(xiμ0)22σ2

Do đó, bằng cách thực hiện một số đơn giản hóa đại số (như dưới đây), chúng ta sẽ có:

L(x)= =(12πσ2)ne-ΣTôi= =1n(xTôi-μ1)22σ2(12πσ2)ne-ΣTôi= =1n(xTôi-μ0)22σ2

= =e-ΣTôi= =1n(xTôi-μ1)2+ΣTôi= =1n(xTôi-μ0)22σ2

= =e-ΣTôi= =1n(xTôi2-2xTôiμ1+μ12)+ΣTôi= =1n(xTôi2-2xTôiμ0+μ02)2σ2

= =e-ΣTôi= =1nxTôi2+2μ1ΣTôi= =1nxTôi-ΣTôi= =1nμ12+ΣTôi= =1nxTôi2-2μ0ΣTôi= =1nxTôi+ΣTôi= =1nμ022σ2

=e2(μ1μ0)i=1nxi+n(μ02μ12)2σ2
.

Vì vậy nếu

tc(x)={1if log L(x)c0if log L(x)<c.

sau đó, với chúng ta sẽ có:log L(x)c

log (e2(μ1μ0)i=1nxi+n(μ02μ12)2σ2)c

2(μ1μ0)i=1nxi+n(μ02μ12)2σ2c

i=1nxi2cσ2n(μ02μ12)2(μ1μ0)

i=1nxi2cσ22(μ1μ0)n(μ02μ12)2(μ1μ0)

i=1nxicσ2(μ1μ0)n(μ02μ12)2(μ1μ0)

i=1nxicσ2(μ1μ0)+n(μ12μ02)2(μ1μ0)

i=1nxicσ2(μ1μ0)+n(μ1μ0)(μ1+μ0)2(μ1μ0)

i=1nxicσ2(μ1μ0)+n(μ1+μ0)2

(1n)i=1nxi(1n)(cσ2(μ1μ0)+n(μ1+μ0)2)

i=1nxincσ2n(μ1μ0)+(μ1+μ0)2

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

x¯k, where k=cσ2n(μ1μ0)+(μ1+μ0)2

dẫn đến

tc(x)={1if x¯k0if x¯<k., where k=cσ2n(μ1μ0)+(μ1+μ0)2

Để tính toán và , chúng tôi biết rằng:αβ

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

vì thế,

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

Dành cho ...α

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

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

α=Prf0{z-scorekμ0σn} where k=cσ2n(μ1μ0)+(μ1+μ0)2

Vì vậy, tôi đã triển khai mã python bên dưới:

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)

Dành cho ...β

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

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

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

dẫn đến mã python dưới đây:

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)

và mã ...

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_)

và mã ...

# 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-')

để có được một hình và giá trị cho và rất giống với mô phỏng đầu tiên của tôiαβ

nhập mô tả hình ảnh ở đây

Và cuối cùng để so sánh kết quả giữa mô phỏng và tính toán cạnh nhau ...

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

dẫn đến

nhập mô tả hình ảnh ở đây

Điều này cho thấy kết quả mô phỏng rất giống nhau (nếu không giống nhau) với kết quả của phương pháp phân tích.

Nói tóm lại, tôi vẫn cần trợ giúp để tìm ra những gì có thể sai trong tính toán của tôi. Cảm ơn. :)


3
Dường như với tôi, bất kỳ câu hỏi nào đòi hỏi độc giả phải lội qua 11 trang mã máy tính, đầu ra thống kê và đại số dường như không thể được đọc bởi bất kỳ ai, ít được trả lời một cách đồng tình. Nếu bạn quan tâm đến việc theo đuổi điều này, vì dường như bạn đã dành thời gian và sự chú ý mà bạn đã dành cho nó, tôi có thể đề nghị bạn xác định mấu chốt của vấn đề và xem liệu bạn có thể giải thích nó và đặt câu hỏi của bạn trong không gian một hoặc nhiều nhất là hai trang tài liệu?
whuber

1
Xin chào @whuber, cảm ơn bạn đã gợi ý! Ý định của tôi là đăng chi tiết (mã nguồn và giải thích) để cho phép bất cứ ai tái tạo kết quả của tôi, nhưng có vẻ như chiến lược này không hoạt động tốt như bạn quan sát chính xác :). Cám ơn bạn một lần nữa. Sau đó, tôi chỉnh sửa câu hỏi để tóm tắt nghi ngờ của tôi ở đầu bài. Tôi mong cái này sẽ thành công.
Francisco Fonseca

Câu trả lời:


3

Trong trang web của cuốn sách Suy luận thống kê thời đại máy tính , có một phiên thảo luận trong đó Trevor HastieBrad Efron thường trả lời một số câu hỏi. Vì vậy, tôi đã đăng câu hỏi này lên đó (như bên dưới) và nhận được từ Trevor Hastie xác nhận rằng có một lỗi trong cuốn sách sẽ được sửa (nói cách khác, mô phỏng và tính toán của tôi - như được thực hiện trong Python trong câu hỏi này - là chính xác ).

nhập mô tả hình ảnh ở đây

Khi Trevor Hastie trả lời rằng "Trên thực tế c = 0,75 cho âm mưu đó" có nghĩa là ở hình bên dưới (hình 2.2 gốc của cuốn sách), điểm cắt nên là thay vì :cc=0.75c=0.4

nhập mô tả hình ảnh ở đây

Vì vậy, sử dụng các chức năng của tôi alpha_simulation(.), beta_simulation(.), alpha_calculation(.)beta_calculation(.)(có mã Python đầy đủ có sẵn trong câu hỏi này) Tôi đã nhận và cho một cắt như một xác nhận rằng mã của tôi là đúng.α=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))

nhập mô tả hình ảnh ở đây

Cuối cùng, khi Trevor Hastie trả lời rằng "... dẫn đến ngưỡng cho x là 4", điều đó có nghĩa là trong phương trình dưới đây (xem phần B từ câu hỏi này):k=0.4

x¯k, where k=cσ2n(μ1μ0)+(μ1+μ0)2

dẫn đến

tc(x)={1if x¯k0if x¯<k., where k=cσ2n(μ1μ0)+(μ1+μ0)2

Vì vậy, trong Python, chúng ta có thể nhận được cho mức cắt như sau: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))

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.