Berechnung der neuen Standardabweichung unter Verwendung der alten Standardabweichung nach Änderung des Datensatzes


16

Ich habe ein Array von reellen Werten, die den Mittelwert von μ o l d und die Standardabweichung von σ o l d haben . Wenn ein Element des Arrays x i durch ein anderes Element x j ersetzt wird , lautet der neue MittelwertnμÖldσÖldxichxj

μnew=μÖld+xj-xichn

Der Vorteil dieses Ansatzes besteht darin, dass eine konstante Berechnung unabhängig vom Wert von erforderlich ist . Gibt es einen Ansatz zur Berechnung von σ n e w unter Verwendung von σ o l d wie die Berechnung von μ n e w unter Verwendung von μ o l d ?nσnewσÖldμnewμÖld


Ist das Hausaufgabe? Eine sehr ähnliche Aufgabe wurde in unserem Kurs der mathematischen Statistik gestellt ...
krlmlr

2
@ user946850: Nein, es sind keine Hausaufgaben. Ich mache meine Doktorarbeit über den evolutionären Algorithmus . Ich möchte die Standardabweichung als Maß für die Bevölkerungsvielfalt verwenden. Ich suche nach einer effizienteren Lösung.
Benutzer

1
Die SD ist die Quadratwurzel der Varianz, bei der es sich lediglich um den quadratischen Mittelwert handelt (angepasst um ein Vielfaches des quadratischen Mittelwerts, den Sie bereits aktualisieren können). Daher können die gleichen Methoden, die zur Berechnung eines laufenden Mittelwerts verwendet werden, ohne grundlegende Änderung zur Berechnung einer laufenden Varianz angewendet werden. Tatsächlich können auf Online-Basis viel ausgefeiltere Statistiken mit denselben Ideen erstellt werden: siehe z. B. die Threads unter stats.stackexchange.com/questions/6920 und stats.stackexchange.com/questions/23481 .
whuber

1
@whuber: Dies wird im Wikipedia-Artikel für Varianz erwähnt , aber auch mit einem Hinweis auf eine möglicherweise auftretende katastrophale Annullierung (oder einen Bedeutungsverlust). Ist das überbewertet oder ein echtes Problem für die Laufvarianz?
krlmlr

Das ist eine gute Frage. Wenn Sie die Varianzen naiv akkumulieren, ohne sie vorher zu zentrieren, können Sie tatsächlich in Schwierigkeiten geraten. Das Problem tritt auf, wenn die Zahlen sehr groß sind, ihre Varianz jedoch gering ist. Betrachten Sie zum Beispiel eine Reihe genauer Messungen der Lichtgeschwindigkeit in m / s wie 299792458.145, 299792457.883, 299792457.998, ...: Ihre Varianz ist mit etwa 0,01 im Vergleich zu ihren Quadraten mit etwa so gering In 17 würde diese unvorsichtige Berechnung (sogar mit doppelter Genauigkeit) zu einer Varianz von Null führen: Alle signifikanten Ziffern würden verschwinden. 1017
whuber

Antworten:


7

Ein Abschnitt im Wikipedia-Artikel über "Algorithmen zur Berechnung der Varianz" zeigt, wie die Varianz berechnet wird, wenn Ihren Beobachtungen Elemente hinzugefügt werden. (Denken Sie daran, dass die Standardabweichung die Quadratwurzel der Varianz ist.) Angenommen, Sie fügen an Ihr Array anxn+1

σnew2=σÖld2+(xn+1-μnew)(xn+1-μÖld).

EDIT : Die obige Formel scheint falsch zu sein, siehe Kommentar.

Wenn Sie nun ein Element ersetzen, müssen Sie eine Beobachtung hinzufügen und eine andere entfernen. beide können mit der obigen Formel berechnet werden. Beachten Sie jedoch, dass Probleme mit der numerischen Stabilität auftreten können. der zitierte Artikel schlägt auch numerisch stabile Varianten vor.

Um die Formel selbst abzuleiten, berechnen Sie Verwendung der Definition der Stichprobenvarianz und setzen Sie μ n e w gegebenenfalls durch die von Ihnen angegebene Formel ein. Dies ergibt am Ende σ 2 n e w - σ 2 o l d und somit eine Formel für σ n e w mit σ o l d und(n-1)(σnew2-σÖld2)μnewσnew2-σÖld2σnewσÖld . In meiner Notation gehe ich davon aus, dass Sie das Element x n durch x n ersetzen:μÖldxnxn

σ2=(n-1)-1k(xk-μ)2(n-1)(σnew2-σÖld2)=k=1n-1((xk-μnew)2-(xk-μÖld)2)+ ((xn-μnew)2-(xn-μÖld)2)=k=1n-1((xk-μÖld-n-1(xn-xn))2-(xk-μÖld)2)+ ((xn-μÖld-n-1(xn-xn))2-(xn-μÖld)2)

Das in der Summe transformiert sich in etwas, das von μ o l d abhängt , aber Sie müssen die Gleichung ein wenig genauer ausführen, um ein ordentliches Ergebnis zu erhalten. Dies sollte Ihnen die allgemeine Idee geben.xkμÖld


xn+1

σnew2=n-1nσÖld2+1n(xn+1-μnew)(xn+1-μÖld).

4

Basierend auf dem, was ich glaube, auf dem verlinkten Wikipedia-Artikel zu lesen , können Sie eine "laufende" Standardabweichung beibehalten:

real sum = 0;
int count = 0;
real S = 0;
real variance = 0;

real GetRunningStandardDeviation(ref sum, ref count, ref S, x)
{
   real oldMean;

   if (count >= 1)
   {
       real oldMean = sum / count;
       sum = sum + x;
       count = count + 1;
       real newMean = sum / count;

       S = S + (x-oldMean)*(x-newMean)
   }
   else
   {
       sum = x;
       count = 1;
       S = 0;         
   }

   //estimated Variance = (S / (k-1) )
   //estimated Standard Deviation = sqrt(variance)
   if (count > 1)
      return sqrt(S / (count-1) );
   else
      return 0;
}

In dem Artikel pflegen sie zwar keinen separaten Lauf sumund count, sondern haben stattdessen den einzigen mean. Da ich in dem, was ich heute mache, eine behalte count(zu statistischen Zwecken), ist es sinnvoller, die Mittelwerte jedes Mal zu berechnen.


0

x¯snxnxns

s2+1n-1(2nΔx¯(xn-x¯)+n(n-1)(Δx¯)2),
Δx¯=x¯-x¯x¯

Vielleicht gibt es eine schickere Art, es zu schreiben?

Ich habe dies anhand eines kleinen Testfalls überprüft, und es schien zu funktionieren.


1
@ John / Whistling in the Dark: Ich mochte Ihre Antwort, es scheint in meinem kleinen Datensatz richtig zu funktionieren. Gibt es eine mathematische Grundlage / Referenz darauf? Könnten Sie mir bitte helfen?
Alok Chowdhury

Die Frage war alles @Whistling in the Dark, ich habe es nur für die Seite aufgeräumt. Sie sollten hier eine neue Frage stellen, die auf die Frage und die Antwort verweist. Und auch Sie sollten diese Antwort positiv bewerten, wenn Sie so denken.
John
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.