R_数据正态分布检验

  • Post author:
  • Post category:其他


使用R检测数据是否符合正态分布(正态分布检验)

R语言正态检验; R语言QQ图; R语言概率密度曲线比较法;

详细的方法介绍在网上已经有很多了,推荐

这篇

概括得来讲,主要分为4(or 5)种方法:

  • 概率密度曲线比较法
  • Q-Q图法
  • 经验法则
  • 夏皮罗-威尔克(Shapiro-Wilk)检验法,适用于50 < n < 100 时的正态性检验
  • SPSS 规定:当样本含量3 ≤n ≤5000 时,结果以Shapiro – Wilk (W 检验) 为准,当样本含量n > 5000 结果以Kolmogorov – Smirnov 为准。而SAS 规定:当样本含量n ≤2000 时,结果以Shapiro – Wilk (W 检验) 为准,规定当样本含量n >2000 时,结果以Kolmogorov – Smirnov (D 检验) 为准,所以我在这里也提一下 R语言中的 Kolmogorov-Smirnov 检验
ks.test(x, y, ...,

        alternative = c("two.sided", "less", "greater"),

            exact = NULL)

R语言中ks.test有四个参数,第一个参数x为观测值向量,第二个参数y为第二观测值向量或者累计分布函数或者一个真正的累积分布函数如pnorm,只对连续CDF有效。第三个参数为指明是单侧检验还是双侧检验,exact参数为NULL或者一个逻辑值,表明是否需要计算精确的P值。

我使用R编写了一个示例函数,同时使用了概率密度曲线比较法、Q-Q图法和夏皮罗-威尔克(Shapiro-Wilk)检验法。

至于经验法则,我不是很推荐,很玄这东西。

不废话,上码子

#input.data应为矩阵
normal_test<- function(input.data,alpha=0.05,picplot=TRUE){
  if(picplot==TRUE){#画图形
    dev.new()#新建窗口画图
    par(mfrow=c(2,1))

    #Q-Q图法
    qqnorm(input.data,main="qq图")
    qqline(input.data)

    #概率密度曲线比较法
    hist(input.data,freq=F,main="直方图和密度估计曲线")
        #如果画出的图缺少尖端部分则使用下面这句代码
        #hist(input.data,freq=F,main="直方图和密度估计曲线",ylim = c(0,0.5))#使用合适的值来避免红蓝线缺少尖端部分,这里根据已经跑出来的图像我得出0.5
    lines(density(input.data),col="blue") #密度估计曲线
    x<-seq(min(input.data),max(input.data),0.0001)
        #使用seq(),若取0.0000001太密集跑大一点的数据就容易死机,建议0.0001
    lines(x,dnorm(x,mean(input.data),sd(input.data)),col="red") 
        #正态分布曲线,思想是根据求每个x应该对应的标准正态y值,然后将x与求出的y放在一起做出所求数据如果按照正态分布应该是怎样的,并于实际密度曲线(蓝线)对比 
  }#sd标准差 mean平均值

  #夏皮罗-威尔克(Shapiro-Wilk)检验法【数据不能过大,范围为3~5000,假如有一个300*300的矩阵那么这个方法运行函数时作废】
  shapiro_result<- shapiro.test(input.data)
  if(shapiro_result$p.value>alpha){
    print(paste("success:服从正态分布,p.value=",shapiro_result$p.value,">",alpha))    
  }else{
    print(paste("error:不服从正态分布,p.value=",shapiro_result$p.value,"<=",alpha))
  }
  shapiro_result
}

使用的时候将以上代码运行后数据区会得到一个名为normal_test的函数,这时就可以调用它了。但之前我们先对要检验的数据进行预处理:

mydata<- read.table("xxxxxx.tsv", header=TRUE,sep="\t")#数据读入因人而异,我的是tsv文件(tab分隔),且带表头
mydata<-as.matrix(mydata)#需要转换为矩阵

至于调用函数

normal_test(mydata)

即可

附上一个符合正态分布数据画出的图

可以看到红蓝线拟合完美,qq图显示点集中在对角线上

符合正态图片

再来一个不符合的图

可以看到红蓝线差别大,qq图显示点并不集中在对角线上

不符合正态图片


visitor tracker

访客追踪插件




版权声明:本文为S_gy_Zetrov原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。