查看原文
其他

R语言实现统计分析——非参数假设检验

糖甜甜甜 R语言中文社区 2019-04-22

作者简介

糖甜甜甜 

公众号:经管人学数据分析

往期回顾:

词云一分钟了解周董的歌词

非参数检验是指总体不服从正态分布,且分布情况不明时,用来检验数据是否来自同一个总体假设等一类检验方法。非参数检验通常是将数据转换成秩(顺序的意思)来进行分析的,秩就是该数据按照升幂排列之后,每个观测值的位置。

1 单样本泊松分布总体的均值检验

泊松分布适合于描述单位时间内随机事件发生的次数。

假设一次市场推广活动中前一个小时有50人注册,后一个小时有60人注册,后一小时的注册人数是否明显高于前一小时?

H0:后一小时注册用户数量与前一小时无差异(因为明显后一小时注册人数比前一小时的多,所以无小于符号)H1:后一小时注册用户数量显著高于前一小时


poisson.test(x = 60,T = 50,alternative = "greater",conf.level = 0.95)


————————————以下是以上代码处理后数据————————————

Exact Poisson test


data:  60 time base: 50

number of events = 60, time base = 50, p-value = 0.09227

alternative hypothesis: true event rate is greater than 1

95 percent confidence interval:

 0.9570464       Inf

sample estimates:

event rate 

       1.2 


# 与前一小时50人注册量有显著差异的临界值,qpois()函数求在显著性水平和对比值下的泊松分布次数

> qpois(0.95,lambda =50)

[1] 62       


p-value = 0.09227>0.05,在0.95的置信区间下接受原假设H0,后一小时注册人数与前一小时无差异。后一小时的注册用户数需要提升到62以上才能明显高于前一小时的注册用户数。

2 分布一致性检验

2.1  离散分布


卡方检验

总体分布的卡方检验适用于配合度检验,是根据样本数据的实际频数推断总体分布与期望分布或理论分布是否有显著差异。它的零假设H0:样本来自的总体分布形态和期望分布或某一理论分布没有显著差异。

总体分布的卡方检验的原理是:如果从一个随机变量尤中随机抽取若干个观察样本,这些观察样本落在X的k个互不相交的子集中的观察频数服从一个多项分布,这个多项分布当k趋于无穷时,就近似服从X的总体分布。

因此,假设样本来自的总体服从某个期望分布或理论分布集的实际观察频数同时获得样本数据各子集的实际观察频数,并依据下面的公式计算统计量 :

其中,Qi表示观察频数;Ei表示期望频数或理论频数。可见Q值越大,表示观察频数和理论频数越不接近;Q值越小,说明观察频数和理论频数越接近。

2.2  连续分布

Kolmogorov-Smirnov分布一致性检验:ks.test(x, y)

该检验的目的是: 对于单样本,检验其是否符合某种分布 。对于双样本,检验其是否属于同一分布。

ks检验,理论上可以检验任何分布。 既可做当样本检验,也可做双样本检验。

#单样本检验

#记录一台设备无故障工作时常,并从小到大排序

#420 500 920 1380 1510 1650 1760 2100 2300 2350。

#问这些时间是否服从lambda=1/1500的指数分布?

x <- c(420,500,920,1380,1510,1650,1760,2100,2300,2350)

ks.test(x,"pexp",1/1500)


#双样本检验

#有两个分布,分别抽样了一些数据,问他们是否服从相同的分布。

X<-scan()

Y<-scan()

x = runif(100)

y = runif(100)

ks.test(x,y)    


Shapiro-Wilk正态性检验:shapiro.test(x)

正态W检验方法,当p值大于a为正态分布,样本含量在[3, 5000]之间。

3 离散一致性检验

mood.test(x, y)    该检验假设两样本中位数相同,因此需要将两个中位数的差异消除再比较。
 diff=median(x)-median(y); y=y+diff; mood.test(x,y);

ansari.test(x,y)   用于两样本,当数据中有结时会出现警告。也需要将两个中位数的差异消除再比较。

fligner.test(x)  x是一个列表,用于多样本,不需要消除中位数的差异。

4 列联表数据独立性检验:卡方独立性检验

chisq.test() 可以做列联表数据独立性检验,只要将数据写成矩阵形式就可以。


#根据列联表判断吸烟与致癌是否有关系

#p值很小,拒绝无关系的假设,应该有关系

> x = matrix(c(60,3,32,11),nrow=2)

> chisq.test(x)


#如果一个单元格内的数据小于5,那么卡方检验无效。

#此时应做Fisher精确检验

> fisher.test(x)


使用chisq.test()函数对二维表的行变量和列变量进行卡方独立性检验。

# Chis-square test of independence

> library(vcd)

> mytable <- xtabs(~Treatment+Improved, data=Arthritis)    

# 这里是要检验的两个列属性:Treatment ,Improved,构建一个交叉相乘表。

> mytable

         Improved

Treatment None Some Marked                

# 这里显示交叉相乘的结果               

  Placebo   29    7      7

  Treated   13    7     21

> chisq.test(mytable)

# 下面使用了卡方函数测量两个变量是否独立。                     


        Pearson's Chi-squared test


data:  mytable

X-squared = 13.055, df = 2, p-value = 0.001463         

# 从结果显示,p-value非常小,可认为是Treatment,Improved不独立,存在某种相关关系。


