Kiểm tra dữ liệu được tạo ngẫu nhiên theo phân phối dự định của nó


17

Tôi đã viết một chương trình tạo dữ liệu ngẫu nhiên. Nếu chương trình hoạt động chính xác, dữ liệu đó phải tuân theo phân phối xác suất cụ thể, đã biết. Tôi muốn chạy chương trình, thực hiện một số tính toán về kết quả và đưa ra giá trị p.

Trước khi bất kỳ ai khác nói điều đó: Tôi hiểu rằng kiểm tra giả thuyết có thể phát hiện khi chương trình hoạt động chính xác. Nó chỉ có thể phát hiện khi nó hoạt động không chính xác theo một cách cụ thể. (Và thậm chí sau đó, bài kiểm tra "nên" thất bại X% thời gian, tùy thuộc vào mức độ quan trọng bạn chọn ...)

Vì vậy, tôi đang cố gắng đạt được sự hiểu biết về những công cụ nào có thể phù hợp. Đặc biệt:

  • Tôi có thể tạo nhiều dữ liệu ngẫu nhiên như tôi muốn. Tất cả tôi phải làm là để chương trình chạy đủ lâu. Vì vậy, tôi không giới hạn ở bất kỳ kích thước mẫu cụ thể.

  • Tôi quan tâm đến các kỹ thuật tạo ra giá trị p. Vì vậy, nhìn chằm chằm vào biểu đồ và nói "vâng, trông có vẻ hơi tuyến tính" không phải là một lựa chọn thú vị. Trừ khi có một số cách đặt một số cứng vào "độ thắng" của đồ thị. ;-)

Những gì tôi biết cho đến nay:

  • Tôi đã thấy ba loại thử nghiệm chính được đề cập có vẻ giống như chúng có thể được áp dụng: thử nghiệm chi bình phương [Pearson], thử nghiệm Kolmogorov-Smirnov và thử nghiệm Anderson-Darling.

  • Có vẻ như một phép thử chi bình phương thích hợp cho các phân phối rời rạc , trong khi hai phép thử còn lại thích hợp hơn cho các phân phối liên tục . (?)

  • Nhiều nguồn khác nhau gợi ý rằng xét nghiệm AD "tốt hơn" so với xét nghiệm KS, nhưng không đi sâu vào chi tiết nào nữa.

Cuối cùng, tất cả các thử nghiệm này có lẽ phát hiện "các cách khác nhau" lệch khỏi phân phối null được chỉ định. Nhưng tôi thực sự không biết sự khác biệt là gì ... Tóm lại, tôi đang tìm kiếm một loại mô tả chung về nơi mỗi loại thử nghiệm được áp dụng nhiều nhất và loại vấn đề nào phát hiện tốt nhất.


Nếu bạn đã tự viết thì nó gần như bị ràng buộc là 'thất bại' một khi bạn vượt qua giới hạn kiến ​​thức của mình (mà bạn đã nhúng trong thiết kế). Hãy xem Random.org/analysis liệt kê một số phương thức kiểm tra và rõ ràng là stackoverflow.com/q/2130621/717355 . Về mặt triết học, nếu chương trình mang tính quyết định thì dù sao nó cũng không thể là ngẫu nhiên ;-) Đây chắc chắn là một chủ đề đáng để nghiên cứu (và đừng quên các cuộc thảo luận về mật khẩu hack).
Philip Oakley

Câu trả lời:


21

Dưới đây là một mô tả chung về cách 3 phương pháp được đề cập làm việc.

Phương pháp Chi-Squared hoạt động bằng cách so sánh số lượng quan sát trong một thùng với số lượng dự kiến ​​sẽ có trong thùng dựa trên phân phối. Đối với các bản phân phối rời rạc, các thùng thường là các khả năng hoặc kết hợp riêng biệt của các thùng đó. Đối với các bản phân phối liên tục, bạn có thể chọn các điểm cắt để tạo các thùng. Nhiều chức năng thực hiện điều này sẽ tự động tạo ra các thùng, nhưng bạn sẽ có thể tạo các thùng của riêng mình nếu bạn muốn so sánh trong các khu vực cụ thể. Nhược điểm của phương pháp này là sự khác biệt giữa phân phối lý thuyết và dữ liệu thực nghiệm vẫn đặt các giá trị trong cùng một thùng sẽ không được phát hiện, một ví dụ sẽ được làm tròn, nếu về mặt lý thuyết, các số từ 2 đến 3 sẽ được trải rộng trong phạm vi (chúng tôi hy vọng sẽ thấy các giá trị như 2.34296),

