简单数据转化
简单的数据转换方法可大致分为两类:线性转换,对原始数据中的每个值加常数或乘以常数,通常不会改变统计检验的结果;非线性转换,如对数转换,平方根转换等,转换后的统计检验结果与未转换的变量的统计检验结果会有不同。无论怎样转换数据,对每个变量的值均进行了同一种转换模式,各变量之间独立互不影响。
对于生态学数据来讲,对数据进行简单的转换的目的主要有这么几点:
(1)改变数据的结构,使其能更好地反映生态关系。例如使本来不具备线性关系两种变量转换为线性关系,因为线性关系通常比非线性关系更容易解释。
(2)为了更好地适合某些特殊分析方法。例如T检验要求数据近似正态分布,而我们的数据并非如此(生态学的数据普遍是非正态分布,这点大家深有体会吧),若执行T检验则必须首先将数据转换为正态分布类型。如在某些情况下可使用log转换实现这一需求。
(3)缩小属性间的差异性,使数据值趋向一致,便于数据观测和统计等。
切记数据转换过程不是盲目的,在转换数据时,我们需要确保转换后的数据分布不会变得更糟,并且避免出现异常值。如果我们结论是根据转换后的数据得出的,那么必须要在结论中(图注、表注部分等,或者在方法描述部分)清楚地说明这一点。还有重要的一点肯定就是要注意所得的结论是否合理了(是否具有生态学意义,还是仅仅为数学计算上的偶然性),假设你得到了变量“太阳辐射和风速的3次方存在相关性”类似的结论,解释起来就要小心。
#简单的数据转换直接按数学公式来即可,如
dat <- log(data+1, 2) #log2
dat <- log(data+1, exp(1)) #ln
dat <- log(data+1, 10) #log10
dat <- data^2 #平方
dat <- data^0.5 #开方
dat <- data^-1 #倒数
数据标准化
数据标准化是统计学上常用的方法,它从来自数据本身计算的统计量来更改数据(例如均值、范围、权重等)。虽然标准化过程也是通过某一计算将原始数据变成新的值,但它与原始数据集合中的其他值有关,因此不同于上述简单的数据转换(对各变量统一执行同一变换,变量间互不影响)。
常见的数据标准化方法如中心化(centralization),将原始数据减去平均值;标准化(normalization),转换后的数据均值为0,方差为1;z-scores标准化,也称标尺化(scaling),先中心化后再除以标准差;等等方法。
对于生态学数据来讲,应用标准化的最常见原因主要是为了:
(1)改变变量或对象的相对权重(重要性),消除这种由相对权重所造成的差异。
(2)当变量具有不同的量纲时,标准化过程可以使不同物理单位的变量具有可比性。
(3)缩小变量间的差异,降低极端值的影响,或者限制数据的取值范围(如[0,1]区间)等。
同样地,是否需要将数据标准化,选择何种标准化方法等,需要根据实际情况来确定,不可盲目。举个例子,在RNA-seq中(有些偏题了,不过没关系,仅用它展示个可能的反例),有种方法叫FPKM,用于对reads count值实现标准化;实验室的师妹使用FPKM标准化16S群落测序的OTU数据……总觉得有种滥用的感觉……
数据转换仅仅是对数据中每个观察值的独立处理,而标准化则涉及到数值之间的处理。下面我们以生态学常用的vegan包中的decostand()函数为例,分析不同标准化方法的差别,此函数使用方法如下:
decostand(x, method, MARGIN, range.global, logbase = 2, na.rm=FALSE, ...)
其中x为向量或矩阵,method为标准化方法,MARGIN=1按行处理,MARGIN=2按列处理,不同标准化方法介绍如下:
①method="pa",将数据转换为有-无(1-0)类型,若分析不加权的情况群结构下可以使用;
②method="max",最大值标准化,将数据除以该行或者列的最大值(defaultMARGIN=2)。若数据非负,最大值标准化后数据全部位于0到1之间。
③method="total",总和标准化,将数据除以该行或者列的总和,也即求相对丰度(default MARGIN=1),总和标准化后数据全部位于0到1之间。
④method="range",Min-max标准化,将数据减去该行或者列的最小值,并比上最大值与最小值之差(defaultMARGIN=2),Min-max标准化后的数据全部位于0到1之间。
⑤method="normalize",模标准化,将数据除以每行或者每列的平方和的平方根(default MARGIN=1),模标准化后每行、列的平方和为1(向量的模为1),也即在笛卡尔坐标系中到原点的欧氏距离为1,样品分布在一个圆弧上,彼此之间的距离为弦长,因此也称为弦转化。在基于欧氏距离的PCA、RDA中分析群落数据可以将每个样方弦转化可以弥补欧氏距离的缺陷。弦转化后的数据使用欧氏距离函数计算将得到弦距离矩阵。
⑥method="hellinger",hellinger转化,就是总和标准化数据的平方根(default MARGIN=1),hellinger转化后的数据使用欧氏距离函数计算将得到hellinger距离矩阵。
⑦method="chi.square",卡方转化,在默认(defaultMARGIN=1)的情况下是数据除以行的和再除以列的和的平方根,卡方转化后的数据使用欧氏距离函数计算将得到卡方距离矩阵。
⑧Wisconsin转化,这个是使用伴随的函数wisconsin(),将数据除以该列最大值再除以该行总和,是最大值标准化和总和标准化的结合。
⑨method="standardize",z-score标准化,最常用的标准化方法之一,将数据减去均值比上标准差(default MARGIN=2),z-score标准化后数据均值为0,方差为1,服从正态总体的数据标准化后服从标准正态分布。z-score标准化可以去除不同环境因子量纲的影响。
一般情况下,上面方法中默认MARGIN=1是默认对样品进行处理,默认MARGIN=2是默认对物种或者环境变量进行处理。
为了比较不同标准化方法对群落数据的影响,我们使用只有两个物种的虚拟群落进行处理,然后在笛卡尔坐标系进行展示(彼此之间是欧氏距离):
#假设虚拟数据:2个物种在5个样方的分布
spe1=c(0.1,0.2,0.3,0.4,0.5)
spe2=c(0.6,0.7,0.8,0.9,1)
ab=cbind(spe1,spe2)
rownames(ab)=LETTERS[1:5]
#各种标准化
ab1=decostand(ab, MARGIN=1, "total")
ab2=decostand(ab, MARGIN=1, "normalize")
ab3=decostand(ab, MARGIN=1, "hellinger")
ab4=decostand(ab, MARGIN=1, "chi.square")
ab5=wisconsin(ab)
#作图观察不同标准化方法距离差异
par(mfrow=c(2,3))
plot(ab[,1], ab[,2], xlim=0:1, ylim=0:1, main="Raw data")
text(ab[,1], ab[,2]-0.05, labels=rownames(ab), cex=1.2)
plot(ab1[,1], ab1[,2], xlim=0:1, ylim=0:1, main="Total")
text(ab1[,1], ab1[,2]-0.05, labels=rownames(ab), cex=1.2)
plot(ab2[,1], ab2[,2], xlim=0:1, ylim=0:1, main="Normalize")
text(ab2[,1], ab2[,2]-0.05, labels=rownames(ab), cex=1.2)
plot(ab3[,1], ab3[,2], xlim=0:1, ylim=0:1, main="Hellinger")
text(ab3[,1], ab3[,2]-0.05, labels=rownames(ab), cex=1.2)
plot(ab4[,1], ab4[,2], xlim=0:1, ylim=0:1, main="Chi.square")
text(ab4[,1], ab4[,2]-0.05, labels=rownames(ab), cex=1.2)
plot(ab5[,1], ab5[,2], xlim=0:1, ylim=0:1, main="Wisconsin")
text(ab5[,1], ab5[,2]-0.05, labels=rownames(ab), cex=1.2)

在没有处理的情况下,群落之间的欧氏距离相等,然而在生态学方面我们不这么看,因为B中物种1的数量是A的两倍,其群落差异显然比D、E更大,五种处理方法标准化数据后的结果都比较好的证实了上面的猜想,尤其是最后两种。然而在微生物生态中,我们倾向于认为微生物群落是一个整体,不同样品之间物种的相对丰度是有可比较的实际意义的,因此最常用的就是总和标准化(当然在不涉及丰度比较的聚类和排序分析中各种标准化方法都可以尝试,在传统群落研究里,虽然经常使用中心化等方法,但是需要使用盖度等对不同物种进行加权,因此直接进行总和标准化从某种意义上是使用相对丰度进行加权)。
对于物理、化学变量而言,则完全不同,因为环境变量的值具有绝对性,例如温度1-2℃和21-22℃其差异是一样的。环境变量由于量纲不同,在计算距离矩阵(欧氏距离)、根据特征根提取的主成分分析、比较系数的回归分析之前,均需要进行z-score标准化。
网友评论