Obliczanie nowego odchylenia standardowego przy użyciu starego odchylenia standardowego po zmianie zestawu danych

16

Mam tablicę n wartości rzeczywistych, co ma średnią μolre i odchylenie standardowe σolre . Jeśli element tablicy xja zostanie zastąpiony innym elementem , wówczas nowa średnia będziexjot

μnew=μold+xjxin

Zaletą tego podejścia jest to, że wymaga ciągłego obliczania niezależnie od wartości . Czy istnieje jakieś podejście do obliczania przy użyciu \ sigma_ {old}, podobnie jak obliczenia \ mu_ {new} przy użyciu \ mu_ {old} ?σ n e w σ o l d μ n e w μ o l dnσnewσoldμnewμold

użytkownik
źródło
Czy to zadanie domowe? Bardzo podobne zadanie zostało zadane w naszym kursie statystyki matematycznej ...
krlmlr
2
@ user946850: Nie, to nie zadanie domowe. Prowadzę pracę magisterską na temat algorytmu ewolucyjnego . Chcę użyć odchylenia standardowego jako miary różnorodności populacji. Po prostu szukam bardziej wydajnego rozwiązania.
użytkownik
1
SD jest pierwiastkiem kwadratowym wariancji, która jest tylko średnią kwadratową wartością (skorygowaną o wielokrotność kwadratowej średniej, którą już wiesz, jak zaktualizować). Dlatego te same metody, które zastosowano do obliczenia średniej bieżącej, można zastosować bez żadnych fundamentalnych zmian w celu obliczenia wariancji bieżącej. W rzeczywistości o wiele bardziej wyrafinowane statystyki można obliczyć w trybie online przy użyciu tych samych pomysłów: na przykład zobacz wątki na stats.stackexchange.com/questions/6920 i stats.stackexchange.com/questions/23481 .
whuber
1
@whuber: Zostało to wspomniane w artykule Wikipedii dotyczącym wariancji , ale także z uwagą na temat katastrofalnego anulowania (lub utraty znaczenia), które mogą wystąpić. Czy jest to przereklamowane, czy stanowi prawdziwy problem dla wariancji bieżącej?
krlmlr
To świetne pytanie. Jeśli gromadzisz wariancje naiwnie, bez uprzedniego ich centrowania, naprawdę możesz wpaść w kłopoty. Problem występuje, gdy liczby są ogromne, ale ich wariancja jest niewielka. Weźmy na przykład szereg dokładnych pomiarów prędkości światła wm / s, jak w 299792458.145, 299792457.883, 299792457.998, ...: ich wariancja, która wynosi około 0,01, jest tak mała w porównaniu do ich kwadratów, która wynosi około , nieostrożne obliczenia (nawet z podwójną precyzją) spowodują zerową wariancję: wszystkie znaczące cyfry znikną. 1017
whuber

Odpowiedzi:

7

Część artykułu w Wikipedii „Algorytmy obliczania wariancji” pokazuje, jak obliczyć wariancję, jeśli do twoich obserwacji zostaną dodane elementy. (Przypomnij, że odchylenie standardowe jest pierwiastkiem kwadratowym wariancji.) Załóżmy, że dodajesz do tablicy, a następniexn+1

σnew2=σold2+(xn+1μnew)(xn+1μold).

EDYCJA : Powyższa formuła wydaje się nieprawidłowa, patrz komentarz.

Teraz zastąpienie elementu oznacza dodanie obserwacji i usunięcie kolejnego; oba można obliczyć za pomocą powyższego wzoru. Należy jednak pamiętać, że mogą wystąpić problemy ze stabilnością liczbową; cytowany artykuł proponuje również warianty stabilne numerycznie.

Aby wyprowadzić formułę samodzielnie, oblicz używając definicji wariancji próbki i podstawiając μ n e w wzorem podanym w razie potrzeby. To daje ci σ 2 n e w - σ 2 o l d na końcu, a zatem wzór na σ n e w danym σ o l d i(n1)(σnew2σold2)μnewσnew2σold2σnewσold . W moim zapisie, zakładam wymienić element x n przez x ' n :μoldxnxn

σ2=(n1)1k(xkμ)2(n1)(σnew2σold2)=k=1n1((xkμnew)2(xkμold)2)+ ((xnμnew)2(xnμold)2)=k=1n1((xkμoldn1(xnxn))2(xkμold)2)+ ((xnμoldn1(xnxn))2(xnμold)2)

w sumie przekształcić w coś zależnego od ľ o l d , ale będziesz musiał pracować równania nieco więcej czerpać schludny wynik. To powinno dać ci ogólny pomysł.xkμold

krlmlr
źródło
pierwsza formuła, którą podałeś, nie wydaje się poprawna, cóż, oznacza to, że jeśli jest mniejszy / większy niż od nowej i starej średniej, wariancja zawsze rośnie, co nie ma żadnego sensu. Może się zwiększać lub zmniejszać w zależności od dystrybucji. xn+1
Emmet B
@EmmetB: Tak, masz rację - prawdopodobnie powinno to być σnew2=n1nσold2+1n(xn+1μnew)(xn+1μold). Unfortunately, this renders void my whole discussion from there, but I'm leaving it for historic purposes. Feel free to edit, though.
krlmlr
4

Based on what i think i'm reading on the linked Wikipedia article you can maintain a "running" standard deviation:

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;
}

Although in the article they don't maintain a separate running sum and count, but instead have the single mean. Since in thing i'm doing today i keep a count (for statistical purposes), it is more useful to calculate the means each time.

Ian Boyd
źródło
0

Given original x¯, s, and n, as well as the change of a given element xn to xn, I believe your new standard deviation s will be the square root of

s2+1n1(2nΔx¯(xnx¯)+n(n1)(Δx¯)2),
where Δx¯=x¯x¯, with x¯ denoting the new mean.

Maybe there is a snazzier way of writing it?

I checked this against a small test case and it seemed to work.

Whistling in the Dark
źródło
1
@john / whistling in the Dark: I liked your answer, it seems work properly in my small dataset. Is there any mathematical foundation/reference on it? Could you kindly help?
Alok Chowdhury
The question was all @Whistling in the Dark, I just cleaned it up for the site. You should pose a new question referencing the question and answer here. And also you should upvote this answer if you feel that way.
John