Как выполнить тест с использованием R, чтобы проверить, соответствуют ли данные нормальному распределению

45

У меня есть набор данных со следующей структурой:

a word | number of occurrence of a word in a document | a document id 

Как я могу выполнить тест для нормального распределения в R? Возможно, это простой вопрос, но я новичок в R.

SKARAB
источник
5
@Skarab Может быть, я полностью отключен, но разве вы не ожидаете, что частота любого слова будет обратно пропорциональна его рангу в таблице частот слов, согласно закону Ципфа ( j.mp/9er2lv )? В этом случае проверьте zipfRпакет.
ЧЛ
1
Я согласен с @chl - было бы незначительным чудом, если бы ваши данные были нормально распределены. Возможно, стоит еще вопрос о том, что вы хотите сделать с данными. Не изобретай велосипед!
csgillespie
3
Как ваши данные могут быть распределены в соответствии с моделью, которая дает ненулевую вероятность возникновения негатива?
user603
1
Какова причина для проведения этого теста?
whuber
Я хочу оценить, является ли огромный результат извлечения информации правильным. Я хочу проверить, соответствует ли распределение сущностей, обнаруженных в тексте, моим ожиданиям (я знаю домен и текстовый корпус).
Скарабей

Ответы:

48

Если я правильно понимаю ваш вопрос, то для проверки соответствия слов в наборе документов нормальному распределению вы можете просто использовать тест Шапиро-Вилка и несколько qqplots. Например,

## Generate two data sets
## First Normal, second from a t-distribution
words1 = rnorm(100); words2 = rt(100, df=3)

## Have a look at the densities
plot(density(words1));plot(density(words2))

## Perform the test
shapiro.test(words1); shapiro.test(words2)

## Plot using a qqplot
qqnorm(words1);qqline(words1, col = 2)
qqnorm(words2);qqline(words2, col = 2)

Команды qqplot дают: альтернативный текст

Вы можете видеть, что второй набор данных явно не является нормальным для тяжелых хвостов ( Подробнее ).

В тесте нормальности Shapiro-Walk значение p велико для первого набора данных (> .9), но очень мало для второго набора данных (<.01). Это приведет вас к отказу от нулевой гипотезы для второго.

csgillespie
источник
7
Почему это явно не нормально?
Герман
Я думаю, что нанесенные точки должны лежать на биссектрисе I-III квадрата настолько близко, насколько они рисуют нормальное распределение.
Кампа
В более общем смысле (имеется в виду! = 0), у них qqlineдолжен быть 1 уклон и перехват му .
Кампа
@HermanToothrot это не нормально, если смотреть на второй график, так как существует очень большая расходимость в значениях хвоста. График QQ представляет собой график теоретического квантиля (если он был нормальным) по отношению к количеству выборки (из данных). Если данные выборки нормальные, мы ожидаем, что наблюдения будут близки к линии, как и для первого графика. Также обратите внимание на очень разницу шкалы на оси Y для этих графиков.
Шелдон
15

Предполагая, что ваш набор данных вызван wordsи имеет countsстолбец, вы можете построить гистограмму для визуализации распределения:

hist(words$counts, 100, col="black")

где 100 - количество бинов

Вы также можете сделать нормальный график QQ, используя

qqnorm(words$counts)

Наконец, вы также можете использовать тест Шапиро-Уилка для нормальности

shapiro.test(word$counts)

Хотя, посмотрите на это обсуждение: Тестирование нормальности: «По существу бесполезно?»

Nico
источник
14

Никакой тест не покажет вам, что ваши данные имеют нормальное распределение - он сможет показать вас только тогда, когда данные достаточно несовместимы с нормой, что вы отклоните нуль.

Но в любом случае значения не являются нормальными, они являются положительными целыми числами - какова вероятность того, что наблюдение из нормального распределения примет значение, которое не является целым числом? (... это событие с вероятностью 1).

Зачем вам проверять нормальность в этом случае? Это явно не соответствует действительности.

[В некоторых случаях это не обязательно означает, что вы можете сказать, что ваши данные не являются нормальными. Реальные данные никогда (или почти никогда) не будут взяты из нормального распределения.]

Если вам действительно нужно сделать тест, то тест Шапиро-Уилка ( ?shapiro.test) является хорошим общим тестом нормальности, который широко используется.

Glen_b
источник
9

Более формальным взглядом на нормальность является проверка того, значительно ли эксцесс и перекос значительно отличаются от нуля.

Для этого нам нужно получить:

kurtosis.test <- function (x) {
m4 <- sum((x-mean(x))^4)/length(x)
s4 <- var(x)^2
kurt <- (m4/s4) - 3
sek <- sqrt(24/length(x))
totest <- kurt/sek
pvalue <- pt(totest,(length(x)-1))
pvalue 
}

для куртоза и:

skew.test <- function (x) {
m3 <- sum((x-mean(x))^3)/length(x)
s3 <- sqrt(var(x))^3
skew <- m3/s3
ses <- sqrt(6/length(x))
totest <- skew/ses
pt(totest,(length(x)-1))
pval <- pt(totest,(length(x)-1))
pval
}

для асимметрии.

Оба эти теста являются односторонними, поэтому вам нужно умножить значение p на 2, чтобы стать двусторонними. Если ваше значение p станет больше единицы, вам нужно использовать 1-kurtosis.test () вместо kurtosis.test.

Если у вас есть какие-либо другие вопросы, вы можете написать мне на j.bredman@gmail.com

Джорен Бредман
источник
Каковы различия, из двух упомянутых выше функций, касающиеся kurtosis()и skewness()функций из моментов пакета? Результаты с использованием rnorm()образцов разные.
Никос Александрис
5

В дополнение к тесту Shapiro-Wilk пакета stats, самый тестовый пакет (доступный на CRAN) предоставляет другие тесты нормальности.

Laurent
источник
5

Используя nortestпакет R, эти тесты могут быть проведены:

  • Выполнить тест нормальности Андерсона-Дарлинга

    ad.test(data1)
  • Выполните тест Крамера-фон Мизеса на нормальность

    cvm.test(data1)
  • Выполните тест Хи-квадрат Пирсона на нормальность

    pearson.test(data1)
  • Выполните тест Шапиро-Франсии на нормальность

    sf.test(data1)

Многие другие тесты могут быть выполнены с помощью normtestпакета. Смотрите описание на https://cran.r-project.org/web/packages/normtest/normtest.pdf

Доктор Ниша Арора
источник
@Ник; Я упомянул эти тесты из пакета «nortest» , найденного здесь: ( cran.r-project.org/web/packages/nortest/nortest.pdf ). Другой полезный пакет - это «normtest», как упомянуто выше.
Доктор Ниша Арора
Хорошо спасибо. В своем невежестве я предположил, что одно имя было опечаткой.
Ник Кокс