Thống kê kiểm tra KS là khoảng cách tối đa giữa 2 Hàm phân phối tích lũy được so sánh (thường là lý thuyết và thực nghiệm). Nếu 2 phân phối xác suất chỉ có 1 điểm giao nhau thì 1 trừ đi khoảng cách tối đa là vùng chồng lấp giữa 2 phân phối xác suất (điều này giúp một số người hình dung được những gì đang được đo). Hãy nghĩ về âm mưu trên cùng một đồ thị hàm phân phối lý thuyết và EDF sau đó đo khoảng cách giữa 2 "đường cong", sự khác biệt lớn nhất là thống kê kiểm tra và nó được so sánh với phân phối các giá trị cho điều này khi null là đúng. Điều này nắm bắt sự khác biệt là hình dạng của phân phối hoặc 1 phân phối thay đổi hoặc kéo dài so với phân phối khác.1n . Thử nghiệm này phụ thuộc vào bạn biết các tham số của phân phối tham chiếu thay vì ước tính chúng từ dữ liệu (tình huống của bạn có vẻ ổn ở đây). Nếu bạn ước tính các tham số từ cùng một dữ liệu thì bạn vẫn có thể có được một bài kiểm tra hợp lệ bằng cách so sánh với các mô phỏng của riêng bạn thay vì phân phối tham chiếu tiêu chuẩn.

Thử nghiệm Anderson-Darling cũng sử dụng sự khác biệt giữa các đường cong CDF như thử nghiệm KS, nhưng thay vì sử dụng sự khác biệt tối đa, nó sử dụng chức năng của tổng diện tích giữa 2 đường cong (nó thực sự bình phương sự khác biệt, trọng lượng của chúng để các đuôi có ảnh hưởng nhiều hơn, sau đó tích hợp trên miền của các bản phân phối). Điều này mang lại nhiều trọng lượng hơn cho các ngoại lệ so với KS và cũng cho trọng lượng lớn hơn nếu có một vài khác biệt nhỏ (so với 1 sự khác biệt lớn mà KS sẽ nhấn mạnh). Điều này có thể kết thúc áp đảo bài kiểm tra để tìm ra sự khác biệt mà bạn cho là không quan trọng (làm tròn nhẹ, v.v.). Giống như kiểm tra KS, điều này giả định rằng bạn không ước tính các tham số từ dữ liệu.

Dưới đây là biểu đồ để hiển thị các ý tưởng chung của 2 cuối cùng:

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

dựa trên mã R này:

set.seed(1)
tmp <- rnorm(25)
edf <- approxfun( sort(tmp), (0:24)/25, method='constant', 
    yleft=0, yright=1, f=1 )

par(mfrow=c(3,1), mar=c(4,4,0,0)+.1)
curve( edf, from=-3, to=3, n=1000, col='green' )
curve( pnorm, from=-3, to=3, col='blue', add=TRUE)

tmp.x <- seq(-3, 3, length=1000)
ediff <- function(x) pnorm(x) - edf(x)
m.x <- tmp.x[ which.max( abs( ediff(tmp.x) ) ) ]
ediff( m.x )  # KS stat
segments( m.x, edf(m.x), m.x, pnorm(m.x), col='red' )  # KS stat

curve( ediff, from=-3, to=3, n=1000 )
abline(h=0, col='lightgrey')    

ediff2 <- function(x) (pnorm(x) - edf(x))^2/( pnorm(x)*(1-pnorm(x)) )*dnorm(x)
curve( ediff2, from=-3, to=3, n=1000 )
abline(h=0)

Biểu đồ trên cùng cho thấy EDF của một mẫu từ bình thường tiêu chuẩn so với CDF của bình thường tiêu chuẩn với một dòng hiển thị chỉ số KS. Biểu đồ ở giữa sau đó cho thấy sự khác biệt trong 2 đường cong (bạn có thể thấy vị trí của chỉ số KS). Dưới cùng là sự khác biệt bình phương, trọng số, xét nghiệm AD dựa trên khu vực dưới đường cong này (giả sử tôi đã hiểu mọi thứ chính xác).

Các thử nghiệm khác xem xét mối tương quan trong một qqplot, xem độ dốc trong qqplot, so sánh giá trị trung bình, var và các chỉ số khác dựa trên các khoảnh khắc.


