Изменения

Перейти к: навигация, поиск
м
Сравнительная таблица реализации критериев в пакетах
{{CC-BY-4.0|author=автором Артём Клевцов</nowiki>}}
Предположение о принадлежности случайной величины нормальному закону распределения лежит в основе многих статистических методов и критериев. В ряде случаев соблюдение данного требования является критичным для применения того или иного метода.
На практике мы встречаемся с двумя вариантами задач по проверке принадлежности распределения нормальному закону: для одномерного и многомерного распределения.
{{Pkg-req-notice</nowiki>}}
== Одномерное нормальное распределение ==
В качестве Нулевой гипотезой (<math>H_0</math> ) для всех нижеприведённых критериев является предположение, что «случайная величина <math>X</math> распределена нормально».
Для демонстрации работы функций, реализующий реализующих различные критерий критерии проверки принадлежности распределения нормальному закону сгенерируем вектор случайных чисел, имеющих стандартное нормальное распределение:
{{r-code|code=<nowiki>> x <- rnorm(n = 1001000)
</nowiki>
}}
=== Статистические критерии ===
==== Пакет <code>stats</code> ==== В данном пакете реализованы две функции, которые позволяют осуществить проверку принадлежности R реализовано множество критериев проверки соответствия распределения нормальному закону. * <code>shapiro.test</code> - критерий Шапиро - Уилка* <code>ks.test</code> - критерий Колмогорова - Смирнова<ref>Для оценки нормальности вызов выглядит следующим образом:<code>ks.test(x, y = "pnorm")</code></ref> Данные функции возвращают результат в виде S3-класса - <code>htest</code>. ==== Пакет <code>nortest</code> ==== В данный пакет входят следующие функции: * <code>ad.test</code> - критерий Андерсона - Дарлинга* <code>cvm.test</code> - критерий Крамера - фон Мизеса* <code>lillie.test</code> - критерий Лиллиефорса* <code>pearson.test</code> - критерий <math>\chi^2</math> Пирсона* <code>sf.test</code> - критерий Шапиро - Франчия Данные функции возвращают результат в виде S3-класса - <code>htest</code>. ==== Пакет <code>moments</code> ====
В данный пакет входят следующие функции:==== Сравнительная таблица реализации критериев в пакетах ====
* {| class="wide wikitable sortable" style="text-align: center"! Критерии !! {{r-package|stats|core=true}} !! {{r-package|nortest}} !! {{r-package|moments}} !! {{r-package|fBasics}} !! {{r-package|tseries}} !! {{r-package|lawstat}}|-| style="text-align: left" | Критерий Шапиро - Уилка || <code>agostinoshapiro.test</code> || - критерий || - || <code>shapiroTest</code> || - || -|-| style="text-align: left" | Критерий Колмогорова - Смирнова || <code>ks.test</code><ref>Для оценки нормальности вызов выглядит следующим образом: <code>ks.test(x, y = "pnorm")</code>.</ref> || - || - || <code>ksnormTest</code> || - || -|-| style="text-align: left" | Критерий Андерсона - Дарлинга || - || <code>ad.test</code> || - || <code>adTest</code> || - || -|-| style="text-align: left" | Критерий Крамера - фон Мизеса || - || <code>cvm.test</code> || - || <code>cvmTest</code> || - || -|-| style="text-align: left" | Критерий Лиллиефорса || - || <code>lillie.test</code> || - || <code>lillieTest</code> || - || -|-| style="text-align: left" | Критерий <math>\chi^2</math> Пирсона || - || <code>pearson.test</code> || - || <code>pchiTest</code> || - || -|-| style="text-align: left" | Критерий Шапиро - Франчия || - || <code>sf.test</code> || - || <code>sfTest</code> || - || -|-| style="text-align: left" | Критерий Д'Агостино* || - || - || <code>bonettagostino.test</code> || <code>dagoTest</code> || - || -|-| style="text- критерий align: left" | Критерий Бонетта – Сайера* || - || - || <code>jarquebonett.test</code> || - критерий || - || -|-| style="text-align: left" | Критерий Жарка-Бера|| - || - || <code>jarque.test</code> || <code>jarqueberaTest</code> || <code>jarque.bera.test</code> || <code>rjb.test</code>|}
Данные функции также возвращают результат в виде S3Пакет {{r-класса - <code>htest</code>. ==== Пакет <code>package|fBasics</code> ==== В данном пакете не предлагается никакой оригинальной реализации критериев - код в основном заимствован из пакетов <code>stats</code>, <code>nortest</code>, <code>moments</code>. Данный пакет предлагает альтернативный вывод результатов в виде объекта S4-класса <code>fHTEST</code>, в том время как все предыдущие функции использовали S3-класс <code>htest</code>. Функция }} содержит также функцию <code>normalTest()</code> , которая является «обёрктой» для ряда функций из того же пакета - <code>fBasics</code>. Задать необходимый Необходимый критерий можно задать с помощью аргумента <code>method</code>. Доступны следующие критерии:
* <code>sw</code> - критерий Шапиро - Уилка
Пример вызова данной функции:
{{r-code|code=<nowiki>> normalTest(x, method = "sw")
Title:
}}
Помимо функции Пакет <code>normalTestlawstat</code> содержит также функцию <code>sj.test()</code> данный пакет включает в себя следующие функции:, которая является реализацией рабастного критерия нормальности, созданного на основа критерия Шапиро - Уилка.
* <code>shapiroTest</code> - критерий Шапиро - Уилка* <code>ksnormTest</code> - критерий Колмогорова - Смирнова<ref>Данная функция вызывает <code>ks.test(x, "pnorm")</code> для трёх альтернативных гипотез - двусторонней и двух односторонних.</ref>* <code>jarqueberaTest</code> - критерий Жарка-Бера* <code>dagoTest</code> - критерий Д'Агостино* <code>adTest</code> - критерий Андерсона - Дарлинга* <code>cvmTest</code> - критерий Крамера - фон Мизеса* <code>lillieTest</code> - критерий Лиллиефорса* <code>pchiTest</code> - критерий Пирсона* <code>sfTest</code> - критерий Шапиро - Франчия Данные функции также возвращают результат в виде S4-класса - <code>fHTEST</code>. ==== Пакет <code>TeachingDemos</code> ==== Данные пакет содержит только одну функцию, имеющую отношение к критериям проверки принадлежности распределения нормальному закону - <code>SnowsPenultimateNormalityTest()</code>, реализующую неописанный в литературе критерий. Данная функция возвращают результат в виде S3-класса - <code>htest</code>. ==== Пакет <code>tseries</code> ==== Данный пакет содержит возвращает только одну функциюуровень статистической значимости, имеющую отношение к критериям проверки принадлежности свидетельствующий об отклонения распределения нормальному закону - <code>jarqueот нормального закона.bera.test</code>, которая является реализацией критерия Жарка-Бера. Данная функция возвращают результат в виде S3-класса - <code>htest</code>. ==== Пакет <code>lawstat</code> ==== В данный пакет входят следующие функции: * <code>rjb.test</code> - критерий Жарка-Бера* <code>sj.test</code> - SJ-критерий
==== Маленькие хитрости ====
С помощью <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
=== Графические методы ===
Многие исследователи также используют графические методы для определения степени отклонения распределения от нормального закона. В R реализована возможность построения Q-Q и P-P графиков, гистограмм и кривых распределения плотности вероятностейплотностей вероятности.
==== Гистограмма ==== Гистограмма представляет собой графическое изображение зависимости частоты попадания элементов выборки от соответствующего интервала группировки. Построить гистограмму в R можно с помощью следующей команды: {{r-code|code=<nowiki>> hist(x)</nowiki>}} [[Файл:Graphics-hist.svg|400px|центр]] На гистограмме изображены абсолютные частоты. Также можно построить гистограмму, отражающую плотности вероятностей: {{r-code|code=<nowiki>> hist(x, freq = FALSE)</nowiki>}} [[Файл:Graphics-hist-probs.svg|400px|центр]] ==== График плотностей вероятности ==== ===== Пакет <code>stats</code> ===== {{r-code|code=<nowiki>> plot(density(x))</nowiki>}} [[Файл:Stats-density.svg|400px|центр]] ===== Пакет <code>car</code> ===== {{r-code|code=<nowiki>> densityPlot(x)</nowiki>}} [[Файл:Car-densityPlot.svg|400px|центр]] ==== Гистограммы с наложением графика плотностей вероятнотси ==== ===== Пакет <code>stats</code> ===== {{r-code|code=<nowiki>> hist(x, freq = FALSE)> lines(density(x))</nowiki>}} [[Файл:Stats-hist-density.svg|400px|центр]] Теперь наложим на наш график кривую плотностей вероятности для нормального распределения: {{r-code|code=<nowiki>> xfit <- seq(min(x), max(x), length = 100) # Координаты по оси X> yfit <- dnorm(xfit, mean = mean(x), sd = sd(x)) # Вычисление координат по оси Y> hist(x, freq = FALSE)> lines(density(x), col = "red") # Накладываем кривую плотностей вероятности> lines(xfit, yfit, col = "blue") # Накладываем «нормальную» кривую</nowiki>}} [[Файл:Stats-density-compare.svg|400px|центр]] ===== Пакет <code>gamlss</code> ===== Более простой способ сравнение графиков плотностей вероятности представлен в функции <code>histDist</code> из пакета <code>gamlss</code>: {{r-code|code=<nowiki>> histDist(x, family = "NO", density = TRUE) Family: c("NO", "Normal") Fitting method: "nlminb"  Call: gamlssML(y = y, family = "NO", formula = x)  Mu Coefficients:[1] -0.0462Sigma Coefficients:[1] 0.023  Degrees of Freedom for the fit: 2 Residual Deg. of Freedom 998 Global Deviance: 2884 AIC: 2888 SBC: 2898</nowiki>}} [[Файл:Gamlss-histdist.svg|400px|центр]] С помощью аргумента <code>family</code> можно задать семейство распределений для подгонки и сравнения<ref>Более подробную информацию о доступных семействах распределений можно получить с помощью команды <code>help("gamlss.family")</code>.</ref>. ==== Q-Q график ==== Q-Q график (Q - квантиль) — это график, на котором квантили из двух распределений расположены относительно друг друга. Чем ближе точки на графике к диагональной прямой, тем ближе распределение исследуемой переменной к нормальному закону. Построение квантильных графиков в R реализовано в нескольких пакетах. ===== Пакет <code>stats</code> =====
Построение Q–Q plot с помощью пакета <code>stats</code> выглядит следующим образом:
{{r-code|code=<nowiki>> qqnorm(x)
> qqline(x)</nowiki>
}}
[[Файл:Stats-qqnorm.svg|400px|центр]]
===== Пакет <code>QTLRel</code> =====
Построение Q–Q plot с помощью пакета <code>QTLRel</code> выглядит следующим образом:
{{r-code|code=<nowiki>> qqPlot(x, x = "norm")</nowiki>
}}
[[Файл:Qtlrel-qqplot.svg|400px|центр]]
===== Пакет <code>car</code> =====
Альтернативный вариант реализован в функции <code>qqPlot()</code> из пакета <code>car</code>:
{{r-code|code=<nowiki>> qqPlot(x, distribution = "norm")</nowiki>
}}
[[Файл:Car-qqplotqqPlot.svg|400px|центр]]
===== Пакет <code>e1071</code> =====
Построение PQ-P Q plot можно осуществить с помощью функции <code>probplot</code> из пакета <code>e1071</code>:
{{r-code|code=<nowiki>> probplot(x, qdist = qnorm)</nowiki>
}}
[[Файл:E1071-probplot.svg|400px|центр]]
==== Пакет <code>gamlss</code> ==Многомерное нормальное распределение ==
Ещё один интересный способ графического анализа представлен функцией Перед началом обзора функций, реализующий критерии проверки многомерной нормальности, сгенерируем массив данных. Сделать это можно при помощью следующих функций * <code>histDistmvrnorm</code> из пакета <code>gamlssMASS</code>* <code>rmvnorm</code> из пакета <code>mvtnorm</code>* <code>rmnorm</code> из пакета <code>mnormt</code>:
{{r-code|code=<nowiki>> histDist(xВот пример кода, family = "NO"генерирующего массив данных, density = TRUE)имеющих многомерное нормальное распределение:
Family: {{r-code|code=> means <- c("NO"0, 0, 0, 0) # средние для переменных> sigmas <- diag(length(means)) # ковариационная матрица> mx <- rmvnorm(100, mean = means, "Normal"sigma = sigmas) Fitting method: "nlminb" }}
CallПакет {{r-package|mvnormtest}} реализует модификацию критерия Шапиро - Уилка для многомерных данных - функция <code>mshapiro.test()</code><ref>В качестве аргумента необходимо передать транспонированную матрицу: gamlssML<code>mshapiro.test(y = y, family = "NO", formula = xt(mx)) </code>.</ref>.
Mu Coefficients:[1] Пакет {{r-0.2273Sigma Coefficientspackage|ICS}} предлагает реализацию критериев эксцесса и асимметрии для многомерных данных:[1] 0<code>mvnorm.kur.test()</code>, <code>mvnorm.skew.test()</code>.09813
Degrees of Freedom for the fit: 2 Residual DegПакет {{r-package|energy}} реализует E-статистики для сравнения распределений. of Freedom 98 Global Deviance: 303Критерия для проверки гипотезы о соответствия распределения многомерной переменной многомерному нормальному распределению предлагается функция <code>mvnorm.414 AIC: 307etest()</code><ref>Для вычисления уровня значимости критерия используется метод бутстрепа (bootstrap).414 SBC: 312Число итераций для бутстрепа можно задать с помощью аргумента <code>R</code>.624 </nowikiref>}}.
[[Файл:gamlss-histdist.svg|400px|центр]]== Ссылки ==
С помощью аргумента <* Juergen Gross and bug fixes by Uwe Ligges (2012). nortest: Tests for Normality. R package version 1.0-2.*: http://CRAN.R-project.org/package=nortest* Lukasz Komsta and Frederick Novomestky (2012). moments: Moments, cumulants, skewness, kurtosis and related tests. R package version 0.13.*: http://CRAN.R-project.org/package=moments* Diethelm Wuertz, Rmetrics core team members, uses code>family<builtin from the following R contributed packages: gmm from Pierre Chauss, gld from Robert King, gss from Chong Gu, nortest from Juergen Gross, HyperbolicDist from David Scott, sandwich from Thomas Lumley, Achim Zeileis, fortran/C codefrom Kersti Aas and akima from Albrecht Gebhardt (2013). fBasics: Rmetrics - Markets and Basic Statistics. R package version 3010.86.*: http://CRAN.R-project.org/package=fBasics* Adrian Trapletti and Kurt Hornik (2013). tseries: Time Series Analysis and Computational Finance. R package version 0.10-32.*: http://CRAN.R-project.org/package=tseries* Joseph L. Gastwirth; Yulia R. Gel <ygl@math.uwaterloo.ca> можно задать семейство распределений для подгонки и сравнения; W. L. Wallace Hui <refwlwhui@uwaterloo.ca>Более подробную информацию о доступных семействах распределений можно получить с помощью команды ; Vyacheslav Lyubchich <codevlyubchich@uwaterloo.ca>; Weiwen Miao <miao@macalester.edu>; Kimihiro Noguchi <kinoguchi@ucdavis.edu>help("gamlss2013).family"lawstat: An R package for biostatistics, public policy, and law. R package version 2.4.1.*: http://CRAN.R-project.org/package=lawstat* John Fox and Sanford Weisberg (2013)<. car: Companion to Applied Regression. R package version 2.0-19/code>r346.<*: http:/ref>/R-Forge.R-project.org/projects/car/* Mikis Stasinopoulos, Bob Rigby with contributions from Calliope Akantziliotou and Vlasios Voudouris (2014). gamlss: Generalised Additive Models for Location Scale and Shape. R package version 4.2-7.*: http://CRAN.R-project.org/package=gamlss* Riyan Cheng (2013). QTLRel: Tools for mapping of quantitative traits of genetically related individuals and calculating identity coefficients from a pedigree. R package version 0.2-14.*: http://CRAN.R-project.org/package= Многомерное нормальное распределение =QTLRel* David Meyer, Evgenia Dimitriadou, Kurt Hornik, Andreas Weingessel and Friedrich Leisch (2014). e1071: Misc Functions of the Department of Statistics (e1071), TU Wien. R package version 1.6-2.*: http://CRAN.R-project.org/package=e1071
== Примечания ==

Навигация