此外,还有针对配对数据的McNemar检验,为配对卡方检验,检验变化的强度,H0:频数没有发生变化。

要求为单元格内的数据不得小于5,总数要大于100。

5 符号检验

中位数符号检验:当我们以中位数将数据分为两边,一边为正,一边为负,那么样本出现在两边的概率应该都为1/2。因此,使用p=0.5的二项检验就可以做符号检验了。


#统计了66个城市的生活花费指数,北京的生活花费指数为99

#请问北京是否位于中位数以上。(换言之,99是否为该数据集的中位数。)

> x = c(66, 75, 78, 80, 81, 81, 82, 83, 83, 83, 83,

      84, 85, 85, 86, 86, 86, 86, 87, 87, 88 ,88,

      88, 88 ,88 ,89 ,89 ,89 ,89 ,90 ,90 ,91, 91,

      91, 91, 92, 93, 93, 96, 96, 96, 97, 99, 100,

      101 ,102, 103, 103, 104, 104, 104, 105, 106, 109, 109,

      110 ,110 ,110 ,111 ,113 ,115 ,116 ,117, 118, 155 ,192)

> mean(x)

> binom.test(sum(x>99),length(x),p=0.5,alternative = "less")

6 wilcoxon秩和检验

符号检验只考虑了符号,没有考虑差异的大小。wilcoxon解决了这个问题。 假设数据是连续分布的,数据是关于中位数对称的。两样本秩和检验 :假定第一个样本有m个观测值,第二个有n个观测值。把两个样本混合之后把这m+n个观测值升幂排序,记下每个观测值在混合排序下面的秩。之后分别把两个样本所得到的秩相加。记第一个样本观测值的秩的和为WX,而第二个样本秩的和为WY。这两个值可以互相推算,称为Wilcoxon统计量。



#单样本检测

#某电池厂商生产的电池中位数为140.

#现从新生产的电池中抽取20个测试。请问电池是否合格

x <- c(137,140,138.3,139,144.3,139.1,141.7,137.3,133.5,

       138.2,141.1,139.2,136.5,136.5,135.6,

       138,140.9,140.6,136.3,134.1)

wilcox.test(x,mu=140,alternative = "less",

            exact=F,correct=F,confi.int=T)


#配对双样本检测。

#在农场中选择了10块农田,将每一块农田分成2小块,分别用不同的化肥种菜。

#请问化肥会不会提高蔬菜产量。

x <- c(459,367,303,392,310,342,421,446,430,412)

y <- c(414,306,321,443,281,301,353,391,405,390)

wilcox.test(x-y,alternative = "greater")


#非配对双样本检测

#10名非铅工人和10名铅工人的血铅值是否存在显著差异

x <- c(24,26,29,34,43,58,63,72,87,101)

y <- c(82,87,97,121,164,208,213)

wilcox.test(x,y,alternative="less")


在R中,wilcox.test()函数可以用来做Wilcoxon秩和检验,也可以用于做Mann-Whitney U检验。当参数为单个样本,或者是两个样本相减,或者是两个参数,paired=TRUE时,是Wilcoxon秩和检验。当paired = FALSE(独立样本)时,就是Mann-Whitney U检验。

Mann-Whitney U检验案例 :对10例肺癌病人和12例矽肺0期工人用X光片测量肺门横径右侧距RD值(cm)。问肺癌病人的RD值是否高于矽肺0期工人的RD值?


lc <- c(2.78,3.23,4.2,4.87,5.12,6.21,7.18,8.05,8.56,9.6)

si <- c(3.23,3.5,4.04,4.15,4.28,4.34,4.47,4.64,4.75,4.82,4.95,5.1)


> wilcox.test(lc,si,alternative="greater",exact=F)

 

        Wilcoxon rank sum test with continuity correction

 

data:  lc and si

W = 86.5, p-value = 0.04318

alternative hypothesis: true location shift is greater than 0


Kurskal-Wallis检验是Wilcoxon方法(其实是Mann-Whitney检验)用于多个样本。当对两个样本进行比较的时候,Kurskal-Wallis检验与Mann-Whitney检验是等价的。

Kurskal-Wallis检验案例 : 用三种药物杀灭钉螺,每批用200只活钉螺,用药后清点每批钉螺的死亡数、再计算死亡率(%)。问三种药物杀灭钉螺的效果有无差别?

drug <-rep(c("甲药","乙药","丙药"),each=5)

data <- c(32.5,35.5,40.5,46,49,16,20.5,22.5,29,36,6.5,9.0,12.5,18,24)

data85 <- data.frame(drug,data)

> kruskal.test(data85$data~data85$drug)

 

        Kruskal-Wallis rank sum test

 

data:  data85$data by data85$drug

Kruskal-Wallis chi-squared = 9.74, df = 2, p-value = 0.007673






 大家都在看 

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)


公众号后台回复关键字即可学习

回复 R                  R语言快速入门及数据挖掘 
回复 Kaggle案例  Kaggle十大案例精讲(连载中)
回复 文本挖掘      手把手教你做文本挖掘
回复 可视化          R语言可视化在商务场景中的应用 
回复 大数据         大数据系列免费视频教程 
回复 量化投资      张丹教你如何用R语言量化投资 
回复 用户画像      京东大数据,揭秘用户画像
回复 数据挖掘     常用数据挖掘算法原理解释与应用
回复 机器学习     人工智能系列之机器学习与实践
回复 爬虫            R语言爬虫实战案例分享

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存