Kiểm thử phần mềm thống kê


10

Những kỹ thuật / phương pháp tiếp cận nào hữu ích trong việc kiểm tra phần mềm thống kê? Tôi đặc biệt quan tâm đến các chương trình ước tính tham số sử dụng khả năng tối đa.

Việc so sánh kết quả với các kết quả từ các chương trình khác hoặc các nguồn được xuất bản không phải lúc nào cũng có thể vì hầu hết thời gian tôi viết chương trình là do tính toán tôi cần chưa được thực hiện trong một hệ thống hiện có.

Tôi không nhấn mạnh vào các phương pháp có thể đảm bảo tính chính xác. Tôi sẽ rất vui với các kỹ thuật có thể bắt được một số lỗi.

Câu trả lời:


8

Một kỹ thuật hữu ích là thử nghiệm monte carlo. Nếu có hai thuật toán làm cùng một việc, hãy triển khai cả hai, cung cấp cho chúng dữ liệu ngẫu nhiên và kiểm tra xem (trong phạm vi dung sai nhỏ đối với fuzz số) chúng sẽ tạo ra cùng một câu trả lời. Tôi đã làm điều này nhiều lần trước đây:

  • O(N log N)O(N2)

  • n>pp>n

Trong cả hai trường hợp này, tôi đã thực hiện các kỹ thuật tương đối nổi tiếng trong ngôn ngữ lập trình D (không có triển khai), vì vậy tôi cũng đã kiểm tra một vài kết quả chống lại R. Tuy nhiên, thử nghiệm monte carlo đã bắt gặp các lỗi mà tôi chưa bao giờ bắt gặp .

Một thử nghiệm tốt khác là khẳng định . Bạn có thể không biết chính xác kết quả tính toán chính xác của mình là gì, nhưng điều đó không có nghĩa là bạn không thể thực hiện kiểm tra độ tỉnh táo ở các giai đoạn khác nhau của tính toán. Trong thực tế nếu bạn có rất nhiều trong số này trong mã của bạn và tất cả chúng đều vượt qua, thì mã thường là đúng.

Chỉnh sửa: Phương pháp thứ ba là cung cấp dữ liệu thuật toán (tổng hợp hoặc thực) trong đó bạn biết ít nhất khoảng câu trả lời đúng là gì, ngay cả khi bạn không biết chính xác và xem bằng cách kiểm tra xem câu trả lời có hợp lý không. Ví dụ, bạn có thể không biết chính xác ước tính của các tham số của mình là gì, nhưng bạn có thể biết cái nào được cho là "lớn" và cái nào được cho là "nhỏ".


5

Không chắc đây có thực sự là một câu trả lời cho câu hỏi của bạn không, nhưng ít nhất nó có liên quan với nhau.

