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,
Đặt là tỷ lệ khả năng ,
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 ưu
Đối với và cỡ mẫu giá trị sẽ là bao nhiêu cho và cho điểm cắt ?
- 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ó:
- và cho điểm cắt
- 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ỏng và B) phân tích .
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.
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ạo , và ngược lại,
Đặt là tỷ lệ khả năng ,
(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
(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 ...
Trường hợp có thể kết luận rằng mức cắt sẽ ngụ ý và .
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:
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ụ:
- từ cuốn sách chúng tôi có
- từ mô phỏng của tôi, chúng tôi có:
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.
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 đó
sau đó
Hơn thế nữa,
vì thế,
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ó:
Vì vậy nếu
sau đó, với chúng ta sẽ có:
dẫn đến
Để tính toán và , chúng tôi biết rằng:
vì thế,
Dành cho ...
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 ...
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
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
Đ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. :)