+1, đây là một câu trả lời tốt cho câu hỏi thực tế (không giống như của tôi ...). Mô tả chạy qua giữa đoạn 3 chỉ xin một hình minh họa, nếu bạn cảm thấy có xu hướng làm cho một.
gung - Phục hồi Monica

Đó là một câu trả lời thực sự tốt đẹp. Chỉ để chắc chắn rằng tôi hiểu hoàn toàn: Kiểm tra KS trả về độ lệch lớn nhất giữa CDF và EDF, trong khi AD trả về tổng diện tích [có trọng số] giữa hai đường cong?
Toán học,

@MathologistsOrchid, chủ yếu là chính xác, AD bình phương khoảng cách, sau đó trọng số, sau đó tích hợp, do đó, nó hơi khác với khu vực (mặc dù để hiểu, suy nghĩ về nó như là một khu vực có thể là ok và đơn giản hơn nhiều).
Greg Snow

1
Tôi hy vọng rằng nếu phân phối lý thuyết của bạn có khối lượng điểm (nhảy thẳng đứng trong CDF tại một điểm nhất định) và phân phối thực tế của dữ liệu của bạn có khối lượng điểm gần như, nhưng không hoàn toàn, cùng một nơi thì bài kiểm tra KS có thể vượt trội để kiểm tra AD. Nhưng trường hợp đó có lẽ là một chút giả định. Thử nghiệm KS cho phép thử nghiệm 1 mặt trong đó AD luôn luôn là hai mặt, do đó sẽ là một sự khác biệt khác (chỉ không phổ biến).
Greg Snow

2
Tôi không thích đặc tính @MathologistsOrchid rằng thống kê của KS chỉ phụ thuộc vào "một điểm cực đoan". Vị trí của "một điểm" đó (thường ở giữa bản phân phối) trong CDF phụ thuộc vào các giá trị của các điểm khác trong tập hợp và do đó không bị cô lập hoặc đơn độc như ngôn ngữ đó sẽ gợi ý cho người nghe ngây thơ.
DWin

12

+1 để viết một câu hỏi rõ ràng và chi tiết. Tôi hy vọng rằng câu trả lời của tôi không quá bực bội. Tôi tin rằng kiểm tra giả thuyết không phải là một cách tiếp cận phù hợp trong trường hợp của bạn. Kiểm tra ý nghĩa giả thuyết Null là một điều hợp lý để làm khi câu trả lời thể có hoặc không, nhưng bạn không biết cái nào . (Thật không may, nó không thực sự cho bạn biết điều đó, nhưng đây là một vấn đề khác.) Trong trường hợp của bạn, tôi tập hợp, bạn muốn biết liệu thuật toán của bạn có tốt không. Tuy nhiên, điều được biết (với sự chắc chắn), rằng không có chương trình máy tính nào có thể tạo dữ liệu thực sự ngẫu nhiên từ bất kỳ phân phối xác suất nào. Điều này đúng trước tiên, bởi vì tất cả các máy tính đều là máy trạng thái hữu hạn và do đó chỉ có thể tạo ra số giả ngẫu nhiên. Hơn nữa (đặt sự thiếu ngẫu nhiên thực sự sang một bên), không thể có các giá trị được tạo hoàn toàn tuân theo bất kỳ phân phối liên tục nào. Có một số cách để hiểu điều này, nhưng có lẽ dễ nhất là sẽ có "khoảng trống" trong dòng số, điều này không đúng với bất kỳ biến ngẫu nhiên liên tục nào. Hơn nữa, những khoảng trống này không hoàn toàn rộng bằng nhau hoặc cách đều nhau một cách hoàn hảo. Trong số các nhà khoa học máy tính làm việc về tạo số giả danh, tên của trò chơi là cải thiện các thuật toán sao cho các khoảng trống nhỏ hơn, đồng đều hơn, với thời gian dài hơn (và cũng có thể tạo ra nhiều giá trị nhanh hơn). Ở mức độ nào, những sự thật này xác định rằng kiểm tra giả thuyết là cách tiếp cận sai để xác định xem thuật toán của bạn có tuân theo đúng "phân phối xác suất cụ thể, đã biết" hay không, bởi vì nó không phải là. (Lấy làm tiếc.)

