z-score标准化和R代码实现

Liang / 2018-11-30


z-score标准化:标准分数(standard score)也叫z分数(z-score),是一个分数与平均数的差再除以标准差的过程。 用公式表示为:z=(x-μ)/σ。或者说Z = (x - x(mean)) / x(sd),其中x为某一具体分数,μ为平均数,σ为标准差。 Z值代表着原始分数和母体平均值之间的距离,是以标准差为单位计算。 标准分数可以回答这样一个问题:“一个给定分数距离平均数多少个标准差?”在平均数之上的分数会得到一个正的标准分数,在平均数之下的分数会得到一个负的标准分数。 经过处理的数据符合标准正态分布,即均值为0,标准差为1, Z score 也可以用来表示组织特异性,0 表示没有组织特异性, Z-score >3 表示组织特异性强

z-score标准化也叫做标准差标准化,经过处理之后的数据会符合标准正态分布,其均值为0,标准差为1。

z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。其他还有

  • 最小-最大规范化——标准化:对原始数据的线性变换,将数据映射到[0,1]之间 x-min(x) / max(x)-min(x)
  • 移动变量的小数点位置来将变量映射到[-1,1]
data <- matrix(1:16,nrow=4)
data
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16

函数density计算的是数据的核心密度(kernal density)分布,其中density的计算可以通过bw参数(bandwidth)来控制,bw参数最直观的影响就是曲线的平滑性。默认的bw是通过函数bw.nrd0()计算得出,也可以手动设置。

d<-density(data)
plot(d)

a<-round(scale(data),2)
a
##       [,1]  [,2]  [,3]  [,4]
## [1,] -1.16 -1.16 -1.16 -1.16
## [2,] -0.39 -0.39 -0.39 -0.39
## [3,]  0.39  0.39  0.39  0.39
## [4,]  1.16  1.16  1.16  1.16
## attr(,"scaled:center")
## [1]  2.5  6.5 10.5 14.5
## attr(,"scaled:scale")
## [1] 1.290994 1.290994 1.290994 1.290994

也可以使用自己的函数进行计算z-score函数

apply(data, 1, function(x){(x - mean(x)) / sd(x)})
##            [,1]       [,2]       [,3]       [,4]
## [1,] -1.1618950 -1.1618950 -1.1618950 -1.1618950
## [2,] -0.3872983 -0.3872983 -0.3872983 -0.3872983
## [3,]  0.3872983  0.3872983  0.3872983  0.3872983
## [4,]  1.1618950  1.1618950  1.1618950  1.1618950
#看一下正态分布图片
d<-density(a)
plot(d)

检查分布情况

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

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

    #概率密度曲线比较法
    hist(input.data,freq=F,main="Histogram and Density Estimation Curve")
        #如果画出的图缺少尖端部分则使用下面这句代码
    #hist(input.data,freq=F,main="Histogram and Density Estimation Curve",ylim = c(0,0.3))#使用合适的值来避免红蓝线缺少尖端部分,这里根据已经跑出来的图像我得出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:Obey normal distribution,p.value=",shapiro_result$p.value,">",alpha))    
  }else{
    print(paste("error:Not obey normal distribution,p.value=",shapiro_result$p.value,"<=",alpha))
  }
  shapiro_result
}
normal_test(data)

## [1] "success:Obey normal distribution,p.value= 0.712313033478994 > 0.05"
## 
##  Shapiro-Wilk normality test
## 
## data:  input.data
## W = 0.96277, p-value = 0.7123
normal_test(a)

## [1] "error:Not obey normal distribution,p.value= 0.0247304187985943 <= 0.05"
## 
##  Shapiro-Wilk normality test
## 
## data:  input.data
## W = 0.8673, p-value = 0.02473

最后一次修改于 2018-11-30