Среди многих вариантов наилучшим будет, пожалуй, следующий.
Приготовить три контрольных величины M1, M2 и NN, предварительно присвоив им нулевые значения до начала ввода, что на языке Pascal будет выглядеть так –
Var NN, I, X, Y: Integer;
W: Array [1…2,1…m] of Integer;
M1, M2, D, S, V: Real;
M1:=0; M2:=0; NN:=0; I:= 0;
Теперь можно организовать суммирование поступающих с клавиатуры (или прямо из уже готового массива, записанного где–то на диске) выборочных данных Xi и ni.
Пусть у нас такой массив уже есть, тогдас каждой очередной парой чисел следует поступить так
RepeatI:=I + 1; X:=W[I,1]; Y:=W[I,2];
NN:=NN+Y;
M1:=(M1+X·Y); M2:=M2+Sqr(X)·Y
Until I < m;
Операцию надо повторять до тех пор, пока мы не достигнем конца массива (при вводе с клавиатуры – пока не будет введено отрицательное значение очередного ni).
Если ввод окончен, то далее выборочные среднее, дисперсия и коэффициент вариации
N:=NN; M1:=M1/N;D:=M2/N – Sqr(M1); S:=Sqrt(D); If M1#0 Then V:=S/M1;
В предыдущем примере программирования процедуры вычисления моментов была не отмечена опасность "переполнения" – суммы M1 и M2 могут выйти за "разрядную сетку" компьютера.
Если такая угроза очевидна, то простейший выход из положения – вычислить предварительно общее число наблюдений N и потом выполнять описанный выше алгоритм суммирования с использованием не частостей, а частот.
Более надежным, однако, является другой подход к этой проблеме. Достаточно на каждом шаге суммирования преобразовывать "старые" значения сумм M1 и M2 в "новые".
Var N, NN, I, X, Y: Integer;
W: Array [1… 2,1… m] of Integer;
А, B, M1, M2, D, S, V: Real;
M1:=0; M2:=0; N:=0; I :=0;Repeat
I:=I + 1;
X:=W[I,1]; NN:=N+W[I,2]:
A:=N/NN; B:=W[I,2]/NN;
M1:=M1·A+X·B;
M2:=M2·A+Sqr(X)·B; N:=NN
Until I< m;
D:=M2 – Sqr(M1); V:= Sqrt(D);
If M1#0 Then V:=S/M1;
Более остро стоит проблема переполнения при вычислении факториалов, входящих в формулы вероятностей многих классических законов дискретных случайных величин.
Продемонстрируем метод решения подобной проблемы при вычислении биномиальных коэффициентов.
Если нам необходимо найти k–й коэффициент бинома n–й степени, то вполне надежным будет следующий алгоритм.
A:=N; B:=K; C:=1;Repeat
C:=C·A/B; A:=A-1; B:=B-1
Until B>0;
Полезно также знать, что при достаточно больших N вычисление факториала можно производить по формуле Стирлинга , однако приведенный алгоритм намного проще алгоритма использования этой формулы.
Практика прикладной статистики невозможна без использования данных о классических, стандартных законах распределения. Чтобы избежать непосредственного использования статистических таблиц при выполнения расчетов – особенно в части проверки гипотез, можно поступить двояко.
· Ввести содержание таблиц в память компьютера (непосредственно в рабочую программу или в виде отдельного файла – приложения к этой программе). Но этого мало. Надо научить компьютер "водить пальцем по таблице", т.е. запрограммировать иногда не совсем элементарный алгоритм пользования таблицей. Работа эта хоть и занудная, но зато не требующая никаких знаний, кроме умения программировать решение корректно поставленных задач – описания пользования таблицами составлены четко и алгоритмично.
· Можно поступить более рационально. Поскольку речь идет о классических распределениях дискретных или непрерывных случайных величин, то в нашем распоряжении всегда имеются формулы вычисления вероятности (или интеграла вероятности). Бытует мнение, что программирование расчетов по формулам является чуть ли не самым низким уровнем искусства программирования. На самом же деле это не совсем так, а при программировании законов распределения вероятностей – совсем не так!
Без понимания природы процесса, который порождает данную случайную величину, без знания основ теории вероятностей и математической статистики нечего и пытаться строить такие программы. Но если всё это есть, то можно строить компьютерные программы с такими возможностями статистического анализа, о которых не могли и мечтать отцы–основатели прикладной статистики. Покажем это на нескольких простых примерах.
Нам уже известно, что выдвижение в качестве нулевой гипотезы о некотором стандартном законе распределения связано только с одним обстоятельством – мы можем предсказывать итоги наблюдения в условиях её справедливости. Но это предсказание невозможно без использования конкретных значений параметра (или нескольких параметров) закона. Во всех "до–компьютерных" руководствах по прикладной статистике рано или поздно приходится читать – "а теперь возьмем таблицу … и найдем для наших условий …". Хочется проверить ту же гипотезу при другом значении параметра? Нет проблем! Повтори все расчеты при этом новом значении и снова работай с таблицей.
Иными словами, в "до–компьютерную" эпоху вопрос – а что вообще можно получить из данного наблюдения (или серии наблюдений), какова максимальная информация о случайной величине заключена в этих наблюдениях, – не ставился.
Причина этого очевидна – сложность и большие затраты времени на расчеты. Но дело еще и в том, что неопределенность статистических выводов приводила к тупиковой ситуации, когда затраты на проведение сложных, требующих особого внимания и безупречной логики расчетов, могли оказаться куда больше возможного экономического выигрыша при внедрении результатов.
Поэтому сегодня, отдав должное изобретательности творцов прикладной статистики, следует ориентировать практику статистических расчетов исключительно на применение компьютерных программ.
Это могут быть, условно говоря, "параметрические" программы, ориентированные на тот или иной тип распределения. Их назначение – найти по данным имеющихся наблюдений статистическую значимость гипотез о параметрах таких распределений или, наоборот, по заданным пользователем параметрам рассчитать вероятности всех (!) заданных им ситуаций.
Вполне реально создание и использование "непараметрических" программ – способных анализировать входные данные наблюдений и проверять гипотезы о принадлежности случайной величины к любому из "известных этой программе" закону распределения.
Наконец, использование компьютерной техники современного уровня позволяет решать за вполне приемлемое время и небольшую цену еще один вид задач – статистического моделирования. Сущность этого термина раскрывается в специальной области кибернетики – системном анализе, но кратко может быть раскрыта следующим образом.
Пусть некоторая случайная величина Z является, по нашим представлениям, функцией двух других случайных величин – X и Y. При этом оказывается, что X зависит от двух также случайных величин A и B, а Y зависит от трех случайных событий C, D и E.
Так вот, в этом "простом" случае мы знаем или предполагаем, что знаем вероятности всех событий и законы распределения всех случайных величин, кроме "выходной" величины Z.
Для простоты будем считать функциональные зависимости также известными (например, – вытекающими из некоторых законов природы):
Z = X –
; X = A + ;A = 1, 2 , … 16 и распределена по биномиальному закону с параметром p= 0.42;
B – распределена по нормальному закону с m=12 и s =2;
Y = 42, если произошло событие C, а события D и E не произошли;
Y = 177, если произошли события D и E, независимо от того, произошло ли C;
Y = –15 во всех остальных случаях.
Ясно, что попытка строить для этого примера–шутки логическую схему, по которой можно было бы вычислять возможные значения Z и соответствующие этим значениям вероятности, обречена на провал – слишком сложными и не поддающимися аналитическому описанию окажутся наши выкладки.
Однако же, при наличии знаний хотя бы основных положений прикладной статистики и умении программировать, вполне оправданно потратить некоторое время на создание программы и ее обкатку, проверку по правилам статистики.
Далее можно будет "проигрывать" все возможные ситуации и буквально через секунды получать "распределение случайной величины Z" в любом виде (кроме, разумеется, формульного).
Итак, надо уметь программировать операции, дающие случайную величину с заранее оговоренным законом распределения. Большинство языков программирования высокого уровня имеют встроенные подпрограммы (процедуры или функции в языке Pascal), обеспечивающие генерацию случайной величины R, равномерно распределенной в диапазоне 0…1. Будем полагать, что в нашем распоряжении имеется такой "датчик случайных чисел".