Thay vào đó, một khung thích hợp hơn là xác định mức độ gần gũi của dữ liệu của bạn với phân phối lý thuyết. Đối với điều này, tôi muốn giới thiệu lô xem xét lại, đặc biệt là qq-lôpp-lô. (Một lần nữa, tôi nhận ra rằng điều này phải gây nản lòng và tôi xin lỗi vì điều đó.) Tuy nhiên, bạn không thực sự phải thực hiện các âm mưu hoặc nhìn vào chúng, kỳ lạ như âm thanh đó. Thay vào đó, khi đã chuyển đổi dữ liệu của bạn một cách thích hợp để vẽ đồ thị và tính toán các giá trị tương ứng từ phân phối lý thuyết được đề cập, bạn có thể tương quan chúng. Điều này cung cấp cho bạn một số, cụ thể là điểm r, giống như bạn muốn. Hơn nữa, con số cung cấp cho bạn một thước đo thích hợp về mức độ tốt của thuật toán của bạn. Đối với quá trình này, bạn có thể tạo nhiều dữ liệu như bạn muốn; nhiều dữ liệu hơn sẽ cung cấp cho bạn độ chính xác cao hơn đối với phép đo. Đó là, chúng tôi đã chuyển quan niệm về sức mạnh của mình từ , xác suất từ ​​chối một null thực sự sai (được đảm bảo), sangr = 11-βđộ chính xác trong quan điểm ước tính tham số . Rõ ràng, mục tiêu của bạn ở đây là tạo ra một thuật toán giúp bạn càng gần càng tốt. Có thể đáng để làm điều này cho cả hai loại ô vì chúng có các điểm mạnh và điểm yếu khác nhau (cụ thể, các ô qq cung cấp cho bạn độ phân giải tốt hơn trong các phân phối, trong khi các ô pp có khả năng phân giải tốt hơn ở trung tâm). r= =1

Một lưu ý khác, liên quan đến việc đánh giá chất lượng thuật toán của bạn, bạn có thể muốn tính thời gian so với các pRNG tiêu chuẩn khác.

Hi vọng điêu nay co ich.


Không chính xác những gì tôi yêu cầu, nhưng sâu sắc không hơn không kém. Tôi đoán bằng cách "không liên tục" về cơ bản bạn đang đề cập đến thực tế là máy tính không thực hiện số học chính xác vô hạn?
Toán học

Đó là một phần lớn của nó, nhưng không phải là toàn bộ vấn đề. Đây là một chủ đề rất phức tạp.
gung - Phục hồi Monica

1
Một số ý tưởng của đoạn đầu tiên của @ gung được triển khai trong hàm SnowsPenultimateNormalityTesttrong TeachingDemosgói cho R. Tôi đồng ý với ý tưởng của @ gung về việc xem xét một biện pháp gần gũi hơn là tập trung vào giá trị p. Một vấn đề với việc sử dụng mối tương quan trong biểu đồ qq cho điều này là nếu dữ liệu của bạn có hình dạng chính xác, nhưng ý nghĩa khác nhau, phương sai, v.v. bạn vẫn có thể có được mối tương quan thực sự cao. Một cách khác là sử dụng thống kê KS hoặc thống kê AD làm thước đo sự khác biệt so với lý thuyết.
Greg Snow

@gung, cảm ơn bạn đã trả lời. Bạn có thể vui lòng giải thích thêm một chút về việc đã chuyển đổi dữ liệu của bạn một cách thích hợp để vẽ đồ thị và đã tính toán các giá trị tương ứng từ phân phối lý thuyết trong câu hỏi, bạn có thể tương quan với chúng không? Đã tính toán dữ liệu cho biểu đồ pp hoặc qq, bước tiếp theo để có được điểm r bạn đã đề cập là gì? Đây có phải là một số thử nghiệm nổi tiếng? Bạn có thể vui lòng cho một tài liệu tham khảo? Cảm ơn bạn!
Ivan

1

Tôi chưa hoàn toàn đọc tất cả các câu trả lời nhưng tôi thấy chúng khá kỹ lưỡng và chính xác. Có nguy cơ tôi đang lặp lại một cái gì đó bị chôn vùi trong các câu trả lời dài Tôi chỉ muốn nói rằng v = phép thử chi bình phương có thể được sử dụng cho dữ liệu liên tục. Nó có thể không phải là thử nghiệm tốt nhất và giống như nhiều thử nghiệm khác, nó dựa trên lý thuyết tiệm cận và do đó có thể không chính xác trong các mẫu nhỏ với các tế bào thưa thớt (điều này cũng phụ thuộc vào cách bạn thực hiện việc tạo thùng). Anderson-Darling mạnh hơn để kiểm tra tính quy tắc so với kiểm tra KS nhưng KS có thể tốt hơn cho các phân phối liên tục khác. Lillefors có một bài kiểm tra được thiết kế để phân phối theo cấp số nhân.

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.