Theo dõi các giả định được thực hiện bởi hàm ttest_ind () của SciPy


8

Tôi đang cố gắng viết mã Python của riêng mình để tính toán thống kê t và giá trị p cho các thử nghiệm t độc lập một và hai đuôi. Tôi có thể sử dụng xấp xỉ bình thường, nhưng hiện tại tôi đang cố gắng chỉ sử dụng phân phối t. Tôi đã không thành công trong việc khớp kết quả của thư viện thống kê SciPy trên dữ liệu thử nghiệm của tôi. Tôi có thể sử dụng một đôi mắt mới để xem liệu tôi có đang phạm phải một sai lầm ngớ ngẩn nào đó không.

Lưu ý, đây không phải là quá nhiều câu hỏi mã hóa vì nó là "tại sao tính toán này không mang lại chỉ số đúng?" Tôi cung cấp mã cho đầy đủ, nhưng không mong đợi bất kỳ lời khuyên phần mềm nào. Chỉ cần giúp hiểu lý do tại sao điều này là không đúng.

Mã của tôi:

import numpy as np
import scipy.stats as st

def compute_t_stat(pop1,pop2):

    num1 = pop1.shape[0]; num2 = pop2.shape[0];

    # The formula for t-stat when population variances differ.
    t_stat = (np.mean(pop1) - np.mean(pop2))/np.sqrt( np.var(pop1)/num1 + np.var(pop2)/num2 )

    # ADDED: The Welch-Satterthwaite degrees of freedom.
    df = ((np.var(pop1)/num1 + np.var(pop2)/num2)**(2.0))/(   (np.var(pop1)/num1)**(2.0)/(num1-1) +  (np.var(pop2)/num2)**(2.0)/(num2-1) ) 

    # Am I computing this wrong?
    # It should just come from the CDF like this, right?
    # The extra parameter is the degrees of freedom.

    one_tailed_p_value = 1.0 - st.t.cdf(t_stat,df)
    two_tailed_p_value = 1.0 - ( st.t.cdf(np.abs(t_stat),df) - st.t.cdf(-np.abs(t_stat),df) )    


    # Computing with SciPy's built-ins
    # My results don't match theirs.
    t_ind, p_ind = st.ttest_ind(pop1, pop2)

    return t_stat, one_tailed_p_value, two_tailed_p_value, t_ind, p_ind

Cập nhật:

Sau khi đọc thêm một chút về bài kiểm tra t của Welch, tôi thấy rằng tôi nên sử dụng công thức Welch-Satterthwaite để tính mức độ tự do. Tôi đã cập nhật mã ở trên để phản ánh điều này.

Với mức độ tự do mới, tôi có được một kết quả gần hơn. Giá trị p hai mặt của tôi bị giảm khoảng 0,008 so với phiên bản SciPy ... nhưng đây vẫn là một lỗi quá lớn nên tôi vẫn phải làm gì đó không đúng (hoặc các hàm phân phối SciPy rất tệ, nhưng thật khó tin chúng chỉ chính xác đến 2 chữ số thập phân).

Cập nhật thứ hai:

Trong khi tiếp tục thử mọi thứ, tôi nghĩ có lẽ phiên bản SciPy sẽ tự động tính toán xấp xỉ Bình thường với phân phối t khi mức độ tự do đủ cao (khoảng> 30). Vì vậy, tôi đã chạy lại mã của mình bằng phân phối Bình thường và kết quả được tính toán thực sự cách xa SciPy hơn so với khi tôi sử dụng phân phối t.


Có thể SciPy tính toán bài kiểm tra của Welch - Tài liệu của SciPy không chỉ định ...
Cyan

Công thức tôi đang sử dụng trong tính toán của mình giống như thống kê t của người xứ Wales. Theo hiểu biết của tôi, đây là điều "tiêu chuẩn" cần làm khi kích thước mẫu và phương sai dân số được phép khác nhau, đúng không?
ely

4
p

4
numpy.varddof=1ptone_tailed_p_value = st.t.cdf(-t_stat,df)ptwo_tailed_p_value = 2*st.t.cdf(-np.abs(t_stat),df)

2
Tôi không nghĩ nó là một thứ tầm thường, theo nghĩa là thường có một khoảng cách khá lớn giữa việc có một công thức toán học cho một thứ gì đó trong tay và biết một cách tính toán an toàn và hiệu quả. Đó là một trong những điều tuyệt vời khi có sẵn một khối lượng kiến ​​thức lớn, bởi vì sẽ phải mất một thời gian ảo để học những thủ thuật như vậy, từng người một, tất cả đều tự mình thực hiện. :)
Đức hồng y

Câu trả lời:


4

Bằng cách sử dụng nguồn hàm tích hợp SciPy (), tôi có thể thấy bản in mã nguồn cho hàm ttest_ind (). Dựa trên mã nguồn, SciPy tích hợp đang thực hiện kiểm tra t giả định rằng phương sai của hai mẫu bằng nhau. Nó không sử dụng mức độ tự do của Welch-Satterthwaite.

Tôi chỉ muốn chỉ ra rằng, điều quan trọng nhất, đây là lý do tại sao bạn không nên chỉ tin vào các chức năng của thư viện. Trong trường hợp của tôi, tôi thực sự cần thử nghiệm t cho các quần thể có phương sai không bằng nhau và mức độ điều chỉnh tự do có thể quan trọng đối với một số bộ dữ liệu nhỏ hơn mà tôi sẽ chạy trên này. SciPy giả định phương sai bằng nhau nhưng không nêu giả định này.

Như tôi đã đề cập trong một số nhận xét, sự khác biệt giữa mã của tôi và SciPy là khoảng 0,008 cho các cỡ mẫu trong khoảng từ 30 đến 400, và sau đó từ từ về 0 đối với các cỡ mẫu lớn hơn. Đây là một hiệu ứng của thuật ngữ phụ (1 / n1 + 1 / n2) trong mẫu số thống kê t phương sai bằng nhau. Độ chính xác, điều này khá quan trọng, đặc biệt đối với các cỡ mẫu nhỏ. Nó chắc chắn xác nhận với tôi rằng tôi cần phải viết chức năng của riêng tôi. (Có thể có những thư viện Python khác tốt hơn, nhưng ít nhất nên biết điều này. Thành thật mà nói, điều đáng ngạc nhiên là đây không phải là bất cứ nơi nào ở phía trước và trung tâm trong tài liệu SciPy cho ttest_ind ()).


3
Có vẻ như điều này hiện được triển khai đúng như Scipy 0.11.0 thông qua một tham số tùy chọn để chỉ định kiểm tra t của Welch: docs.scipy.org/doc/scipy/reference/generated/ trộm
Abhijit Rao
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.