Suy luận thống kê là một công cụ mạnh mẽ để rút ra kết luận và đưa ra dự đoán về dân số dựa trên dữ liệu mẫu. Nó cho phép chúng tôi đưa ra quyết định sáng suốt và hiểu được hiệu quả của các lựa chọn khác nhau. Một ứng dụng phổ biến của suy luận thống kê là thử nghiệm A/B , trong đó chúng tôi so sánh hai phiên bản hoặc phương pháp xử lý để xác định phiên bản có hiệu suất vượt trội. Tuy nhiên, điều gì sẽ xảy ra khi chúng tôi giới thiệu nhiều phiên bản hoặc phương pháp điều trị hơn cho thử nghiệm?
Có vẻ như việc giới thiệu các phiên bản bổ sung trong thử nghiệm là cơ hội để đưa ra các quyết định tốt hơn nữa. Thật không may , nếu không được xử lý đúng cách, số lượng giả thuyết có thể kiểm chứng tăng lên có thể dẫn đến kết quả sai lệch và quyết định sai lầm . Thách thức này được gọi là vấn đề so sánh nhiều lần .
Trong bài viết này, tôi giải thích khái niệm kiểm tra nhiều giả thuyết, cạm bẫy tiềm ẩn của nó và đưa ra một giải pháp khả thi được hỗ trợ bởi mô phỏng Python.
Để hiểu thử nghiệm đa giả thuyết, hãy bắt đầu bằng cách xem xét các khái niệm cơ bản của thử nghiệm A/B đơn giản liên quan đến hai biến thể .
Trong thử nghiệm A/B, chúng tôi bắt đầu bằng cách hình thành hai giả thuyết cạnh tranh: giả thuyết không , thể hiện sự không có sự khác biệt giữa các biến thể và giả thuyết thay thế , cho thấy có sự khác biệt.
Sau đó, chúng tôi đặt mức ý nghĩa được ký hiệu là alpha
. Ngưỡng này xác định lượng bằng chứng cần thiết để bác bỏ giả thuyết không . Các mức ý nghĩa thường được sử dụng là 0,05 (5%) và 0,01 (1%), cho biết xác suất quan sát dữ liệu nếu giả thuyết khống là đúng.
Sau khi chạy thử nghiệm và thu thập dữ liệu, chúng tôi tính toán giá trị p . Giá trị p biểu thị xác suất thu được kết quả cực đoan bằng hoặc cực đoan hơn dữ liệu được quan sát nếu giả thuyết khống là đúng . Nếu giá trị p nhỏ hơn mức ý nghĩa alpha
, chúng tôi bác bỏ giả thuyết không có lợi cho giả thuyết thay thế.
Điều quan trọng cần lưu ý là giá trị p thấp cho thấy bằng chứng mạnh mẽ chống lại giả thuyết không, cho thấy dữ liệu quan sát được không có khả năng xảy ra một cách tình cờ. Tuy nhiên, điều này không có nghĩa là chắc chắn. Vẫn có một xác suất khác không khi quan sát thấy sự khác biệt giữa các mẫu ngay cả khi giả thuyết khống là đúng.
Khi gặp một tình huống có nhiều giả thuyết khác nhau , chúng tôi gọi đó là thử nghiệm đa giả thuyết . Trong những trường hợp như vậy, độ phức tạp sẽ tăng lên khi chúng tôi cần xem xét cẩn thận tác động tiềm ẩn của việc tiến hành nhiều thử nghiệm đồng thời.
Cạm bẫy của việc kiểm tra nhiều giả thuyết phát sinh khi chúng ta kiểm tra nhiều giả thuyết mà không điều chỉnh mức ý nghĩa alpha
. Trong những trường hợp như vậy, chúng ta vô tình làm tăng tỷ lệ lỗi "Loại I" , nghĩa là chúng ta có xu hướng bác bỏ một giả thuyết không (tìm sự khác biệt) trong khi giả thuyết không này thực tế là đúng (không có sự khác biệt nào cả).
Chúng ta kiểm tra đồng thời càng nhiều giả thuyết thì càng có nhiều khả năng tìm thấy giá trị p thấp hơn alpha
cho ít nhất một giả thuyết và kết luận sai về sự khác biệt đáng kể.
Để minh họa vấn đề này, hãy xem xét một tình huống trong đó chúng tôi muốn thử nghiệm N
giả thuyết để xác định thiết kế nào trong số nhiều thiết kế trang web mới thu hút nhiều khách hàng hơn với alpha = 0.05
mong muốn. Giả sử chúng ta biết rằng không có thiết kế mới nào tốt hơn thiết kế mặc định , nghĩa là giả thuyết không đúng cho tất cả N
trường hợp.
Tuy nhiên, đối với mỗi trường hợp, có 5% xác suất (giả sử giả thuyết khống là đúng) phạm lỗi “Loại I” hoặc dương tính giả . Nói cách khác, có 95% xác suất không phát hiện chính xác dương tính giả. Về mặt lý thuyết, xác suất có ít nhất một lần dương tính giả trong số N
lần thử nghiệm bằng 1 - (1 - alpha)^N = 1 - 0.95^N
. Chẳng hạn, khi N = 10
, xác suất này xấp xỉ 40%, cao hơn đáng kể so với 5% ban đầu.
Vấn đề trở nên rõ ràng hơn khi chúng ta tăng số lượng các giả thuyết được thử nghiệm. Ngay cả trong các tình huống chỉ có một vài biến thể và mẫu phụ tham gia, số lượng so sánh có thể nhanh chóng tích lũy. Ví dụ: so sánh ba thiết kế D1, D2 và D3 cho tất cả người dùng, sau đó là so sánh riêng cho người dùng ở quốc gia C1 và một lần nữa cho người dùng ở các quốc gia khác ngoài C1, dẫn đến tổng cộng chín phép so sánh. Thật dễ dàng để vô tình tham gia vào nhiều so sánh mà không nhận ra sự lạm phát tiếp theo của tỷ lệ lỗi Loại I.
Hãy đi sâu vào một ví dụ hấp dẫn làm nổi bật hậu quả của việc không kiểm soát lỗi “Loại I” khi thử nghiệm nhiều giả thuyết.
Vào năm 2009, một nhóm các nhà nghiên cứu đã tiến hành quét fMRI trên một con cá hồi Đại Tây Dương đã chết và phát hiện ra hoạt động não bộ một cách đáng kinh ngạc như thể nó còn sống! Để hiểu kết quả bất ngờ này xảy ra như thế nào, chúng ta cần khám phá bản chất của quét fMRI.
Máy quét fMRI đóng vai trò là nền tảng thử nghiệm mở rộng , trong đó nhiều thử nghiệm được tiến hành trên từng bệnh nhân. Máy quét theo dõi những thay đổi trong quá trình oxy hóa máu như một chỉ báo về hoạt động của não. Các nhà nghiên cứu thường tập trung vào các vùng quan tâm cụ thể, điều này dẫn đến việc họ phân chia toàn bộ thể tích cơ thể thành các khối nhỏ gọi là voxels. Mỗi điểm ảnh ba chiều đại diện cho một giả thuyết kiểm tra sự hiện diện của hoạt động não trong khối lập phương cụ thể đó . Do mong muốn quét độ phân giải cao, máy quét fMRI cuối cùng đã đánh giá hàng nghìn giả thuyết trong một quy trình duy nhất.
Trong trường hợp này, các nhà nghiên cứu đã cố ý không sửa đúng mức ý nghĩa ban đầu alpha = 0.001
và họ đã xác định được ba điểm ảnh ba chiều có hoạt động não ở cá hồi đã chết. Tuy nhiên, kết quả này mâu thuẫn với hiểu biết của chúng tôi rằng con cá hồi thực sự đã chết . Sau khi điều chỉnh mức ý nghĩa, hiện tượng giống như hồi sinh đã biến mất , minh họa tầm quan trọng của việc giải quyết vấn đề lỗi Loại I.
Bất cứ khi nào nhiều giả thuyết được kiểm tra trong một thử nghiệm, thì việc giải quyết thách thức này và kiểm soát lỗi Loại I trở nên quan trọng. Các kỹ thuật thống kê khác nhau, chẳng hạn như hiệu chỉnh Bonferroni , có thể được sử dụng để giảm thiểu tỷ lệ dương tính giả tăng cao liên quan đến thử nghiệm nhiều giả thuyết.
Hiệu chỉnh Bonferroni là một quy trình thống kê được thiết kế đặc biệt để giải quyết thách thức của nhiều phép so sánh trong quá trình kiểm tra giả thuyết.
Giả sử bạn cần kiểm tra N
giả thuyết trong một thử nghiệm trong khi vẫn đảm bảo xác suất xảy ra lỗi Loại I dưới alpha
.
Ý tưởng cơ bản của quy trình rất đơn giản: giảm mức ý nghĩa cần thiết để bác bỏ giả thuyết không đối với mỗi giả thuyết thay thế . Bạn có nhớ công thức xác suất có ít nhất một lần dương tính giả không? Trong công thức đó, chúng ta có alpha
, có thể giảm xuống để giảm xác suất tổng thể.
Vì vậy, để đạt được xác suất thấp hơn về ít nhất một kết quả dương tính giả trong số nhiều giả thuyết, bạn có thể so sánh từng giá trị p không phải với alpha
mà với giá trị nhỏ hơn. Nhưng chính xác thì "cái gì đó nhỏ hơn" là gì?
Hóa ra việc sử dụng bonferroni_alpha = alpha / N
làm mức ý nghĩa cho từng giả thuyết riêng lẻ đảm bảo rằng xác suất tổng thể của lỗi Loại I vẫn ở mức dưới alpha
.
Ví dụ: nếu bạn đang kiểm tra 10 giả thuyết ( N = 10
) và mức ý nghĩa mong muốn là 5% ( alpha = 0.05
), bạn nên so sánh từng giá trị p riêng lẻ với bonferroni_alpha = alpha / N = 0.05 / 10 = 0.005
Bằng cách thực hiện vì vậy, xác suất bác bỏ sai ít nhất một giả thuyết không đúng sẽ không vượt quá mức mong muốn là 0,05.
Kỹ thuật đáng chú ý này hoạt động nhờ vào bất đẳng thức Boole , cho biết xác suất của sự kết hợp các sự kiện nhỏ hơn hoặc bằng tổng các xác suất riêng lẻ của chúng . Trong khi tồn tại một bằng chứng toán học chính thức, các giải thích trực quan cung cấp một sự hiểu biết trực quan:
Vì vậy, khi mỗi giả thuyết riêng lẻ đang được thử nghiệm ở mức ý nghĩa bonferroni_alpha = alpha / N
chúng ta có xác suất bonferroni_alpha
dương tính giả. Đối với N
phép thử như vậy, xác suất kết hợp của các sự kiện “dương tính giả” nhỏ hơn hoặc bằng tổng các xác suất riêng lẻ. Mà, trong trường hợp xấu nhất khi trong tất cả N thử nghiệm giả thuyết khống được giữ, bằng N * bonferroni_alpha = N * (alpha / N) = alpha
Để hỗ trợ thêm cho các khái niệm đã thảo luận trước đó, hãy tiến hành mô phỏng bằng Python . Chúng tôi sẽ quan sát kết quả và đánh giá hiệu quả của hiệu chỉnh Bonferroni.
Hãy xem xét một kịch bản trong đó chúng ta có 10 giả thuyết thay thế trong một thử nghiệm. Giả sử rằng trong cả 10 trường hợp, giả thuyết không là đúng. Bạn đồng ý rằng mức ý nghĩa alpha = 0.05
là phù hợp với phân tích của bạn. Tuy nhiên, nếu không có bất kỳ sửa chữa nào đối với lỗi Loại I bị thổi phồng, chúng tôi cho rằng xác suất lý thuyết là khoảng 40% gặp phải ít nhất một kết quả dương tính giả. Và sau khi áp dụng hiệu chỉnh Bonferroni, chúng tôi hy vọng rằng xác suất này không vượt quá 5%.
Đối với một thử nghiệm cụ thể, chúng tôi có thể nhận được ít nhất một Kết quả dương tính giả hoặc không. Những xác suất này chỉ có thể được nhìn thấy trên quy mô của nhiều thí nghiệm. Sau đó, hãy chạy mô phỏng của từng thử nghiệm riêng lẻ 100 lần và tính số lượng thử nghiệm có ít nhất một Kết quả dương tính giả (giá trị p dưới mức ý nghĩa)!
Bạn có thể tìm thấy tệp .ipynb
với tất cả mã để chạy mô phỏng này và tạo biểu đồ trong kho lưu trữ của tôi trên GitHub - IgorKhomyanin/blog/bonferroni-and-salmon
import numpy as np import matplotlib.pyplot as plt # To replicate the results np.random.seed(20000606) # Some hyperparameters too play with N_COMPARISONS = 10 N_EXPERIMENTS = 100 # Sample p-values # As we assume that null hypothesis is true, # the p-value would be distributed uniformly sample = np.random.uniform(0, 1, size=(N_COMPARISONS, N_EXPERIMENTS)) # Probability of type I error we are ready to accept # Probabiltiy of rejecting null hypothesis when it is actually true alpha = 0.05 # Theoretical False Positive Rate # # 1. # Probability that we cocnlude a significant difference for a given comparison # is equal to alpha by definition in our setting of true null hypothesis # Then [(1 - alpha)] is the probability of not rejecting the null hypothesis # # 2. # As experiments are considered independent, the probability of not rejecting # the null hypothesis in [(1 - alpha)]^N # # 3. # Probability that at least one is a false positive is equal to # 1 - (probability from 2.) prob_at_least_one_false_positive = 1 - ((1 - alpha) ** N_COMPARISONS) # Observed False Positive Rate # We conclude that experiment is a false positive when p-value is less than alpha false_positives_cnt = np.sum(np.sum(sample <= alpha, axis=0) > 0) false_positives_share = false_positives_cnt / N_EXPERIMENTS # Bonferroni correction bonferroni_alpha = alpha / N_COMPARISONS bonferroni_false_positive_comparisons_cnt = np.sum(np.sum(sample <= bonferroni_alpha, axis=0) > 0) bonferroni_false_positive_comparisons_share = bonferroni_false_positive_comparisons_cnt / N_EXPERIMENTS print(f'Theoretical False Positive Rate Without Correction: {prob_at_least_one_false_positive:0.4f}') print(f'Observed False Positive Rate Without Correction: {false_positives_share:0.4f} ({false_positives_cnt:0.0f} out of {N_EXPERIMENTS})') print(f'Observed False Positive Rate With Bonferroni Correction: {bonferroni_false_positive_comparisons_share:0.4f} ({bonferroni_false_positive_comparisons_cnt:0.0f} out of {N_EXPERIMENTS})') # Output: # Theoretical False Positive Rate Without Correction: 0.4013 # Observed False Positive Rate Without Correction: 0.4200 (42 out of 100) # Observed False Positive Rate With Bonferroni Correction: 0.0300 (3 out of 100)
Đây là một hình dung của các kết quả:
Hình trên cùng đại diện cho mỗi ô vuông dưới dạng giá trị p của một phép so sánh riêng lẻ (kiểm tra giả thuyết). Hình vuông càng đậm thì giá trị p càng cao. Vì chúng ta biết rằng giả thuyết không đúng trong mọi trường hợp nên bất kỳ kết quả quan trọng nào cũng sẽ là dương tính giả.
Khi giá trị p thấp hơn mức ý nghĩa (được biểu thị bằng các ô vuông gần như màu trắng), chúng tôi bác bỏ giả thuyết không và thu được kết quả dương tính giả. Biểu đồ ở giữa biểu thị các thử nghiệm không hiệu chỉnh, trong khi biểu đồ dưới cùng biểu thị các thử nghiệm có hiệu chỉnh Bonferroni. Các thí nghiệm có ít nhất một dương tính giả được tô màu đỏ.
Rõ ràng, sự điều chỉnh đã hoạt động hiệu quả. Nếu không hiệu chỉnh, chúng tôi quan sát thấy 42 thí nghiệm trong số 100 thí nghiệm có ít nhất một lần dương tính giả, điều này gần giống với xác suất lý thuyết ~40%. Tuy nhiên, với hiệu chỉnh Bonferroni, chúng tôi chỉ có 3 thử nghiệm trong số 100 thử nghiệm có ít nhất một lần dương tính giả, thấp hơn nhiều so với ngưỡng 5% mong muốn.
Thông qua mô phỏng này, chúng ta có thể quan sát trực quan tác động của hiệu chỉnh Bonferroni trong việc giảm thiểu sự xuất hiện của dương tính giả , xác nhận thêm tính hữu ích của nó trong thử nghiệm đa giả thuyết.
Trong bài viết này, tôi đã giải thích khái niệm kiểm tra nhiều giả thuyết và nhấn mạnh mối nguy hiểm tiềm tàng của nó. Khi thử nghiệm nhiều giả thuyết, chẳng hạn như tiến hành nhiều phép so sánh trong quá trình thử nghiệm A/B, xác suất quan sát thấy một sự kiện hiếm gặp là "Dương tính giả" tăng lên. Xác suất tăng cao này có thể dẫn đến những kết luận sai lầm về những tác động đáng kể có thể xảy ra một cách tình cờ nếu không được giải quyết một cách thích hợp.
Một giải pháp khả thi cho vấn đề này là hiệu chỉnh Bonferroni , điều chỉnh mức ý nghĩa cho từng giả thuyết riêng lẻ. Bằng cách tận dụng bất đẳng thức Boole, hiệu chỉnh này giúp kiểm soát mức ý nghĩa tổng thể ở ngưỡng mong muốn, giảm nguy cơ dương tính giả.
Tuy nhiên, điều quan trọng là phải nhận ra rằng mọi giải pháp đều phải trả giá. Khi sử dụng hiệu chỉnh Bonferroni, mức ý nghĩa cần thiết sẽ giảm xuống, điều này có thể ảnh hưởng đến sức mạnh của thử nghiệm. Điều này có nghĩa là có thể cần cỡ mẫu lớn hơn hoặc hiệu ứng mạnh hơn để phát hiện những khác biệt giống nhau. Các nhà nghiên cứu phải xem xét cẩn thận sự đánh đổi này khi quyết định thực hiện hiệu chỉnh Bonferroni hoặc các phương pháp hiệu chỉnh khác.
Nếu bạn có bất kỳ câu hỏi hoặc nhận xét nào liên quan đến nội dung được thảo luận trong bài viết này, xin đừng ngần ngại chia sẻ chúng. Tham gia thảo luận sâu hơn và khám phá các kỹ thuật thống kê là điều cần thiết để hiểu rõ hơn và áp dụng vào thực tế.