0

我有一个包含 30 个样本的向量,我想检验样本来自正态分布的总体的假设。

> N.concentration
  [1] 0.164 0.045 0.069 0.100 0.050 0.080 0.043 0.036 0.057 0.154 0.133 0.193
  [13] 0.129 0.121 0.081 0.178 0.041 0.040 0.116 0.078 0.104 0.095 0.116 0.038
  [25] 0.141 0.100 0.104 0.078 0.121 0.104

我使用了一个频率向量hist

> N.hist <- hist(N.concentration, breaks=10)
> N.freq <- N.hist$count
  [1] 3 5 4 4 5 4 2 2 1

chisq.test用来检查对N.freq正态分布的适应度,但是,该函数需要一个参数p = 一个与 x 长度相同的概率向量,如 chisq.test 文档中所定义。我正在尝试为它生成一个向量,但老实说,我不知道要生成什么。我正在努力

> d <- length(N.freq$count)%/%2
> p <- dnorm(c(-d:d))
> p
  [1] 0.0001338302 0.0044318484 0.0539909665 0.2419707245 0.3989422804
  [6] 0.2419707245 0.0539909665 0.0044318484 0.0001338302
> chisq.test(N.freq, p = p)
   Error in chisq.test(p1$count, p = p) : 
   probabilities must sum to 1.

我考虑过使用rescale.p=TRUE,但我不确定这是否会产生有效的测试。


编辑:如果我使用 rescale.p,我会收到一条警告消息

> chisq.test(N.freq, p=p, rescale.p=TRUE)

Chi-squared test for given probabilities

data:  N.freq
X-squared = 2697.7, df = 8, p-value < 2.2e-16

Warning message:
In chisq.test(N.freq, p = p, rescale.p = TRUE) :
Chi-squared approximation may be incorrect
4

2 回答 2

3

正如我所说,要测试正态性,我们必须知道零假设中正态分布的均值和标准误差。由于没有给定值,我们必须从您的 30 个数据中估计它们。

x <- c(0.164, 0.045, 0.069, 0.1, 0.05, 0.08, 0.043, 0.036, 0.057, 
0.154, 0.133, 0.193, 0.129, 0.121, 0.081, 0.178, 0.041, 0.04, 
0.116, 0.078, 0.104, 0.095, 0.116, 0.038, 0.141, 0.1, 0.104, 
0.078, 0.121, 0.104)

mu <- mean(x)
sig <- sd(x)

现在,正如您所做的那样,我们需要对数据进行分类:

h <- hist(x, breaks = 10)
#List of 6
# $ breaks  : num [1:10] 0.02 0.04 0.06 0.08 0.1 0.12 0.14 0.16 0.18 0.2
# $ counts  : int [1:9] 3 5 4 4 5 4 2 2 1
# $ density : num [1:9] 5 8.33 6.67 6.67 8.33 ...
# $ mids    : num [1:9] 0.03 0.05 0.07 0.09 0.11 0.13 0.15 0.17 0.19
# $ xname   : chr "x"
# $ equidist: logi TRUE
# - attr(*, "class")= chr "histogram"

为了获得零假设下的真实概率,我们需要每个 bin 单元格的概率,即间隔之间的概率。

p <- diff(pnorm(h$breaks, mu, sig))
#[1] 0.05675523 0.10254734 0.15053351 0.17953337 0.17396679 0.13696059 0.08760419
#[8] 0.04552387 0.01921839

我倾向于不相信只有 30 个数据的卡方检验。但这是我们可以使用的方法chisq.test

chisq.test(h$counts, p = p, rescale.p = TRUE)
#
#   Chi-squared test for given probabilities
#
#data:  h$counts
#X-squared = 3.1476, df = 8, p-value = 0.9248
#
#Warning message:
#In chisq.test(h$counts, p, rescale.p = TRUE) :
#  Chi-squared approximation may be incorrect

通常你不需要打扰警告信息。如果你想摆脱它,设置simulate.p.value = TRUE

chisq.test(h$counts, p = p, rescale.p = TRUE, simulate.p.value = TRUE)
#
#   Chi-squared test for given probabilities with simulated p-value (based
#   on 2000 replicates)
#
#data:  h$counts
#X-squared = 3.1476, df = NA, p-value = 0.942
于 2016-11-20T19:43:26.233 回答
2

许多统计测试设计用于测试指定数据集偏离正态性的情况(例如,参见nortest 包)。但是,您应该知道,许多统计学家认为正态性测试“基本上没用”:特别是(来自链接的 CrossValidated 问题的答案):

科学家们经常期望正态性检验回答的问题是:数据是否与高斯理想有足够的偏差以“禁止”使用假设高斯分布的检验?科学家们通常希望正态性检验成为决定何时放弃传统(ANOVA 等)检验并转而分析转换数据或使用基于等级的非参数检验或重采样或引导方法的裁判。为此,正态性检验不是很有用。

但是,继续使用 base R 中的Shapiro-Wilk 测试(根据 Wikipedia 页面,Shapiro-Wilk 具有良好的能力 - 但从上面的讨论中注意到,在这种情况下,高能力不一定是我们真正想要的......)

d <- c(0.164,0.045,0.069,0.100,0.050,0.080,0.043,0.036,0.057,0.154,
       0.133,0.193,0.129,0.121,0.081,0.178,0.041,0.040,0.116,0.078,
       0.104,0.095,0.116,0.038,0.141,0.100,0.104,0.078,0.121,0.104)
shapiro.test(d)
##  Shapiro-Wilk normality test
## 
## data:  d
## W = 0.9547, p-value = 0.2255

图解法:

par(las=1,bty="l")
qqnorm(d)
qqline(d)

在此处输入图像描述

点沿线相当好,最大偏差(数据集中三个最小的点)实际上比预期的要大,这意味着数据集在低端略微细尾,这意味着基于假设的测试常态通常会略微保守。

于 2016-11-20T20:55:22.433 回答