Розрахунок нового стандартного відхилення з використанням старого стандартного відхилення після зміни набору даних


16

У мене є масив з реальних значень, який має середнє значення та стандартне відхилення . Якщо елемент масиву буде замінений іншим елементом , тоді буде нове значенняnμoldσoldxixj

μnew=μold+xjxin

Перевага цього підходу полягає в тому, що він вимагає постійних обчислень незалежно від значення . Чи є якийсь підхід для обчислення використовуючи як обчислення використовуючи ?nσnewσoldμnewμold


Це домашнє завдання? Дуже подібне завдання було задано в нашому курсі математичної статистики ...
krlmlr

2
@ user946850: Ні, це не домашнє завдання. Я веду дисертацію з еволюційного алгоритму . Я хочу використовувати стандартне відхилення як міру різноманітності населення. Просто шукаємо більш ефективне рішення.
користувач

1
SD - це квадратний корінь дисперсії, який є лише середнім значенням квадрата (скоригованим кратним середнім значенням квадрата, яке ви вже знаєте, як оновити). Тому ті самі методи, які використовуються для обчислення середнього бігу, можуть застосовуватися без будь-яких кардинальних змін для обчислення дисперсії бігу. Насправді набагато складніші статистичні дані можна обчислити в Інтернеті за допомогою одних і тих же ідей: див. , Наприклад, теми на stats.stackexchange.com/questions/6920 та stats.stackexchange.com/questions/23481 .
whuber

1
@whuber: про це йдеться у статті Вікіпедії для Variance , але також із приміткою про катастрофічне скасування (або втрату значущості), яке може статися. Це завищена чи реальна проблема для бігової дисперсії?
krlmlr

Це чудове запитання. Якщо ви накопичуєте відхилення наївно, не заздалегідь відцентруючи їх, ви дійсно можете потрапити в проблеми. Проблема виникає, коли цифри величезні, але їх відмінність невелика. Наприклад, розглянемо серію точних вимірювань швидкості світла в м / с, як у 299792458.145, 299792457.883, 299792457.998, ...: їх дисперсія, яка становить приблизно 0,01, настільки мала в порівнянні з їх квадратиками, яка становить приблизно , цей необережний розрахунок (навіть у подвійній точності) призведе до нульової дисперсії: всі значущі цифри зникнуть. 1017
whuber

Відповіді:


7

Розділ в статті Вікіпедії про «Алгоритми для обчислення дисперсії» показує , як обчислити дисперсію , якщо елементи додаються до вашими спостереженнями. (Нагадаємо, що стандартне відхилення є квадратним коренем дисперсії.) Припустимо, що ви додаєте до масиву, тодіxn+1

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

EDIT : Наведена формула здається помилковою, дивіться коментар.

Тепер заміна елемента означає додавання спостереження та видалення іншого; обидва можна обчислити за формулою вище. Однак майте на увазі, що проблеми чисельної стійкості можуть виникнути; цитується стаття також пропонує чисельно стійкі варіанти.

Щоб вивести формулу самостійно, обчисліть використовуючи визначення варіації вибірки та заміну за формулою, яку ви надали, коли це доречно . Це дає вам врешті-решт, і, таким чином, формулу для задано та . У моєму позначенні я припускаю, що ви замінюєте елемент на :μ n e w σ 2 n e w - σ 2 o l d σ n e w σ o l d μ o l d x n x n(n1)(σnew2σold2)μnewσnew2σold2σnewσoldμ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)

в сумі перетворюється на щось залежне від , але ви повинні працювати рівняння трохи більше , щоб отримати акуратний результат. Це має дати вам загальну думку.xkμold


перша формула, яку ви подали, не здається правильною, це означає, що якщо менший / більший, то і від нового, і від старого значення дисперсія завжди збільшується, що не має сенсу. Він може збільшуватися або зменшуватися залежно від розподілу. xn+1
Еммет Б

@EmmetB: Так, ти маєш рацію - це, мабуть, має бути На жаль, це зводить звідси всю мою дискусію, але я залишаю це для історичних цілей. Хоча ви можете редагувати. σnew2=n1nσold2+1n(xn+1μnew)(xn+1μold).
krlmlr

4

Виходячи з того, що, на мою думку, я читаю у пов'язаній статті Вікіпедії, ви можете підтримувати стандартне відхилення "працює":

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

Хоча в статті вони не підтримують окремий хід sumі count, але замість того, щоб мати єдиний mean. Оскільки в тому, що я роблю сьогодні, я зберігаю count(для статистичних цілей), корисніше щоразу обчислювати кошти.


0

Враховуючи початкові , і , а також зміну заданого елемента на , я вважаю, що вашим новим стандартним відхиленням буде квадратний корінь де , а позначає нове значення.x¯snxnxns

s2+1n1(2nΔx¯(xnx¯)+n(n1)(Δx¯)2),
Δx¯=x¯x¯x¯

Можливо, є химерніший спосіб його написання?

Я перевірив це на невеликому тестовому випадку, і, здавалося, він працює.


1
@john / свист у темряві: мені сподобалась ваша відповідь, здається, що вона працює належним чином у моєму невеликому наборі даних. Чи є математична основа / посилання на неї? Не могли б ви допомогти?
Алок Чоуддурі

Питання було все @Whistling in the Dark, я просто прибирав його для сайту. Ви повинні поставити нове запитання з посиланням на питання та відповідь тут. А також вам слід підтримати цю відповідь, якщо ви так почуваєтесь.
Іван
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.