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


44

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

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

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


5
@Skarab也许我已经完全不了解了,但是根据Zipf的定律(j.mp/9er2lv),您难道不希望任何单词的出现频率与其在单词出现频率表中的排名成反比吗?在这种情况下,请检查zipfR包装。
chl

1
我同意@chl-如果您的数据是正态分布的,那将是一个小奇迹。关于您想对数据做什么的另一个问题也许值得。不要重新发明轮子!
csgillespie 2010年

3
如何根据给负发生率提供非零概率的模型来分配数据?
user603 2010年

1
进行此测试的原因是什么?
ub

我想估计信息提取的巨大结果是否正确。我想检查文本中找到的实体的分布是否符合我的期望(我知道域和文本语料库)。
Skarab 2010年

Answers:


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命令提供: 替代文字

您可以看到,第二条数据集的尾部很明显不是“正常”(More Info)。

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


7
为什么显然不正常?
Herman Toothrot

我认为标绘的点应该在I-III象限二等分线上,因为它们绘制的是正态分布。
坎帕

更一般而言(均值= 0),qqline斜率和mu截距应为1 。
坎帕

@HermanToothrot在查看第二个图时不正常,因为尾部值存在很大差异。QQ图是理论分位数(如果是正常的话)与样本分位数(来自数据)的关系图。如果样本数据是正常的,我们希望观察结果接近于线,就像第一幅图一样。还要注意这些图在y轴上的极差比例。
谢尔顿

15

假设您的数据集已调用words并具有一counts列,则可以绘制直方图以直观地显示分布:

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

其中100是箱数

您也可以使用

qqnorm(words$counts)

最后,您也可以使用Shapiro-Wilk检验来确定正态性

shapiro.test(word$counts)

不过,请看一下下面的讨论:正常性测试:“基本上没用吗?”


14

没有任何测试可以证明您的数据具有正态分布-只有当数据与正态充分不一致以至于您会拒绝空值时,它才能向您显示。

但是,无论如何,计数都不是正态的,它们是正整数-从正态分布观察得到的值不是整数的概率是多少?(...这是概率为1的事件)。

在这种情况下,为什么要测试正常性?这显然是不正确的。

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

如果您确实需要进行测试,那么Shapiro-Wilk测试(?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
}

偏度。

这两个测试都是单尾的,因此您需要将p值乘以2才能成为双尾。如果您的p值大于1,则需要使用1-kurtosis.test()而不是kurtosis.test。

如果您还有其他疑问,可以给我发电子邮件j.bredman@gmail.com


关于时刻包中的kurtosis()skewness()函数,以上两个函数有什么区别?使用样本的结果是不同的。rnorm()
Nikos Alexandris 2014年

5

除了stats软件包的Shapiro-Wilk测试之外,nortest软件包(在CRAN上提供)还提供其他正常性测试。


4

通过使用nortestR包,可以进行以下测试:

  • 进行安德森-达林正态性检验

    ad.test(data1)
  • 执行Cramér-vonMises测试是否正常

    cvm.test(data1)
  • 进行Pearson卡方检验是否正常

    pearson.test(data1)
  • 进行Shapiro-Francia测试以检查其正常性

    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”
Nisha Arora博士

好,谢谢。由于无知,我以为一个名字是错字。
尼克·考克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.