Statistische Software testen


10

Welche Techniken / Ansätze sind beim Testen statistischer Software nützlich? Ich interessiere mich besonders für Programme, die parametrische Schätzungen mit maximaler Wahrscheinlichkeit durchführen.

Der Vergleich von Ergebnissen mit denen aus anderen Programmen oder veröffentlichten Quellen ist nicht immer möglich, da die meiste Zeit, wenn ich ein eigenes Programm schreibe, die von mir benötigte Berechnung nicht bereits in einem vorhandenen System implementiert ist.

Ich bestehe nicht auf Methoden, die die Richtigkeit garantieren können. Ich würde mich über Techniken freuen, die einen Bruchteil der Fehler auffangen können.

Antworten:


8

Eine nützliche Technik ist das Monte-Carlo-Testen. Wenn es zwei Algorithmen gibt, die dasselbe tun, implementieren Sie beide, geben Sie ihnen zufällige Daten und überprüfen Sie, ob sie (innerhalb einer kleinen Toleranz für numerische Fuzz) dieselbe Antwort liefern. Ich habe das schon mehrmals gemacht:

  • Ich habe eine effiziente, aber schwer zu implementierende -Implementierung von Kendalls Tau B geschrieben. Um sie zu testen, habe ich eine absolut einfache 50-Zeilen-Implementierung geschrieben, die in . O(N log N)O(N2)

  • Ich habe einen Code geschrieben, um die Gratregression durchzuführen. Der beste Algorithmus dafür hängt davon ab, ob Sie sich im Fall oder Ich brauchte also sowieso zwei Algorithmen. n>pp>n

In beiden Fällen implementierte ich relativ bekannte Techniken in der Programmiersprache D (für die es keine Implementierung gab), daher überprüfte ich auch einige Ergebnisse gegen R. Trotzdem wurden beim Monte-Carlo-Test Fehler entdeckt, die ich sonst nie entdeckt hätte .

Ein weiterer guter Test ist behauptet . Möglicherweise wissen Sie nicht genau, wie die korrekten Ergebnisse Ihrer Berechnung aussehen sollen. Dies bedeutet jedoch nicht, dass Sie in verschiedenen Phasen der Berechnung keine Überprüfung der Gesundheit durchführen können. In der Praxis ist der Code normalerweise richtig, wenn Sie viele davon in Ihrem Code haben und alle bestehen.

Bearbeiten: Eine dritte Methode besteht darin, die Algorithmusdaten (synthetisch oder real) einzugeben, bei denen Sie zumindest ungefähr wissen, was die richtige Antwort ist, auch wenn Sie nicht genau wissen, und durch Inspektion festzustellen, ob die Antwort angemessen ist. Beispielsweise wissen Sie möglicherweise nicht genau, wie hoch die Schätzungen Ihrer Parameter sind, aber Sie wissen möglicherweise, welche "groß" und welche "klein" sein sollen.


5

Ich bin mir nicht sicher, ob dies wirklich eine Antwort auf Ihre Frage ist, aber es hängt zumindest tangential zusammen.

Ich pflege das Statistikpaket in Maple . Ein interessantes Beispiel für schwer zu testenden Code ist die Erzeugung von Zufallsstichproben nach verschiedenen Verteilungen. Es ist leicht zu testen, ob keine Fehler generiert werden, aber es ist schwieriger festzustellen, ob die generierten Stichproben "gut genug" der angeforderten Verteilung entsprechen. Da Maple sowohl symbolische als auch numerische Merkmale aufweist, können Sie einige der symbolischen Merkmale verwenden, um die (rein numerische) Stichprobenerzeugung zu testen:

  1. Wir haben einige Arten von statistischen Hypothesentests implementiert, von denen einer der Chi-Quadrat-geeignete Modelltest ist - ein Chi-Quadrat-Test der Anzahl von Proben in Behältern, der aus der inversen CDF der gegebenen Wahrscheinlichkeitsverteilung bestimmt wird. Um beispielsweise die Erzeugung von Cauchy-Verteilungsproben zu testen, führe ich so etwas aus

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

    Da ich eine so große Stichprobe erzeugen kann, wie ich möchte, kann ich ziemlich klein machen.α

  2. Für Verteilungen mit endlichen Momenten berechne ich einerseits eine Anzahl von Beispielmomenten und andererseits berechne ich symbolisch die entsprechenden Verteilungsmomente und ihren Standardfehler. Also zum Beispiel für die Beta-Distribution:

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

    Dies zeigt eine abnehmende Liste von Zahlen, von denen die letzte 255.1085766 ist. Selbst für den 10. Moment ist der Wert des Moments mehr als das 250-fache des Wertes des Standardfehlers des Probenmoments für eine Probe der Größe . Dies bedeutet, dass ich einen Test implementieren kann, der mehr oder weniger wie folgt ausgeführt wird: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;
    

    Die Zahlen in distributionMomentsund standardErrorsstammen aus dem ersten Lauf oben. Wenn die Stichprobenerzeugung korrekt ist, sollten die Zahlen in Abweichungen relativ klein sein. Ich gehe davon aus, dass sie ungefähr normal verteilt sind (was sie nicht wirklich sind, aber es kommt nahe genug - denken Sie daran, dass dies skalierte Versionen von Sample-Momenten sind, nicht die Samples selbst), und so kann ich zum Beispiel einen Fall markieren, in dem eine Abweichung vorliegt größer als 4 - entspricht einem Abtastmoment, das mehr als das Vierfache des Standardfehlers vom Verteilungsmoment abweicht. Es ist sehr unwahrscheinlich, dass dies zufällig auftritt, wenn die Stichprobenerzeugung gut ist. Wenn andererseits die ersten 10 Abtastmomente mit den Verteilungsmomenten auf weniger als ein halbes Prozent übereinstimmen, haben wir eine ziemlich gute Annäherung an die Verteilung.

Der Schlüssel, warum diese beiden Methoden funktionieren, besteht darin, dass der Beispielgenerierungscode und der symbolische Code fast vollständig voneinander getrennt sind. Wenn es eine Überlappung zwischen den beiden geben würde, könnte sich ein Fehler in dieser Überlappung sowohl in der Stichprobenerzeugung als auch in ihrer Überprüfung manifestieren und somit nicht abgefangen werden.


Danke für deine Antwort. Ich "akzeptiere" die andere Antwort, da ich nur eine auswählen darf und das meiner aktuellen Situation etwas besser zu entsprechen schien. Aber Ihre Antwort war auch sehr hilfreich.
Jyotirmoy Bhattacharya

2

Bruce McCullough hatte eine gewisse Erfahrung in der Bewertung von Statistiksoftware (im weitesten Sinne; er testete auch Microsoft Excel. Und fand es mangelhaft). Zwei Papiere, die einen Teil seines Ansatzes veranschaulichen, sind hier und hier.


2

Der Präsident von StataCorp, William Gould, gibt in diesem Artikel im Stata Journal viele Details bekannt. 1 Es ist ein sehr interessanter Artikel über die Qualitätskontrolle von Statistiksoftware.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.