Изменения

Перейти к: навигация, поиск
м
Сравнительная таблица реализации критериев в пакетах
На практике мы встречаемся с двумя вариантами задач по проверке принадлежности распределения нормальному закону: для одномерного и многомерного распределения.
{{mbox |type = notice |text = '''Перед использованием функций из пакетов их необходимо предварительно установить и загрузить:''' |textPkg-small = <syntaxhighlight lang="rsplus">> install.packages(pkgs = "pkgname")> library(package = "pkgname")</syntaxhighlight>req-notice}}
== Одномерное нормальное распределение ==
В качестве Нулевой гипотезой (<math>H_0</math> ) для всех нижеприведённых критериев является предположение, что «случайная величина <math>X</math> распределена нормально».
Для демонстрации работы функций, реализующий реализующих различные критерий критерии проверки принадлежности распределения нормальному закону сгенерируем вектор случайных чисел, имеющих стандартное нормальное распределение:
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki>> x <- rnorm(n = 1001000)</syntaxhighlightnowiki>}}
=== Статистические критерии ===
==== Пакет <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> ====
В данный пакет входят следующие функции:==== Сравнительная таблица реализации критериев в пакетах ====
* {| 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>adshapiro.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>cvmad.test</code> || - критерий || <code>adTest</code> || - || -|-| style="text-align: left" | Критерий Крамера - фон Мизеса* || - || <code>lilliecvm.test</code> || - || <code>cvmTest</code> || - || - критерий Лиллиефорса* |-| style="text-align: left" | Критерий Лиллиефорса || - || <code>pearsonlillie.test</code> || - критерий || <code>lillieTest</code> || - || -|-| style="text-align: left" | Критерий <math>\chi^2</math> Пирсона* || - || <code>sfpearson.test</code> || - критерий || <code>pchiTest</code> || - || -|-| style="text-align: left" | Критерий Шапиро - Франчия|| - || <code>sf.test</code> || - || <code>sfTest</code> || - || -|-| style="text-align: left" | Критерий Д'Агостино || - || - || <code>agostino.test</code> || <code>dagoTest</code> || - || -|-| style="text-align: left" | Критерий Бонетта – Сайера || - || - || <code>bonett.test</code> || - || - || -|-| style="text-align: left" | Критерий Жарка - Бера || - || - || <code>jarque.test</code> || <code>jarqueberaTest</code> || <code>jarque.bera.test</code> || <code>rjb.test</code>|}
Данные функции возвращают результат в виде S3-класса - <code>htest</code>. ==== Пакет <code>moments</code> ==== В данный пакет входят следующие функции: * <code>agostino.test</code> {{r- критерий Д'Агостино* <code>bonett.test</code> - критерий Бонетта – Сайера* <code>jarque.test</code> - критерий Жарка-Бера Данные функции package|fBasics}} содержит также возвращают результат в виде S3-класса - <code>htest</code>. ==== Пакет <code>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> - критерий Шапиро - Уилка
Пример вызова данной функции:
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki>> normalTest(x, method = "sw")
Title:
Description:
Fri Feb 14 19:59:59 2014 by user:
</syntaxhighlightnowikiПомимо функции <code>normalTest()</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> - критерий Шапиро - Франчия}}
Данные функции Пакет <code>lawstat</code> содержит также возвращают результат в виде S4-класса - функцию <code>fHTESTsj.test()</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>.
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki>> df DF <- data.frame(replicate(n = 10, rnorm(n = 100)))</syntaxhighlightnowiki>}}
Структуру Структура сгенерированной таблицы выглядит следующим образом:
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki> > str(dfDF)
'data.frame': 100 obs. of 10 variables:
$ X1 : num 01.051 1.5448 08 -0.4478 477 -1.079 0396 3.0492 0.1193 423 ... $ X2 : num -0.322 0602 2.275 29 -0.103 758 -1.941 615 -0.318 364 ... $ X3 : num 0.58 0559 -01.558 0117 0.609 -5242 0.949 4105 -0.275 3191 ... $ X4 : num -0.6429 -10965 0.6286 2006 0.9507 29 0.0203 7702 -0.1642 0182 ... $ X5 : num -0.403 7074 -1.6111 0.913 -3478 0.716 -2.92 -2504 0.945 0609 ... $ X6 : num -1.59621 -432 0.00725 535 -0.70304 -932 0.41532 0581 -1.59548 606 ... $ X7 : num -0.671 1.074 42407 -0.136 31827 -2.04648 -0.628 19856 0.986 00301 ... $ X8 : num 0.2176 -511 0.0859 192 0.6535 467 -01.2412 0308 2.4143 496 ... $ X9 : num -0.412 18508 0.51 14481 -0.11 2828 -0.307 5464 0.647 0605 ... $ X10: num 01.436 -421 0.468 408 1.254 -0.399 956 -01.832 0.931 91 ...</syntaxhighlightnowiki>}}
Для решения поставленной задачи можно воспользоваться функцией <code>sapply()</code>. Но прежде, нам необходимо немного отформатировать формат вывода результатов нашей функции: нам нужно извлечь значения критерия и его уровень значимости, но т.к. результат функции <code>shapiro.test()</code> содержит также информацию, которая не подлежит включению в итоговую таблицу, например, информация об используемом методе (критерии) и уточнение характера альтернативной гипотезы.Вывод результатов тест Шапиро - Уилка выглядит следующим образом:
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki>> shapiro.test(x)
Shapiro-Wilk normality test
data: x
W = 0.98649903, p-value = 0.39776882</syntaxhighlightnowiki>}}
Структура результата применения функции <code>shapiro.test()</code> представлена ниже:
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki>> str(shapiro.test(x))
List of 4
$ statistic: Named num 0.98699
..- attr(*, "names")= chr "W"
$ p.value : num 0.398688
$ method : chr "Shapiro-Wilk normality test"
$ data.name: chr "x"
- attr(*, "class")= chr "htest"
</syntaxhighlightnowiki>}}
Как видим, помимо значений критерия и уровня значимости здесь содержится информация о применяемом методе. Мы можем отфильтровать вывод следующим образом:
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki>> normTest <- function (x) {
+ res <- shapiro.test(x)
+ return(c(res$statistic, p.value = res$p.value))
+ }
</syntaxhighlightnowiki>}}
Результат теперь будет выглядеть следующим образом:
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki>> normTest(x) W p.value 0.9863867 9903 0.39771726882</syntaxhighlightnowiki>}}
Теперь можно использовать данную функцию при обработке столбцов нашей таблицы.
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki>> t(sapply(dfDF, normTest)) W p.valueX1 0.9860072 9831 0.374389222301X2 0.9793961 9936 0.119275459213X3 0.9961734 9800 0.994706341333X4 0.9836052 9829 0.250892072219X5 0.9794991 9874 0.121504264625X6 0.9895875 9862 0.631319353874X7 0.9863415 9839 0.394883812617X8 0.9849433 9833 0.314616762360X9 0.9899328 9915 0.659163297834X10 0.9757493 9808 0.061763141531</syntaxhighlightnowiki>}}
Того же результата можно добиться и с помощью функции <code>lapply()</code><ref>По результатам сравнения производительности, данный вариант оказался чуть быстрее предыдущего.</ref>:
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki>> do.call(rbind, lapply(dfDF, normTest)) W p.valueX1 0.9860072 9831 0.374389222301X2 0.9793961 9936 0.119275459213X3 0.9961734 9800 0.994706341333X4 0.9836052 9829 0.250892072219X5 0.9794991 9874 0.121504264625X6 0.9895875 9862 0.631319353874X7 0.9863415 9839 0.394883812617X8 0.9849433 9833 0.314616762360X9 0.9899328 9915 0.659163297834X10 0.9757493 9808 0.061763141531</syntaxhighlightnowiki>}} ===== Применение функций к нескольким по группам ===== Добавим к нашей таблице группы испытуемых: {{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.valueA 0.9522 0.13281B 0.9607 0.28697C 0.9410 0.07256</nowiki>}}
=== Графические методы ===
Многие исследователи также используют графические методы для определения степени отклонения распределения от нормального закона. В R реализована возможность построения Q-Q и P-P графиков, гистограмм и кривых распределения плотности вероятностейплотностей вероятности.
==== Пакет <code>stats</code> Гистограмма ====
Построение Q–Q plot Гистограмма представляет собой графическое изображение зависимости частоты попадания элементов выборки от соответствующего интервала группировки. Построить гистограмму в R можно с помощью пакета <code>stats</code> выглядит следующим образомследующей команды:
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki> qqnorm(x)> qqlinehist(x)</syntaxhighlightnowiki>[[Файл:Stats-qqnorm.svg|400px|центр]]}}
==== Пакет <code>QTLRel</code> ====[[Файл:Graphics-hist.svg|400px|центр]]
Построение Q–Q plot с помощью пакета <code>QTLRel</code> выглядит следующим образомНа гистограмме изображены абсолютные частоты. Также можно построить гистограмму, отражающую плотности вероятностей:
<syntaxhighlight lang{{r-code|code="rsplus"><nowiki> qqPlot> hist(x, x freq = "norm"FALSE)</syntaxhighlightnowiki>[[Файл:Qtlrel-qqplot.svg|400px|центр]]}}
==== Пакет <code>car</code> ====[[Файл:Graphics-hist-probs.svg|400px|центр]]
Альтернативный вариант реализован в функции <code>qqPlot()</code> из пакета <code>car</code>:==== График плотностей вероятности ====
<syntaxhighlight lang="rsplus">> qqPlot(x, distribution = "norm")=== Пакет <code>stats</syntaxhighlightcode>[[Файл:Car-qqplot.svg|400px|центр]]=====
{{r-code|code==== Пакет <codenowiki>e1071> plot(density(x))</codenowiki> ====}}
Построение P-P plot можно осуществить с помощью функции <code>probplot</code> из пакета <code>e1071</code>[[Файл:Stats-density.svg|400px|центр]]
<syntaxhighlight lang="rsplus">> probplot(x, qdist = qnorm)=== Пакет <code>car</syntaxhighlightcode>[[Файл:E1071-probplot.svg|400px|центр]]=====
{{r-code|code==== Пакет <codenowiki>gamlss> densityPlot(x)</codenowiki> ====}}
Ещё один интересный способ графического анализа представлен функцией <code>histDist</code> из пакета <code>gamlss</code>[[Файл:Car-densityPlot.svg|400px|центр]]
==== Гистограммы с наложением графика плотностей вероятнотси ==== ===== Пакет <syntaxhighlight langcode>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 ="rsplusred") # Накладываем кривую плотностей вероятности>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")
Mu Coefficients:
[1] -0.22730462
Sigma Coefficients:
[1] 0.09813023
Degrees of Freedom for the fit: 2 Residual Deg. of Freedom 98 998 Global Deviance: 303.414 2884 AIC: 307.414 2888 SBC: 312.624 2898</syntaxhighlightnowiki>}} [[Файл:gamlssGamlss-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-qqPlot.svg|400px|центр]]
 
