如何使用 R 执行测试以查看数据是否服从正态分布

机器算法验证 r 分布 正态假设
2022-01-20 08:09:30

我有一个具有以下结构的数据集:

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

如何在 R 中执行正态分布测试?可能这是一个简单的问题,但我是 R 新手。

4个回答

如果我正确理解您的问题,那么要测试一组文档中出现的单词是否遵循正态分布,您可以使用 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 命令给出: 替代文字

您可以看到,第二个数据集显然不是 Normal 的重尾(更多信息)。

在 Shapiro-Walk 正态性检验中,第一个数据集的 p 值很大 (>.9),但第二个数据集的 p 值非常小 (<.01)。这将导致您拒绝第二个的零假设。

假设您的数据集被调用words并有一counts列,您可以绘制直方图以可视化分布:

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

其中 100 是 bin 的数量

您也可以使用

qqnorm(words$counts)

最后,您还可以使用 Shapiro-Wilk 检验进行正态性检验

shapiro.test(word$counts)

虽然,看看这个讨论:正态性测试:“基本上没用?”

没有测试会告诉您您的数据具有正态分布 - 只有当数据与正态足够不一致时才能向您显示您会拒绝空值。

但是计数在任何情况下都不正常,它们是正整数 - 从正态分布中观察到的值不是整数的概率是多少?(...这是概率为 1 的事件)。

在这种情况下,您为什么要测试正态性?这显然是不真实的。

[在某些情况下,您可以判断您的数据实际上并不正常可能并不重要。真实数据永远不会(或几乎永远不会)真正从正态分布中提取。]

如果您确实需要进行测试,Shapiro-Wilk 测试 ( ?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,您将需要使用 1-kurtosis.test() 而不是 kurtosis.test。

如果您有任何其他问题,可以通过 j.bredman@gmail.com 给我发电子邮件