2013-07-27 36 views
5

Tôi đã đọc qua các bài đăng hiện có về mô-đun này (và tài liệu Scipy), nhưng vẫn chưa rõ với tôi cách sử dụng mô-đun kstest của Scipy để làm tốt kiểm tra phù hợp khi bạn có tập dữ liệu và chức năng có thể gọi.Sử dụng số liệu thống kê của Scipy.kstest để kiểm tra độ phù hợp

PDF Tôi muốn thử nghiệm dữ liệu của tôi chống lại không phải là một trong những scipy.stats phân phối tiêu chuẩn, vì vậy tôi không thể chỉ gọi nó bằng một cái gì đó như:

kstest(mydata,'norm') 

nơi mydata là một mảng NumPy . Thay vào đó, tôi muốn làm một cái gì đó như:

kstest(mydata,myfunc) 

nơi 'myfunc' là chức năng callable. Điều này không có tác dụng - điều này là không đáng ngạc nhiên, vì không có cách nào để biết kẽ nhất về mảng 'mydata' là gì để tạo ra các tần số lý thuyết tương ứng bằng cách sử dụng 'myfunc'. Giả sử các tần số trong 'mydata' tương ứng với các giá trị của biến ngẫu nhiên là mảng 'abscissa'. Sau đó, tôi nghĩ có lẽ tôi có thể sử dụng số liệu thống kê.ks_2samp:

ks_2samp(mydata,myfunc(abscissa)) 

nhưng tôi không biết liệu điều đó có hợp lệ về mặt thống kê hay không. (Sidenote: làm kstest và ks_2samp mong đợi các mảng tần số được chuẩn hóa thành một, hoặc chúng có muốn các tần số tuyệt đối không?)

Trong bất kỳ trường hợp nào, vì thử nghiệm KS một mẫu được cho là được sử dụng cho độ tốt của thử nghiệm phù hợp, tôi phải giả định có một số cách để làm điều đó với kstest trực tiếp. Làm thế nào để bạn làm điều này?

Trả lời

9

Một số ví dụ có thể làm sáng tỏ cách sử dụng scipy.stats.kstest. Cho phép đầu tiên thiết lập một số dữ liệu thử nghiệm, ví dụ: thường được phân phối với trung bình 5 và độ lệch chuẩn 10:

>>> data = scipy.stats.norm.rvs(loc=5, scale=10, size=(1000,)) 

Để chạy kstest trên những dữ liệu này chúng ta cần một hàm f(x) mà phải mất một mảng của quantiles, và trả về giá trị tương ứng của hàm mật độ tích lũy. Nếu chúng ta tái sử dụng các cdf chức năng của scipy.stats.norm chúng ta có thể làm:

>>> scipy.stats.kstest(data, lambda x: scipy.stats.norm.cdf(x, loc=5, scale=10)) 
(0.019340993719575206, 0.84853828416694665) 

Trên đây thường sẽ được chạy với hình thức thuận tiện hơn:

>>> scipy.stats.kstest(data, 'norm', args=(5, 10)) 
(0.019340993719575206, 0.84853828416694665) 

Nếu chúng tôi đã phân bố đều dữ liệu, nó rất dễ dàng để xây dựng các lũy bằng tay:

>>> data = np.random.rand(1000) 
>>> scipy.stats.kstest(data, lambda x: x) 
(0.019145675289412523, 0.85699937276355065) 
+0

Cảm ơn bạn, hoạt động tốt ngay bây giờ! Một cái gì đó gây nhầm lẫn cho tôi mặc dù.Khi tôi làm theo ví dụ của bạn, tôi nhận được D = 0,08, p = 1,6e-14. Trong câu hỏi ban đầu của tôi, tôi đã đề cập đến giải pháp 'hack' của tôi khi sử dụng ks_2samp: tôi đã sử dụng mô-đun biểu đồ để tính toán tần số quan sát của dữ liệu, tính toán tần số lý thuyết cho cùng kích thước thùng và sử dụng ks_2samp trên hai mảng này. Điều đó đã cho tôi D = 0,74, p = 0,017. Có vẻ hơi lạ với tôi rằng điều này sẽ mang đến một kết quả rất khác biệt. Bạn có nghĩ rằng hai phép tính nên gần hơn? –

+0

Chờ đã, tôi có thể đã nhầm lẫn bản thân mình: liệu ks_2samp có sử dụng cdf thực nghiệm của hai tập dữ liệu hoặc hai bộ dữ liệu không? –

+0

'ks_2samp' tự lấy hai tập dữ liệu. Nếu bạn đang làm việc đúng cách, tôi nghĩ có vẻ hợp lý rằng phương pháp 'ks_2samp' của bạn sẽ mang lại giá trị 'p-value' cao hơn' kstest', không chắc liệu sự khác biệt bạn thấy có quá lớn hay không ... – Jaime

1

như đối với ks_2samp, nó kiểm tra giả thuyết rằng cả hai mẫu được lấy mẫu từ phân phối xác suất tương tự.

bạn có thể làm ví dụ:

>>> from scipy.stats import ks_2samp 
>>> import numpy as np 
>>> 

trong đó x, y là hai trường hợp của numpy.array:

>>> ks_2samp(x, y) 
(0.022999999999999909, 0.95189016804849658) 

giá trị đầu tiên là số liệu thống kê kiểm tra, và giá trị thứ hai là giá trị p. nếu giá trị p nhỏ hơn 95 (với mức ý nghĩa là 5%), điều này có nghĩa là bạn không thể từ chối Null-Hypothese rằng hai bản phân phối mẫu giống hệt nhau.

Các vấn đề liên quan