===== Пакет <code>e1071</code> =====
 
Построение Q-Q plot можно осуществить с помощью функции <code>probplot</code> из пакета <code>e1071</code>:
 
{{r-code|code=
<nowiki>> probplot(x, qdist = qnorm)</nowiki>
}}
 
[[Файл:E1071-probplot.svg|400px|центр]]
== Многомерное нормальное распределение ==
 
Перед началом обзора функций, реализующий критерии проверки многомерной нормальности, сгенерируем массив данных. Сделать это можно при помощью следующих функций
* <code>mvrnorm</code> из пакета <code>MASS</code>
* <code>rmvnorm</code> из пакета <code>mvtnorm</code>
* <code>rmnorm</code> из пакета <code>mnormt</code>
 
Вот пример кода, генерирующего массив данных, имеющих многомерное нормальное распределение:
 
{{r-code|code=
> means <- c(0, 0, 0, 0) # средние для переменных
> sigmas <- diag(length(means)) # ковариационная матрица
> mx <- rmvnorm(100, mean = means, sigma = sigmas)
}}
 
Пакет {{r-package|mvnormtest}} реализует модификацию критерия Шапиро - Уилка для многомерных данных - функция <code>mshapiro.test()</code><ref>В качестве аргумента необходимо передать транспонированную матрицу: <code>mshapiro.test(t(mx))</code>.</ref>.
 
Пакет {{r-package|ICS}} предлагает реализацию критериев эксцесса и асимметрии для многомерных данных: <code>mvnorm.kur.test()</code>, <code>mvnorm.skew.test()</code>.
 
Пакет {{r-package|energy}} реализует E-статистики для сравнения распределений. Критерия для проверки гипотезы о соответствия распределения многомерной переменной многомерному нормальному распределению предлагается функция <code>mvnorm.etest()</code><ref>Для вычисления уровня значимости критерия используется метод бутстрепа (bootstrap). Число итераций для бутстрепа можно задать с помощью аргумента <code>R</code>.</ref>.
 
== Ссылки ==
 
* 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 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 code from 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 <wlwhui@uwaterloo.ca>; Vyacheslav Lyubchich <vlyubchich@uwaterloo.ca>; Weiwen Miao <miao@macalester.edu>; Kimihiro Noguchi <kinoguchi@ucdavis.edu> (2013). 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/r346.
*: http://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
== Примечания ==

Навигация