Тестирование статистического программного обеспечения

10

Какие методы / подходы полезны при тестировании статистического программного обеспечения? Мне особенно интересны программы, которые выполняют параметрическую оценку с максимальной вероятностью.

Сравнение результатов с результатами других программ или опубликованных источников не всегда возможно, так как большую часть времени, когда я пишу собственную программу, это происходит потому, что необходимые мне вычисления еще не реализованы в существующей системе.

Я не настаиваю на методах, которые могут гарантировать правильность. Я был бы счастлив с методами, которые могут поймать некоторую долю ошибок.

Джйотирмой Бхаттачарья
источник

Ответы:

8

Одним из полезных методов является тестирование в Монте-Карло. Если есть два алгоритма, которые делают одно и то же, реализуйте оба, передавайте им случайные данные и проверяйте, что (в пределах небольшого допуска для числового размытия) они дают одинаковый ответ. Я делал это несколько раз раньше:

  • Я написал эффективную, но сложную для реализации реализацию Тау Б. Кендалла. Чтобы проверить это, я написал очень простую реализацию из 50 строк, работающую на . O ( N 2 )O(N log N)O(N2)

  • Я написал код для регрессии гребня. Лучший алгоритм для этого зависит от того, находитесь ли вы в случае или , поэтому мне все равно понадобилось два алгоритма. p > nn>pp>n

В обоих этих случаях я реализовывал относительно известные методы на языке программирования D (для которых не было никакой реализации), поэтому я также проверил несколько результатов по отношению к R. Тем не менее, тестирование в Монте-Карло выявило ошибки, которые я никогда бы не обнаружил, иначе ,

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

Изменить: Третий метод заключается в подаче данных алгоритма (синтетических или реальных), где вы хотя бы приблизительно знаете, каков правильный ответ, даже если вы не знаете точно, и проверяете, является ли ответ обоснованным. Например, вы можете не знать точно, каковы оценки ваших параметров, но вы можете знать, какие из них должны быть «большими», а какие - «маленькими».

dsimcha
источник
5

Не уверен, что это действительно ответ на ваш вопрос, но он, по крайней мере, косвенно связан.

Я поддерживаю пакет статистики в Maple . Интересный пример сложного для тестирования кода - генерация случайных выборок в соответствии с различными распределениями; легко проверить, что ошибки не генерируются, но сложнее определить, достаточно ли хорошо сгенерированные образцы соответствуют запрошенному распределению. Поскольку Maple имеет как символические, так и числовые функции, вы можете использовать некоторые из символьных функций для проверки генерации (чисто числовой) выборки:

  1. Мы внедрили несколько типов статистических проверок гипотез, одним из которых является критерий подходящей модели хи-квадрат - критерий хи-квадрат числа выборок в бинах, определенных по обратному CDF заданного распределения вероятностей. Так, например, чтобы проверить генерацию образца распределения Коши, я запускаю что-то вроде

    with(Statistics):
    infolevel[Statistics] := 1:
    distribution := CauchyDistribution(2, 3):
    sample := Sample(distribution, 10^6):
    ChiSquareSuitableModelTest(sample, distribution, 'bins' = 100, 'level' = 0.001);
    

    Поскольку я могу генерировать настолько большие сэмплы, насколько мне нравится, я могу сделать довольно маленьким.α

  2. Для распределений с конечными моментами я вычисляю, с одной стороны, количество выборочных моментов, а с другой стороны, я символически вычисляю соответствующие моменты распределения и их стандартную ошибку. Например, для бета-дистрибутива:

    with(Statistics):
    distribution := BetaDistribution(2, 3):
    distributionMoments := Moment~(distribution, [seq(1 .. 10)]);
    standardErrors := StandardError[10^6]~(Moment, distribution, [seq(1..10)]);
    evalf(distributionMoments /~ standardErrors);
    

    Это показывает уменьшающийся список чисел, последний из которых 255.1085766. Таким образом, даже для 10-го момента значение момента более чем в 250 раз превышает значение стандартной ошибки момента выборки для выборки размером . Это означает, что я могу реализовать тест, который выполняется более или менее следующим образом:106

    with(Statistics):
    sample := Sample(BetaDistribution(2, 3), 10^6):
    sampleMoments := map2(Moment, sample, [seq(1 .. 10)]);
    distributionMoments := [2/5, 1/5, 4/35, 1/14, 1/21, 1/30, 4/165, 1/55, 2/143, 1/91];
    standardErrors := 
      [1/5000, 1/70000*154^(1/2), 1/210000*894^(1/2), 1/770000*7755^(1/2), 
       1/54600*26^(1/2), 1/210000*266^(1/2), 7/5610000*2771^(1/2), 
       1/1567500*7809^(1/2), 3/5005000*6685^(1/2), 1/9209200*157366^(1/2)];
    deviations := abs~(sampleMoments - distributionMoments) /~ standardErrors;
    

    Числа в distributionMomentsи standardErrorsприходят с первого запуска выше. Теперь, если генерация выборки правильная, числа в отклонениях должны быть относительно небольшими. Я предполагаю, что они приблизительно нормально распределены (что на самом деле не так, но это достаточно близко - вспомните, что это масштабированные версии моментов сэмплов, а не сами сэмплы), и, таким образом, я могу, например, отметить случай, когда отклонение больше 4 - соответствует моменту выборки, который отклоняется более чем в четыре раза от стандартной ошибки от момента распределения. Это вряд ли произойдет случайным образом, если выборка будет хорошей. С другой стороны, если первые 10 моментов выборки соответствуют моментам распределения с точностью до половины процента, мы имеем достаточно хорошее приближение распределения.

Ключ к тому, почему оба эти метода работают, заключается в том, что пример кода генерации и символьный код почти полностью не пересекаются. Если между ними будет совпадение, то ошибка в этом перекрытии может проявиться как при генерации выборки, так и при ее проверке и, таким образом, не будет обнаружена.

Эрик П.
источник
Спасибо за Ваш ответ. Я «принимаю» другой ответ, так как мне позволено выбрать только один, и это, казалось, немного лучше соответствует моей нынешней ситуации. Но ваш ответ тоже был очень полезен.
Джотирмой Бхаттачарья
2

У Брюса МакКаллоу была небольшая индустрия оценки статистического программного обеспечения (в самом широком смысле; он также тестировал Microsoft Excel. И нашел его нужным). Две статьи, которые иллюстрируют часть его подхода, здесь и здесь.

Стефан Коласса
источник
2

Президент StataCorp Уильям Гулд подробно рассказывает в этой статье в Stata Journal. 1 Это очень интересная статья о контроле качества статистического программного обеспечения.

pmgjones
источник