Tôi duy trì gói Thống kê trong Maple . Một ví dụ thú vị về mã khó kiểm tra là tạo mẫu ngẫu nhiên theo các bản phân phối khác nhau; thật dễ dàng để kiểm tra rằng không có lỗi nào được tạo ra, nhưng sẽ khó hơn để xác định xem các mẫu được tạo có phù hợp với phân phối được yêu cầu "đủ tốt" hay không. Vì Maple có cả tính năng tượng trưng và số, bạn có thể sử dụng một số tính năng tượng trưng để kiểm tra việc tạo mẫu (hoàn toàn bằng số):

  1. Chúng tôi đã thực hiện một số loại thử nghiệm giả thuyết thống kê, một trong số đó là thử nghiệm mô hình phù hợp chi bình phương - một thử nghiệm chi bình phương về số lượng mẫu trong các thùng được xác định từ CDF nghịch đảo của phân phối xác suất đã cho. Vì vậy, ví dụ, để kiểm tra việc tạo mẫu phân phối Cauchy, tôi chạy một cái gì đó như

    with(Statistics):
    infolevel[Statistics] := 1:
    distribution := CauchyDistribution(2, 3):
    sample := Sample(distribution, 10^6):
    ChiSquareSuitableModelTest(sample, distribution, 'bins' = 100, 'level' = 0.001);
    

    α

  2. Đối với các bản phân phối có các khoảnh khắc hữu hạn, tôi tính toán một mặt một số khoảnh khắc mẫu và mặt khác, tôi tính toán một cách tượng trưng các khoảnh khắc phân phối tương ứng và sai số chuẩn của chúng. Vì vậy, ví dụ như bản phân phối beta:

    with(Statistics):
    distribution := BetaDistribution(2, 3):
    distributionMoments := Moment~(distribution, [seq(1 .. 10)]);
    standardErrors := StandardError[10^6]~(Moment, distribution, [seq(1..10)]);
    evalf(distributionMoments /~ standardErrors);
    

    106

    with(Statistics):
    sample := Sample(BetaDistribution(2, 3), 10^6):
    sampleMoments := map2(Moment, sample, [seq(1 .. 10)]);
    distributionMoments := [2/5, 1/5, 4/35, 1/14, 1/21, 1/30, 4/165, 1/55, 2/143, 1/91];
    standardErrors := 
      [1/5000, 1/70000*154^(1/2), 1/210000*894^(1/2), 1/770000*7755^(1/2), 
       1/54600*26^(1/2), 1/210000*266^(1/2), 7/5610000*2771^(1/2), 
       1/1567500*7809^(1/2), 3/5005000*6685^(1/2), 1/9209200*157366^(1/2)];
    deviations := abs~(sampleMoments - distributionMoments) /~ standardErrors;
    

    Các số trong distributionMomentsstandardErrorsđến từ lần chạy đầu tiên ở trên. Bây giờ nếu thế hệ mẫu là chính xác, các số trong độ lệch sẽ tương đối nhỏ. Tôi giả sử rằng chúng được phân phối gần như bình thường (mà chúng không thực sự, nhưng nó đủ gần - nhớ lại đây là các phiên bản thu nhỏ của các khoảnh khắc mẫu, chứ không phải bản thân các mẫu) và do đó, tôi có thể đánh dấu một trường hợp có độ lệch lớn hơn 4 - tương ứng với một khoảnh khắc mẫu sai lệch hơn bốn lần so với sai số chuẩn so với thời điểm phân phối. Điều này rất khó xảy ra ngẫu nhiên nếu thế hệ mẫu tốt. Mặt khác, nếu 10 khoảnh khắc mẫu đầu tiên khớp với các khoảnh khắc phân phối trong phạm vi dưới nửa phần trăm, thì chúng ta có một xấp xỉ khá tốt về phân phối.

Chìa khóa cho lý do tại sao cả hai phương pháp này hoạt động là mã tạo mẫu và mã ký hiệu gần như hoàn toàn rời rạc. Nếu có sự trùng lặp giữa hai cái, thì một lỗi trong sự trùng lặp đó có thể xuất hiện cả trong quá trình tạo mẫu và xác minh của nó, và do đó không bị bắt.


Cảm ơn câu trả lời của bạn. Tôi "chấp nhận" câu trả lời khác vì tôi chỉ được phép chọn một câu và điều đó có vẻ phù hợp với tình hình hiện tại của tôi hơn một chút. Nhưng câu trả lời của bạn cũng rất hữu ích.
Jyotirmoy Bhattacharya

2

Bruce McCullough đã có một chút công nghiệp tiểu thủ trong việc đánh giá phần mềm thống kê (theo nghĩa rộng nhất; ông cũng đã thử nghiệm Microsoft Excel. Và thấy nó muốn). Hai bài báo minh họa một phần phương pháp của ông là ở đâyđây.


2

Rất nhiều chi tiết được đưa ra bởi Chủ tịch của StataCorp, William Gould, trong bài viết này của Tạp chí Stata. 1 Đây là một bài viết rất thú vị về kiểm soát chất lượng của phần mềm thống kê.

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.