3482
правки
Изменения
м
Нет описания правки
{{CC-BY-4.0|author=автором Артём Клевцов</nowiki>}}
Предположение о принадлежности случайной величины нормальному закону распределения лежит в основе многих статистических методов и критериев. В ряде случаев соблюдение данного требования является критичным для применения того или иного метода.
На практике мы встречаемся с двумя вариантами задач по проверке принадлежности распределения нормальному закону: для одномерного и многомерного распределения.
{{Pkg-req-notice</nowiki>}}
== Одномерное нормальное распределение ==
Для демонстрации работы функций, реализующий различные критерий проверки принадлежности распределения нормальному закону сгенерируем вектор случайных чисел, имеющих стандартное нормальное распределение:
{{r-code|code=<nowiki>> x <- rnorm(n = 100)
</nowiki>
}}
Пример вызова данной функции:
{{r-code|code=<nowiki>> normalTest(x, method = "sw")
Title:
С помощью <code>apply</code>-функций можно последовательно применить функцию к вектору, списку или массиву. Прежде чем всего нам необходимо сформировать таблицу данных. С помощью функции <code>replicate()</code> сгенерируем 10 переменных, имеющих стандартное нормальное распределение, которые объединяются в класс <code>data.frame</code>.
{{r-code|code=<nowiki>> DF <- data.frame(replicate(n = 10, rnorm(n = 100)))
</nowiki>
}}
Структура сгенерированной таблицы выглядит следующим образом:
{{r-code|code=<nowiki>> str(DF)
'data.frame': 100 obs. of 10 variables:
$ X1 : num 1.051 1.08 -0.477 -1.396 3.423 ...
Для решения поставленной задачи можно воспользоваться функцией <code>sapply()</code>. Но прежде, нам необходимо немного отформатировать формат вывода результатов нашей функции: нам нужно извлечь значения критерия и его уровень значимости, т.к. результат функции <code>shapiro.test()</code> содержит также информацию, которая не подлежит включению в таблицу.
{{r-code|code=<nowiki>> shapiro.test(x)
Shapiro-Wilk normality test
Структура результата применения функции <code>shapiro.test()</code> представлена ниже:
{{r-code|code=<nowiki>> str(shapiro.test(x))
List of 4
$ statistic: Named num 0.99
Как видим, помимо значений критерия и уровня значимости здесь содержится информация о применяемом методе. Мы можем отфильтровать вывод следующим образом:
{{r-code|code=<nowiki>> normTest <- function (x) {
+ res <- shapiro.test(x)
+ return(c(res$statistic, p.value = res$p.value))
Результат теперь будет выглядеть следующим образом:
{{r-code|code=<nowiki>> normTest(x)
W p.value
0.9903 0.6882
Теперь можно использовать данную функцию при обработке столбцов нашей таблицы.
{{r-code|code=<nowiki>> t(sapply(DF, normTest))
W p.value
X1 0.9831 0.2301
Того же результата можно добиться и с помощью функции <code>lapply()</code><ref>По результатам сравнения производительности, данный вариант оказался чуть быстрее предыдущего.</ref>:
{{r-code|code=<nowiki>> do.call(rbind, lapply(DF, normTest))
W p.value
X1 0.9831 0.2301
Добавим к нашей таблице группы испытуемых:
{{r-code|code=<nowiki>> DF$GRP <- factor(sample(LETTERS[1:3], size = 100, replace = TRUE))</nowiki>
}}
Состав групп получился следующим:
{{r-code|code=<nowiki>> table(DF$GRP)
A B C
38 25 37 </nowiki>
Рассчитаем значения критерия Шапиро - Уилка для первого столбца для каждоый группы испытуемых:
{{r-code|code=<nowiki>> do.call(rbind, tapply(DF$X1, DF$GRP, normTest))
W p.value
A 0.9522 0.13281
Построение Q–Q plot с помощью пакета <code>stats</code> выглядит следующим образом:
{{r-code|code=<nowiki>> qqnorm(x)
> qqline(x)</nowiki>
}}
Построение Q–Q plot с помощью пакета <code>QTLRel</code> выглядит следующим образом:
{{r-code|code=<nowiki>> qqPlot(x, x = "norm")</nowiki>
}}
Альтернативный вариант реализован в функции <code>qqPlot()</code> из пакета <code>car</code>:
{{r-code|code=<nowiki>> qqPlot(x, distribution = "norm")</nowiki>
}}
Построение P-P plot можно осуществить с помощью функции <code>probplot</code> из пакета <code>e1071</code>:
{{r-code|code=<nowiki>> probplot(x, qdist = qnorm)</nowiki>
}}
Ещё один интересный способ графического анализа представлен функцией <code>histDist</code> из пакета <code>gamlss</code>:
{{r-code|code=<nowiki>> histDist(x, family = "NO", density = TRUE)
Family: c("NO", "Normal")