А теперь давайте посмотрим как поправку на множественное тестирование можно сделать в R. Представьте себе такую ситуацию, что допустим вас очень интересует, как пользователи будут реагировать на сайт с разным дизайном, и вы проводите эксперимент. В какой-то день вы группе пользователей показываете сайт в одном дизайне, а другие пользователи получают сайт совсем с другим дизайном, и вы измеряете их поведение по каким-то там 12 характеристикам. В результате у вас есть 12 тестов, которые показывают, отличается ли поведение пользователей, которым предъявили сайты с разным дизайном. На первый взгляд кажется, что среди этих двенадцати значений p, которое записано у нас в векторе p_vals, довольно много значимых результатов. Вот смотрите, у нас получается целых шесть значимых результатов. Но вы вспоминаете о том, что плохо делать множественные тесты и не делать никакой поправки, и хотите сделать коррекцию на множественное тестирование, совершенно справедливо. Давайте посмотрим как это можно сделать в R. Мы будем пользоваться функцией p.adjust. Этой функции нужно указать две вещи, у нее есть параметр p, куда мы должны положить числовой вектор со значениями p, не обязательно отсортированные, это просто может быть вывод каких нибудь ваших тестов, и у нее есть второй аргумент, важный, method, куда мы кладем название того метода, каким хотим провести коррекцию. Методов функция p.adjust понимает много, и вы можете в файле справки посмотреть точно как нужно указывать их названия. Вообще говоря, коррекцию на множественное тестирование нужно проводить заранее выбранным методом, но сейчас мы с вами, просто для того, чтобы посмотреть к каким результатам приводят разные варианты коррекции, используем несколько. Не делаете пожалуйста так в жизни, используйте заранее выбранный метод. Значит, до коррекции у нас было значимых результатов всего 6. Как мы это узнали? Посмотрели на логический вектор, который сравнивает с критическим уровнем значимости значения p наших тестов и просуммировали значение этого логического вектора. Оказалось, что 6 значений p меньше 5%. Если мы делаем поправку по методу Холма-Банферрони, нам в аргументе method функции p.adjust можно написать holm, и после этой коррекции наши p.value будут совсем другими. Откорректированные значение p вы можете посмотреть самостоятельно, если напечатаете в консоли название этого вектора, а нас интересует на самом деле, сколько осталось значимыми из всех наших результатов. Мы делаем аналогичную манипуляцию при помощи логического вектора, и выясняем, что всего в двух тестах мы получили теперь значимые результаты с учетом поправки Холма-Банферрони. Поправка Холма-Банферрони, это разумный компромисс по жесткости, я рекомендую ее использовать, если вам нужна Family-wise error rate correction. Но давайте для примера, посмотрим на то, как выглядят другие варианты коррекции. Самый жесткий метод, это метод Банферрони. Чтобы им воспользоваться, нужно так и сказать, bonferroni. Помните, что там 2 r, а все остальные буквы по одной, и метод Банферрони настолько жесткий, что в нашем ряду из значений p.value, он оставляет только один значимый результат. Процедура Бенджамини-Хохберга, это процедура из другого семейства. Она будет фиксировать не вероятность ошибки первого рода для всех сравнений, а вероятность ошибки первого рода только для значимых сравнений. И это процедура довольно мягкая, в R она делается при помощи той же функции p.adjust, на аргумент method, это BH, или есть синоним, FDR можно там написать. После процедуры FDR коррекции, у нас значимыми остаются только три сравнения. Еще раз, поскольку это важно, предупрежу вас, что не следует делать коррекцию разными способами, выбирать тот который вам нравится. Попробуйте заранее взвесить насколько вам страшны ошибки первого рода, насколько сильно вы боитесь ошибок второго рода, и выберите подходящую процедуру коррекции. Но не пытайтесь торговаться с судьбой. Это не следует делать.