Comments 12
Если да, то как они в целом обходятся?
Мне кажется у вас небольшая опечатка в формуле, в которой вы расписываете функцию распределения Стъюдента через гамма-функцию и гипергеометрическую функцию, там вместо $F{n}(t)$ должно быть $F{n}(x)$. Ну или я что-то недопонял.
Сразу бросаются в глаза штуки вроде Math.log(ser * Math.sqrt(2 * Math.PI))
. Math.sqrt(2 * Math.PI)
— это константа и её можно вынести из логарифма, заменив умножение сложением:
private static final double SQRT_2_PI = Math.sqrt(2 * Math.PI);
...
Math.log(ser) + SQRT_2_PI
Обычно от математического кода требуется высокая производительность, поэтому уж на такие тривиальные места стоит внимание обращать.
Ну а так, конечно, хотя у статьи есть познавательная ценность, не стоит изобретать велосипеды, когда есть библиотеки (gamma, hypergeometric, t-test).
Наконец, опасайтесь t-test'а. Это самый неправильно используемый статистический критерий в мире. Если вы не доказали нормальность данных, t-test может выдать полный шлак, не относящийся к делу.
1) По поводу вычисления константы — полностью согласен. Код сыроват и это не единственное узкое место.
2) «Профессиональные» библиотеки действительно хорошо выполнены, но иногда слишком наворочены для использования непрофессионалом (например, студентом, только начавшим программировать и уже изучающим статистику). Отсюда и пост.
3) Нормальность данных проверять надо обязательно, это бесспорно. У теста Стьюдента есть ещё ряд применений, я наприер, сего помощью проверяю значимость корреляции Пирспона.
При численной реализации этой формулы для больших значений n возникает проблема с множителем Г((n+1)/2)/ Г(n/2). Не смотря на то, что само отношение имеет достаточно небольшие значения, числитель и знаменатель по отдельности могут принимать значения, для которых не хватит разрядности типа с плавающей точкой. Для разрешения этой проблемы...
А разве не проще здесь использовать разность логарифмов от Гамма-функций?
Минуя бесконечность: t-тест своими руками