У меня есть набор данных со следующей структурой:
a word | number of occurrence of a word in a document | a document id
Как я могу выполнить тест для нормального распределения в R? Возможно, это простой вопрос, но я новичок в R.
У меня есть набор данных со следующей структурой:
a word | number of occurrence of a word in a document | a document id
Как я могу выполнить тест для нормального распределения в R? Возможно, это простой вопрос, но я новичок в R.
Ответы:
Если я правильно понимаю ваш вопрос, то для проверки соответствия слов в наборе документов нормальному распределению вы можете просто использовать тест Шапиро-Вилка и несколько 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). Это приведет вас к отказу от нулевой гипотезы для второго.
qqline
должен быть 1 уклон и перехват му .
Предполагая, что ваш набор данных вызван words
и имеет counts
столбец, вы можете построить гистограмму для визуализации распределения:
hist(words$counts, 100, col="black")
где 100 - количество бинов
Вы также можете сделать нормальный график QQ, используя
qqnorm(words$counts)
Наконец, вы также можете использовать тест Шапиро-Уилка для нормальности
shapiro.test(word$counts)
Хотя, посмотрите на это обсуждение: Тестирование нормальности: «По существу бесполезно?»
Никакой тест не покажет вам, что ваши данные имеют нормальное распределение - он сможет показать вас только тогда, когда данные достаточно несовместимы с нормой, что вы отклоните нуль.
Но в любом случае значения не являются нормальными, они являются положительными целыми числами - какова вероятность того, что наблюдение из нормального распределения примет значение, которое не является целым числом? (... это событие с вероятностью 1).
Зачем вам проверять нормальность в этом случае? Это явно не соответствует действительности.
[В некоторых случаях это не обязательно означает, что вы можете сказать, что ваши данные не являются нормальными. Реальные данные никогда (или почти никогда) не будут взяты из нормального распределения.]
Если вам действительно нужно сделать тест, то тест Шапиро-Уилка ( ?shapiro.test
) является хорошим общим тестом нормальности, который широко используется.
Более формальным взглядом на нормальность является проверка того, значительно ли эксцесс и перекос значительно отличаются от нуля.
Для этого нам нужно получить:
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()
образцов разные.
Используя 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
zipfR
пакет.