통계 소프트웨어 테스트


10

통계 소프트웨어를 테스트하는 데 유용한 기술 / 접근법은 무엇입니까? 특히 최대 가능성을 사용하여 파라 메트릭 추정을 수행하는 프로그램에 관심이 있습니다.

내 자신의 프로그램을 작성할 때 대부분의 경우 필요한 계산이 기존 시스템에서 아직 구현되지 않았기 때문에 다른 프로그램이나 게시 된 소스의 결과를 항상 비교할 수있는 것은 아닙니다.

정확성을 보장 할 수있는 방법을 고집하지는 않습니다. 나는 약간의 오류를 잡을 수있는 기술에 만족할 것입니다.

답변:


8

유용한 기술 중 하나는 몬테 카를로 테스트입니다. 동일한 작업을 수행하는 두 개의 알고리즘이있는 경우 두 가지를 모두 구현하고 임의의 데이터를 먹이고 수치 적 퍼지에 대한 작은 허용 오차 내에서 동일한 대답을 생성하는지 확인하십시오. 전에 여러 번이 작업을 수행했습니다.

  • 나는 켄달의 타우 B의 구현을 효율적이지만 구현하기가 어렵다고 썼다 . 이것을 테스트하기 위해 에서 실행되는 간단한 50 줄 구현을 작성했다 . O ( N 2 )O(N log N)O(N2)

  • 능선 회귀를 수행하는 코드를 작성했습니다. 이 작업을 수행하는 가장 좋은 알고리즘은 또는 경우에 따라 다르므로 두 가지 알고리즘이 필요했습니다. p > nn>pp>n

이 두 가지 경우 모두 D 프로그래밍 언어로 비교적 잘 알려진 기술을 구현하고 있었기 때문에 (구현이 없었 음) R에 대해서도 몇 가지 결과를 확인했습니다. 그럼에도 불구하고 몬테 카를로 테스트는 다른 방법으로는 결코 잡을 수 없었던 버그를 발견했습니다. .

또 다른 좋은 테스트는 주장 이다. 정확한 계산 결과가 무엇인지 정확히 알지 못할 수도 있지만, 계산의 여러 단계에서 온 전성 검사를 수행 할 수 없다는 의미는 아닙니다. 실제로 코드에 이것들이 많고 모두 통과하면 코드가 일반적입니다.

편집 : 세 번째 방법은 정확히 알지 못하더라도 적어도 정답이 무엇인지 알 수있는 알고리즘 데이터 (합성 또는 실제)를 제공하고 대답이 합리적인지 검사하여 확인하는 것입니다. 예를 들어, 모수의 추정치가 정확히 무엇인지는 모르지만 어느 것이 "큰"것으로 가정하고 어떤 것이 "작은"것으로 알고 있는지는 알고있을 것입니다.


5

이것이 귀하의 질문에 대한 답변인지 확실하지 않지만 적어도 접선 적으로 관련되어 있습니다.

Maple 에서 통계 패키지를 유지 관리합니다 . 코드를 테스트하기 어려운 흥미로운 예는 다른 분포에 따른 무작위 샘플 생성입니다. 오류가 생성되지 않았는지 테스트하는 것은 쉽지만 생성 된 샘플이 요청 된 분포를 "충분히"준수하는지 여부를 결정하는 것이 더 까다 롭습니다. 메이플에는 기호 기능과 숫자 기능이 모두 있으므로 일부 기호 기능을 사용하여 (순수 숫자) 샘플 생성을 테스트 할 수 있습니다.

  1. 우리는 몇 가지 유형의 통계적 가설 검정을 구현했습니다. 그 중 하나는 카이 제곱 적합 모형 검정 입니다. 주어진 확률 분포의 역 CDF에서 결정된 빈의 샘플 수에 대한 카이 제곱 검정입니다. 예를 들어, 코시 분포 샘플 생성을 테스트하기 위해

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

    원하는만큼 많은 샘플을 생성 할 수 있으므로 매우 작게 만들 수 있습니다 .α

  2. 유한 모멘트를 갖는 분포의 경우, 한편으로는 많은 샘플 모멘트를 계산하고, 다른 한편으로는 해당 분포 모멘트와 표준 오차를 상징적으로 계산합니다. 예를 들어 베타 배포판 :

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

    감소하는 숫자 목록을 표시하며 마지막 숫자는 255.1085766입니다. 따라서 10 번째 모멘트조차도 모멘트 값은 크기의 표본에 대한 표본 모멘트 표준 오차 값의 250 배 이상 입니다. 이것은 다음과 같이 어느 정도 실행되는 테스트를 구현할 수 있음을 의미합니다.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;
    

    숫자는에서 distributionMomentsstandardErrors위의 첫 번째 실행에서 왔습니다. 이제 샘플 생성이 올바른 경우 편차의 숫자는 상대적으로 작아야합니다. 나는 그것들이 대략 정규 분포되어 있다고 가정합니다. 4보다 큰-분포 모멘트에서 표준 오차를 4 배 이상 벗어난 표본 모멘트에 해당합니다. 샘플 생성이 양호하면 무작위로 발생할 가능성이 거의 없습니다. 다른 한편으로, 처음 10 개의 샘플 모멘트가 분포 모멘트를 0.5 % 미만으로 맞추면 분포의 근사치가 상당히 좋습니다.

이 두 가지 방법이 모두 작동하는 이유는 샘플 생성 코드와 기호 코드가 거의 완전히 분리되어 있다는 것입니다. 둘 사이에 겹침이 있으면 해당 겹침의 오류가 샘플 생성과 검증에서 모두 나타날 수 있으므로 포착되지 않습니다.


답변 주셔서 감사합니다. 하나만 선택할 수 있고 다른 현재 상황에 더 잘 맞는 것처럼 다른 답변을 "수락"하고 있습니다. 그러나 귀하의 답변도 매우 도움이되었습니다.
Jyotirmoy Bhattacharya

2

브루스 맥 컬러 (Bruce McCullough)는 통계 소프트웨어를 평가할 때 약간의 코티지 산업을 보유하고있었습니다. 그의 접근 방식의 일부를 보여 두 논문은 여기여기.


2

이 Stata Journal 기사에 William Gould 인 StataCorp 회장이 자세히 설명합니다. 1 통계 소프트웨어의 품질 관리에 관한 매우 흥미로운 기사입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.