Вычисление среднего доверительного интервала без сохранения всех точек данных - PullRequest
6 голосов
/ 12 ноября 2008

Для больших n (см. Ниже, как определить, что достаточно велико), безопасно рассматривать по центральной предельной теореме распределение среднего значения выборки как нормальное (гауссово), но я бы хотел, чтобы процедура дает доверительный интервал для любого n. Способ сделать это - использовать дистрибутив Student T с n-1 степенями свободы.

Таким образом, вопрос, учитывая поток точек данных, которые вы собираете или встречаете по одной за раз, как рассчитать доверительный интервал c (например, c=.95) для среднего значения точек данных (без хранение всех ранее обнаруженных данных)?

Другой способ задать вопрос: как вы отслеживаете первые и вторые моменты для потока данных, не сохраняя весь поток?

БОНУСНЫЙ ВОПРОС: Можете ли вы отслеживать более высокие моменты, не сохраняя весь поток?

Ответы [ 6 ]

4 голосов
/ 12 ноября 2008

[Огромное спасибо John D Cook за многое из того, что я узнал, составив этот ответ!]

Во-первых, вот причина не использовать сумму квадратов: http://www.johndcook.com/blog/2008/09/26/

Что вы должны сделать вместо этого:

Следите за количеством (n), средним (u) и количеством (величинами), по которым можно определить дисперсию выборки и стандартную ошибку. (Адаптировано с http://www.johndcook.com/standard_deviation.html.)

Инициализировать n = u = s = 0.

Для каждого нового элемента данных, x:

u0 = u;
n ++;
u += (x - u) / n;
s += (x - u0) * (x - u);

Тогда дисперсия выборки равна s/(n-1), дисперсия среднего значения выборки равна s/(n-1)/n, а стандартная ошибка среднего значения выборки составляет SE = sqrt(s/(n-1)/n).

Осталось вычислить доверительный интервал Стьюдента-t c (c in (0,1)):

u [plus or minus] SE*g((1-c)/2, n-1)

, где g - обратный cdf (он же квантиль) распределения Student-t со средним 0 и дисперсией 1, принимая вероятность и степени свободы (на единицу меньше, чем число точек данных):

g(p,df) = sign(2*p-1)*sqrt(df)*sqrt(1/irib(1, -abs(2*p-1), df/2, 1/2) - 1)

где irib - обратная регуляризованная неполная бета-функция:

irib(s0,s1,a,b) = z such that rib(s0,z,a,b) = s1

, где rib - регуляризованная неполная бета-функция:

rib(x0,x1,a,b) = B(x0,x1,a,b) / B(a,b)

, где B(a,b) - бета-функция Эйлера, а B(x0,x1,a,b) - неполная бета-функция:

B(a,b) = Gamma(a)*Gamma(b)/Gamma(a+b) = integral_0^1 t^(a-1)*(1-t)^(b-1) dt
B(x0,x1,a,b) = integral_x0^x1 t^(a-1)*(1-t)^(b-1) dt

Типичные числовые / статистические библиотеки будут иметь реализации бета-функции (или обратного cdf дистрибутива Student-t напрямую). Для C стандартом де-факто является Научная библиотека Gnu (GSL). Часто дается бета-функция с тремя аргументами; обобщение на 4 аргумента выглядит следующим образом:

B(x0,x1,a,b) = B(x1,a,b) - B(x0,a,b)
rib(x0,x1,a,b) = rib(x1,a,b) - rib(x0,a,b)

Наконец, вот реализация в Mathematica:

(* Take current {n,u,s} and new data point; return new {n,u,s}. *)
update[{n_,u_,s_}, x_] := {n+1, u+(x-u)/(n+1), s+(x-u)(x-(u+(x-u)/(n+1)))}

Needs["HypothesisTesting`"];
g[p_, df_] := InverseCDF[StudentTDistribution[df], p]

(* Mean CI given n,u,s and confidence level c. *)
mci[n_,u_,s_, c_:.95] := With[{d = Sqrt[s/(n-1)/n]*g[(1-c)/2, n-1]}, 
  {u+d, u-d}]

Сравнить с

StudentTCI[u, SE, n-1, ConfidenceLevel->c]

или, когда доступен весь список точек данных,

MeanCI[list, ConfidenceLevel->c]

Наконец, если вы не хотите загружать математические библиотеки для таких вещей, как бета-функция, вы можете жестко закодировать таблицу поиска для -g((1-c)/2, n-1). Вот это для c=.95 и n=2..100:

12.706204736174698, 4.302652729749464, 3.182446305283708, 2.7764451051977934, 2.570581835636314, 2.4469118511449666, 2.3646242515927853, 2.306004135204168, 2.262157162798205, 2.2281388519862735, 2.2009851600916384, 2.178812829667226, 2.1603686564627917, 2.1447866879178012, 2.131449545559774, 2.1199052992212533, 2.1098155778333156, 2.100922040241039, 2.093024054408307, 2.0859634472658626, 2.0796138447276835, 2.073873067904019, 2.0686576104190477, 2.0638985616280254, 2.0595385527532963, 2.05552943864287, 2.051830516480281, 2.048407141795243, 2.0452296421327034, 2.042272456301236, 2.039513446396408, 2.0369333434600976, 2.0345152974493392, 2.032244509317719, 2.030107928250338, 2.0280940009804462, 2.0261924630291066, 2.024394163911966, 2.022690920036762, 2.0210753903062715, 2.0195409704413745, 2.018081702818439, 2.016692199227822, 2.0153675744437627, 2.0141033888808457, 2.0128955989194246, 2.011740513729764, 2.0106347576242314, 2.0095752371292335, 2.0085591121007527, 2.007583770315835, 2.0066468050616857, 2.005745995317864, 2.0048792881880577, 2.004044783289136, 2.0032407188478696, 2.002465459291016, 2.001717484145232, 2.000995378088259, 2.0002978220142578, 1.9996235849949402, 1.998971517033376, 1.9983405425207483, 1.997729654317692, 1.9971379083920013, 1.9965644189523084, 1.996008354025304, 1.9954689314298386, 1.994945415107228, 1.9944371117711894, 1.9939433678456229, 1.993463566661884, 1.9929971258898527, 1.9925434951809258, 1.992102154002232, 1.9916726096446793, 1.9912543953883763, 1.9908470688116922, 1.9904502102301198, 1.990063421254452, 1.989686323456895, 1.9893185571365664, 1.9889597801751728, 1.9886096669757192, 1.9882679074772156, 1.9879342062390228, 1.9876082815890748, 1.9872898648311672, 1.9869786995062702, 1.986674540703777, 1.986377154418625, 1.9860863169510985, 1.9858018143458114, 1.9855234418666061, 1.9852510035054973, 1.9849843115224508, 1.9847231860139618, 1.98446745450849, 1.9842169515863888

, который асимптотически приближается к обратному CDF нормального (0,1) распределения для c=.95, то есть:

-sqrt(2)*InverseErf(-c) = 1.959963984540054235524594430520551527955550...

См. http://mathworld.wolfram.com/InverseErf.html для обратной функции erf(). Обратите внимание, что g((1-.95)/2,n-1) не округляется до 1,96, пока не будет хотя бы 474 точек данных. Он округляется до 2,0, когда имеется 29 точек данных.

Как правило, вы должны использовать Student-t вместо нормального приближения для n до не менее 300, а не 30 для обычной мудрости. Ср http://www.johndcook.com/blog/2008/11/12/.

См. Также «Улучшение счета сжатых» Пинг Ли из Корнелла.

4 голосов
/ 12 ноября 2008

Вот статья о , как вычислить среднее и стандартное отклонение за один проход , не сохраняя никаких данных. Когда у вас есть эти две статистики, вы можете оценить доверительный интервал. 95% доверительный интервал будет [среднее значение - 1,96 * стандартное отклонение, среднее + 1,96 * стандартное отклонение] при условии нормального распределения ваших данных и большого количества точек данных.

Для меньшего числа точек данных ваш доверительный интервал будет [среднее - c (n) * stdev, среднее + c (n) * stdev], где c (n) зависит от размера вашей выборки и уровня вашей достоверности. Для уровня достоверности 95% здесь приведены значения c (n) для n = 2, 3, 4, ..., 30

12.70620, 4.302653, 3.182446, 2.776445, 2.570582, 2.446912, 2.364624, 2.306004, 2.262157, 2.228139, 2.200985, 2.178813, 2.160369, 2.144787, 2.131450, 2.119905, 2.109816, 2,0307, ​​2,0302, 2,0302, 2,0302, 2,0302, 2,0302, 2,0962, 2,0962, 2,0962, 2,096, 2,06, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,030, 2,02, 2,030, 2, 2, 2, 2, 2, 3, 2, 2, т., * 1006. , 2.059539, 2.055529, 2.051831, 2.048407, 2.045230

Это числа g (0,025, n-1), где g - обратная CDF t-распределения с n степенями свободы. Если вам нужен доверительный интервал 99%, замените 0,025 на 0,005. Как правило, для уровня достоверности 1-альфа используйте альфа / 2.

Вот команда R , которая сгенерировала константы выше.

n = seq(2, 30); qt(0.025, n-1)

Вот сообщение в блоге , объясняющее, почему цифры выше не настолько близки к 1,96, как вы могли бы ожидать.

2 голосов
/ 12 ноября 2008
   sigma = sqrt( (q - (s*s/n)) / (n-1) )
   delta = t(1-c/2,n-1) * sigma / sqrt(n)

Где t (x, n-1) - это t-распределение с n-1 степенями свободы. если вы используете gsl

t = gsl_cdf_tdist_Qinv (c/2.0, n-1)

Нет необходимости хранить какие-либо данные, кроме суммы квадратов. Теперь у вас может возникнуть проблема с числовыми значениями, потому что сумма квадратов может быть довольно большой. Вы можете использовать альтернативное определение s

sigma = sqrt(sum(( x_i - s/n )^2 / (n-1)))

и сделать два прохода. Я рекомендую вам использовать научную библиотеку GNU или пакет типа R , чтобы помочь вам избежать проблем с числовыми данными. Также будьте осторожны при использовании центральной предельной теоремы. Злоупотребление этим частично является причиной всего финансового кризиса, который продолжается прямо сейчас.

1 голос
/ 05 февраля 2010

Я думаю, вам не нужно сильно беспокоиться о размере n, потому что он скоро превысит число 30, где распределение можно считать нормальным. Я думаю, что использование байесовской рекурсии для последующего вывода среднего значения и параметров дисперсии в предположении нормальной модели - лучший способ, если вы не хотите сохранять какие-либо точки данных из предыдущих выборок. Вы можете взглянуть на этот документ для совместного вывода для среднего значения и дисперсии, и, в частности, уравнений 38a, 38b и 38c.

1 голос
/ 12 ноября 2008

Вы не хотите накапливать сумму квадратов. Полученная статистика численно неточна - в итоге вы вычтете два больших одинаковых числа. Вы хотите сохранить дисперсию, или (n-1) * дисперсию, или что-то в этом роде.

Простой способ - накапливать точки данных постепенно. Формула не сложна или ее трудно вывести (см. Ссылку Джона Д. Кука).

Еще более точный способ сделать это - объединить точки данных попарно-рекурсивно. Вы можете сделать это с помощью логарифмической памяти в n: регистр k содержит статистику для 2 ^ k старых точек данных, которые объединяются со статистикой для 2 ^ k новых точек, чтобы получить статистику для 2 ^ (k + 1) точек ...

0 голосов
/ 12 ноября 2008

Я думаю, что вы можете. Мне нужно было бы зайти в Google / Wikipidia, поэтому я оставлю это как упражнение для читателя.

...