脏数据-数据量纲差异

浏览: 1442

作者:勾蒙蒙,R语言资深爱好者

个人公众号:R语言及生态系统服务


我们在进行科学研究时,通常会收集到大量不同的指标变量,每个指标的性质、量纲等特征均存在着一定地差异,从而使得各指标之间不具有综合性,不能直接的进行综合分析,如在在进行主成分分析的时候,由于变量的量纲不同会使主成份得分系数的可解释性变差,使结果受到量纲大的变量影响,而忽略量纲较小的变量。因此,数据处理的前期除了数据清洗,离群值处理等,往往还需要一些处理量纲差异的方法,将数据标准化。数据标准化将数据按比例缩放,使其落到一个小的特定空间,归一化是最典型的数据标准化处理方式,即将数据统一映射到[0,1]区间上,常用的方法有四种:min-max标准化、log函数转换、atan函数转换、z-score标准化。以下用一组实例数据加以详细地介绍数据来源于科学网赖江山博士的博客(http://blog.sciencenet.cn/u/laijiangshan),数据为古田山24公顷样地内随机抽取40个20m×20m的样方中的环境因子,主要包含高程、凹凸度、坡度、坡向、土壤N、P、K、PH等指标。

1、min-max标准化

也叫离差标准化,对原数据进行线性变换,使结果落到[0,1]区间内

##读取数据

setwd("C:/Users/lx/Desktop")

Data<-read.table("gtsenv.txt",head=TRUE,sep="")

##min-max标准化

dim(Data)

stddata<-data.frame()

for (i in 1:dim(Data)[1]){

for (j in 1:dim(Data)[2]){

stddata[i,j]<-((Data[i,j]-(min(Data[,j])))/(max(Data[,j])-min(Data[,j])))

}

}

View(stddata)

此方法在计算生态系统服务权衡均方根偏差法(RMSD)的第一步会用到。

2、log函数转换

很多人误认为是log10(x),其实不然,由此获得的结果并非都落到[0,1]区间上,其结果需除以log10(max),并且所有的数据都必须大于0。

##读取数据

setwd("C:/Users/lx/Desktop")

Data<-read.table("gtsenv.txt",head=TRUE,sep="")

View(Data)

##log函数转化

dim(Data)

stddata<-data.frame()

for (i in 1:dim(Data)[1]){

for (j in 1:dim(Data)[2]){

stddata[i,j]<-(log(Data[i,j])/log(max(Data[,j])))

}

}

View(stddata)

There were 25 warnings (use warnings() to see them)##数据中存在负值

3、atan函数转换

适用于数据均大于0的情况,否则小于0的数据将会被映射到[-1,0]的区间上。

##读取数据
setwd("C:/Users/lx/Desktop")

Data<-read.table("gtsenv.txt",head=TRUE,sep="")

View(Data)

##atan函数转化

dim(Data)

stddata<-data.frame()

for (i in 1:dim(Data)[1]){

for (j in 1:dim(Data)[2]){

stddata[i,j]<-((atan(Data[i,j])*2)/pi)

}

}

View(stddata)

4、z-score标准化

是指中心化后的数据除以数据集的标准差。R中自带有scale()函数,适用于最大值和最小值未知的情况,或者有超出范围离群数据的情况,其标准化后的数据符合标准正态分布,即均值为0,标准差为1,若数据大于0水平说明高于平均水平,小于0说明低于平均水平。

scale函数详解

scale(data,center=T/F,scale=T/F)

1)center和scale默认为真,即T或者TRUE

2)center为真表示数据中心化

3)scale为真表示数据标准化
##原理的代码

##读取数据

setwd("C:/Users/lx/Desktop")

Data<-read.table("gtsenv.txt",head=TRUE,sep="")

View(Data)

##z-score标准化

dim(Data)

stddata<-data.frame()

for (i in 1:dim(Data)[1]){

for (j in 1:dim(Data)[2]){

stddata[i,j]<-((Data[i,j]-(mean(Data[,j])))/sd(Data[,j]))

}

}

View(stddata)

结束语

总结而知新,通过上文的梳理,希望能帮助大家在数据分析前期对数据标准化意义以及R的实现有初步的了解。当然,世上也没有万能的“黄金法则”,对于标准化处理方法的选择,还需要自己针对数据实际,选取恰当准确的方法。

推荐 0
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册