Як виконати тест за допомогою R, щоб побачити, чи слід за даними нормального розподілу


44

У мене є набір даних із такою структурою:

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

Як я можу виконати тест на нормальний розподіл у R? Можливо, це легке запитання, але я R новачок.


5
@Skarab Можливо, я повністю відсутній, але ви не очікували, що частота будь-якого слова буде обернено пропорційною його ранжу в таблиці частот слів, згідно із законом Зіпфа ( j.mp/9er2lv )? У цьому випадку перевірте zipfRпакет.
chl

1
Я погоджуюся з @chl - це було б незначним дивом, якби ваші дані нормально поширювались. Можливо, ще одне питання про те, що ви хочете зробити з даними, було б вартим. Не винаходити колесо!
csgillespie

3
Як можна розподілити ваші дані відповідно до моделі, яка дає ненульову ймовірність негативного виникнення?
user603

1
У чому причина цього тесту?
whuber

Я хочу підрахувати, чи правильний величезний результат вилучення інформації. Я хочу перевірити, чи відповідає розподіл об'єктів, знайдених у тексті, моїм очікуванням (я знаю домен та текстовий корпус).
Скараб

Відповіді:


47

Якщо я правильно розумію ваше запитання, то для перевірки того, чи трапляється слово в наборі документів, слід звичайне розповсюдження, ви можете просто використати тест shapiro-Wilk та деякі 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 дають: alt текст

Ви можете бачити, що другий набір даних явно не є нормальним за важких хвостів ( Детальніше ).

У тесті на нормальність Shapiro-Walk значення р є великим для першого набору даних (> .9), але дуже малим для другого набору даних (<.01). Це призведе до відмови від нульової гіпотези на секунду.


7
Чому явно це не нормально?
Зубний Герман

Я думаю, що нанесені точки повинні лежати на бісектрисі квадрата I-III якнайближче, оскільки вони малюють нормальний розподіл.
Кампа

У більш загальному плані (середній! = 0), то qqlineповинен мати 1 нахил і мю перехоплювати.
Кампа

@HermanToothrot це не нормально, якщо дивитися на другий сюжет, оскільки в хвостових значеннях дуже велика розбіжність. Діаграма QQ - це графік теоретичного кількісного (якщо це було нормально) вірша зразка кванті (з даних). Якщо дані вибірки є нормальними, ми очікуємо, що спостереження будуть близькими до лінійних, як і для першого сюжету. Також зверніть увагу на саму шкалу різниці на осі у для цих ділянок.
Шелдон

15

Якщо припустити, що ваш набір даних викликається wordsта має countsстовпець, ви можете побудувати гістограму для візуалізації розподілу:

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

де 100 - кількість бункерів

Ви також можете зробити звичайний QQ графік, використовуючи

qqnorm(words$counts)

Нарешті, ви також можете використовувати тест Шапіро-Вілка для нормальності

shapiro.test(word$counts)

Хоча, дивіться на цю дискусію: Тестування на нормальність: "По суті марно?"


14

Жоден тест не покаже вам, що ваші дані мають нормальний розподіл - він зможе показати вам лише тоді, коли дані будуть досить невідповідними нормальному, що ви б відхилили нуль.

Але підрахунки не є нормальними в будь-якому випадку, це натуральні числа - яка ймовірність того, що спостереження з нормального розподілу прийме значення, яке не є цілим числом? (... це подія ймовірності 1).

Чому б ви перевіряли на нормальність у такому випадку? Це, очевидно, неправда.

[У деяких випадках не обов'язково має значення, що ви можете сказати, що ваші дані насправді не є нормальними. Реальні дані ніколи (або майже ніколи) не будуть фактично виведені із звичайного розподілу.]

Якщо вам справді потрібно зробити тест, тест Шапіро-Вілка ( ?shapiro.test) - хороший загальний тест на нормальність, який широко використовується.


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
}

для Skewness.

Обидва ці тести є однобічними, тому вам потрібно буде помножити p-значення на 2, щоб стати двохвостим. Якщо ваше р-значення стане більшим, ніж одне, вам потрібно буде використовувати 1-kurtosis.test () замість kurtosis.test.

Якщо у вас є інші питання, ви можете надіслати мені електронну пошту на j.bredman@gmail.com


У чому полягають відмінності двох вищезазначених функцій щодо kurtosis()та skewness()функцій від пакету моментів ? Результати з використанням rnorm()зразків різні.
Нікос Олександріс

5

Окрім тесту Шапіро-Вілка щодо пакету статистики, найновіший пакет (доступний на CRAN) забезпечує інші тести на нормальність.


4

Використовуючи 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


@Nick; Я згадав про цей тест із пакету "nortest", знайденого тут: ( cran.r-project.org/web/packages/nortest/nortest.pdf ). Інший корисний пакунок є "нормальним", як згадувалося вище.
Д-р Ніша Арора

Добре, дякую. У своєму невігластві я припустив, що одне ім’я було помилковим.
Нік Кокс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.