Изменения

Перейти к: навигация, поиск
м
Нет описания правки
Для демонстрации работы функций, реализующий различные критерий проверки принадлежности распределения нормальному закону сгенерируем вектор случайных чисел, имеющих стандартное нормальное распределение:
<syntaxhighlight lang{{r-code|code="rsplus">
> x <- rnorm(n = 100)
</syntaxhighlight>}}
=== Статистические критерии ===
Пример вызова данной функции:
<syntaxhighlight lang{{r-code|code="rsplus">
> normalTest(x, method = "sw")
Description:
Fri Feb 14 19:59:59 2014 by user:
</syntaxhighlight>}}
Помимо функции <code>normalTest()</code> данный пакет включает в себя следующие функции:
С помощью <code>apply</code>-функций можно последовательно применить функцию к вектору, списку или массиву. Прежде чем всего нам необходимо сформировать таблицу данных. С помощью функции <code>replicate()</code> сгенерируем 10 переменных, имеющих стандартное нормальное распределение, которые объединяются в класс <code>data.frame</code>.
<syntaxhighlight lang{{r-code|code="rsplus">
> DF <- data.frame(replicate(n = 10, rnorm(n = 100)))
</syntaxhighlight>}}
Структура сгенерированной таблицы выглядит следующим образом:
<syntaxhighlight lang{{r-code|code="rsplus">
> str(DF)
'data.frame': 100 obs. of 10 variables:
$ X9 : num -0.8508 0.4481 -0.2828 -0.5464 0.0605 ...
$ X10: num 1.421 0.408 1.254 -0.956 -1.91 ...
</syntaxhighlight>}}
Для решения поставленной задачи можно воспользоваться функцией <code>sapply()</code>. Но прежде, нам необходимо немного отформатировать формат вывода результатов нашей функции: нам нужно извлечь значения критерия и его уровень значимости, т.к. результат функции <code>shapiro.test()</code> содержит также информацию, которая не подлежит включению в таблицу.
<syntaxhighlight lang{{r-code|code="rsplus">
> shapiro.test(x)
data: x
W = 0.9903, p-value = 0.6882
</syntaxhighlight>}}
Структура результата применения функции <code>shapiro.test()</code> представлена ниже:
<syntaxhighlight lang{{r-code|code="rsplus">
> str(shapiro.test(x))
List of 4
$ data.name: chr "x"
- attr(*, "class")= chr "htest"
</syntaxhighlight>}}
Как видим, помимо значений критерия и уровня значимости здесь содержится информация о применяемом методе. Мы можем отфильтровать вывод следующим образом:
<syntaxhighlight lang{{r-code|code="rsplus">
> normTest <- function (x) {
+ res <- shapiro.test(x)
+ return(c(res$statistic, p.value = res$p.value))
+ }
</syntaxhighlight>}}
Результат теперь будет выглядеть следующим образом:
<syntaxhighlight lang{{r-code|code="rsplus">
> normTest(x)
W p.value
0.9903 0.6882
</syntaxhighlight>}}
Теперь можно использовать данную функцию при обработке столбцов нашей таблицы.
<syntaxhighlight lang{{r-code|code="rsplus">
> t(sapply(DF, normTest))
W p.value
X9 0.9915 0.7834
X10 0.9808 0.1531
</syntaxhighlight>}}
Того же результата можно добиться и с помощью функции <code>lapply()</code><ref>По результатам сравнения производительности, данный вариант оказался чуть быстрее предыдущего.</ref>:
<syntaxhighlight lang{{r-code|code="rsplus">
> do.call(rbind, lapply(DF, normTest))
W p.value
X9 0.9915 0.7834
X10 0.9808 0.1531
</syntaxhighlight>}}
===== Применение функций к нескольким по группам =====
Добавим к нашей таблице группы испытуемых:
<syntaxhighlight lang{{r-code|code="rsplus">
> DF$GRP <- factor(sample(LETTERS[1:3], size = 100, replace = TRUE))
</syntaxhighlight>}}
Состав групп получился следующим:
<syntaxhighlight lang{{r-code|code="rsplus">
> table(DF$GRP)
A B C
38 25 37
</syntaxhighlight>}}
Рассчитаем значения критерия Шапиро - Уилка для первого столбца для каждоый группы испытуемых:
<syntaxhighlight lang{{r-code|code="rsplus">
> do.call(rbind, tapply(DF$X1, DF$GRP, normTest))
W p.value
B 0.9607 0.28697
C 0.9410 0.07256
</syntaxhighlight>}}
=== Графические методы ===
Построение Q–Q plot с помощью пакета <code>stats</code> выглядит следующим образом:
<syntaxhighlight lang{{r-code|code="rsplus">
> qqnorm(x)
> qqline(x)
</syntaxhighlight>}} 
[[Файл:Stats-qqnorm.svg|400px|центр]]
Построение Q–Q plot с помощью пакета <code>QTLRel</code> выглядит следующим образом:
<syntaxhighlight lang{{r-code|code="rsplus">
> qqPlot(x, x = "norm")
</syntaxhighlight>}} 
[[Файл:Qtlrel-qqplot.svg|400px|центр]]
Альтернативный вариант реализован в функции <code>qqPlot()</code> из пакета <code>car</code>:
<syntaxhighlight lang{{r-code|code="rsplus">
> qqPlot(x, distribution = "norm")
</syntaxhighlight>}} 
[[Файл:Car-qqplot.svg|400px|центр]]
Построение P-P plot можно осуществить с помощью функции <code>probplot</code> из пакета <code>e1071</code>:
<syntaxhighlight lang{{r-code|code="rsplus">
> probplot(x, qdist = qnorm)
</syntaxhighlight>}} 
[[Файл:E1071-probplot.svg|400px|центр]]
Ещё один интересный способ графического анализа представлен функцией <code>histDist</code> из пакета <code>gamlss</code>:
<syntaxhighlight lang{{r-code|code="rsplus">
> histDist(x, family = "NO", density = TRUE)
AIC: 307.414
SBC: 312.624
</syntaxhighlight>}} 
[[Файл:gamlss-histdist.svg|400px|центр]]

Навигация