第二章-第二部分-生态数据转换
数据转化的目的:
使不同物理单位的变量具有可比性(可以利用归一化,z-scores标准化,即先中性化再除以标准差,让变量无量纲化,然后方差就可以相加)
使变量更符合正态分布(至少对称分布),具有方差稳定(例如平方根转化和对数转化)
使非线性关系变成线性关系(例如通过对数转化将指数关系转化为线性关系)
在多元统计分析之前改变变量或者对象的权重,赋予所有变量相等的方差。例如赋予所有对象向量相同的长度(或范数(norm))
将分类变量转化为二元(0-1)变量或Helmert对照码
对于我们的物种数据,通常具有相同的刚量,通常是正值和零,对这样的数据几种简单的转化函数,可以降低极大值的影响:
平方根转化:sqrt()平方根
sqrt(sqrt())4次方根 (^0.25)
对数转化:log1p(),log(y+1) 的自然对数保证0值转化后仍为0
有-无数据的转化:某些特殊的情况需要把正值化为1 也就是有-无(1-0)
vegan 包内decostand() 函数可以提供多种生态学数据常用的标准化。
简单转化只是对数值进行独立的处理,而标准化是数值之间的处理。
# 数据转化和标准化
#访问帮助文件
?decostand()
#简单转化
#显示原始数据某一部分(多度数据)
spe[1:5,2:4]
#将多度数据转化为有-无(0-1)数据
spe.pa <- decostand(spe,method = "pa")
spe.pa[1:5,2:4]
#对列物种进行标准化
#通过每个数值除以该物种最大值标准化多度
#注意:这里参数MARGIN=2(默认值,对列进行"max"运算)
spe.scal <- decostand(spe,"max")
spe.scal[1:5,2:4]
#展示标准化后的每一列最大值
apply(spe.scal, 2, max)
这些标准化过程是否正常运行?最好利用绘图函数或总结函数密切追踪。
标准化
赋予每个行向量长度(范数)为1(即平方和为1)
这个转化也称为"弦转化"
# 通过每个数值除以该物种总和标准化多度(每个物种的相对多度)
# 注意:这里默认是MARGIN=1,需要设定参数MARGIN=2(对列进行"total')
# 运算
spe.relsp <- decostand(spe,"total",MARGIN = 2)
spe.relsp[1:5,2:4]
# 计算标准化后数据每列总和
# 传统的代码:apply(spe.relsp,2,sum)
colSums(spe.relsp)
# 对行(样方)进行标准化
# 通过每个数值除以该样方总和标准化多度(
# 每个样方物种相对多度或者相对频度)
spe.rel <- decostand(spe,"total")#默认MARGIN=1
spe.rel[1:5,2:4]
# 计算标准化后数据每列总和以检验标准化的过程是否正确
# 传统的代码:apply(spe.rel,1,sum)
rowSums(spe.rel)
# 赋予每个行向量长度(范数)为1(即平方和为1)
# 这个转化也称为"弦转化"
spe.norm <- decostand(spe,"normalize")#默认MARGIN=1
spe.norm[1:5,2:4]
# 验证每个行向量的范数
# 写一个仅仅有一行的函数获得每个向量x的范数
vec.norm <- function(x)sqrt(sum(x^2))
# 然后使用apply函数对所有行进行刚编写这个函数的运算
apply(spe.norm,1,vec.norm)
这个转化也称为"弦转化",如果用欧式距离函数去计算弦转化后的数据,将获得弦距离矩阵(见之后的推文)。
在PCA和RDA及K-均一值划分分析前需要对数据进行"弦转化"。对数转化后的数据也可以再进行"弦转化"
Hellinger转化
#计算相对多度(样方层面),然后取平方根
#这个转化被称为Hellinger转化
spe.hel <- decostand(spe,"hellinger")
spe.hel[1:5,2:4]
#计算标准化后数据每一行向量的范数
apply(spe.hel,1,vec.norm)
这个转化也称为"Hellinger转化",如果用欧式距离函数去计算Hellinger转化后的数据,将获得Hellinger距离矩阵(见之后推文)。
在PCA和RDA及K-均一值划分分析前需要对数据进行Hellinger转化。
注意:Hellinger转化等同于数据先开方后再进行弦转化。
卡方转化
### 行和列同时标准化
#卡方转化
spe.chi <- decostand(spe,"chi.square")
spe.chi[1:5,2:4]
#请观察没有物种的样方8转化将会怎么样
spe.chi[7:9,]
#注意decostand函数对0/0运算获得结果是0,而不是NaN
如果用欧氏距离函数去计算卡方转化后的数据,将获得卡方距离矩阵
wisconsin标准化
多度数据首先除以该物种最大值后再除以该样方总和
#wisconsin标准化:多度数据首先除以该物种最大值后再除以该样方总和
spe.wis <- wisconsin(spe)
spe.wis[1:5,2:4]
#常见种(石泥鳅stone loach第四个物种)转化后的多度箱线图
par(mfrow=c(2,2))
boxplot(spe$Babl,sqrt(spe$Babl),log1p(spe$Babl),
las=1,main="简单转化",
names=c("原始数据","sqrt","log"),
col="bisque")
boxplot(spe.scal$Babl,spe.relsp$Babl,
las=1,main="物种标准化",
names=c("max","total"),
col="lightgreen")
boxplot(spe.hel$Babl,spe.rel$Babl,spe.norm$Babl,
las=1,main="样方标准化",
names=c("Hellinger","toatl","norm"),
col="lightblue")
boxplot(spe.chi$Babl,spe.wis$Babl,
las=1,main="双标准化",
names = c("Chi-square", "Wisconsin"),
col = "orange")
比较多度数据转化和标准化前后的数据分布范围和分布情况
若要展示物种多度数据转化或标准化前后的变化,也可以绘制物种沿河流的多度分布图
这里绘制物种从河流上游到下游分布图
#比较多度数据转化和标准化前后的数据分布范围和分布情况
#绘制物种从河流上游到下游分布图
par(mfrow = c(2, 2))
plot(env$dfs,
spe$Satr,
type = "l",
col = 4,
main = "原始数据",
xlab = "离源头距离 [km]",
ylab = "原始多度"
)
lines(env$dfs, spe$Thth, col = 3)
lines(env$dfs, spe$Baba, col = "orange")
lines(env$dfs, spe$Abbr, col = 2)
lines(env$dfs, spe$Babl, col = 1, lty = "dotted")
plot(env$dfs,
spe.scal$Satr,
type = "l",
col = 4,
main = "除以最大值后物种多度",
xlab = "离源头距离 [km]",
ylab = "归一化多度"
)
lines(env$dfs, spe.scal$Thth, col = 3)
lines(env$dfs, spe.scal$Baba, col = "orange")
lines(env$dfs, spe.scal$Abbr, col = 2)
lines(env$dfs, spe.scal$Babl, col = 1, lty = "dotted")
plot(env$dfs,
spe.hel$Satr,
type = "l",
col = 4,
main = "Hellinger-转化多度",
xlab = "离源头距离 [km]",
ylab = "标准化后多度"
)
lines(env$dfs, spe.hel$Thth, col = 3)
lines(env$dfs, spe.hel$Baba, col = "orange")
lines(env$dfs, spe.hel$Abbr, col = 2)
lines(env$dfs, spe.hel$Babl, col = 1, lty = "dotted")
plot(env$dfs,
spe.chi$Satr,
type = "l",
col = 4,
main = "卡方转化多度",
xlab = "离源头距离 [km]",
ylab = "标准化后多度"
)
lines(env$dfs, spe.chi$Thth, col = 3)
lines(env$dfs, spe.chi$Baba, col = "orange")
lines(env$dfs, spe.chi$Abbr, col = 2)
lines(env$dfs, spe.chi$Babl, col = 1, lty = "dotted")
legend("topright",
c("Brown trout", "Grayling", "Barbel", "Common bream",
"Stone loach"),
col = c(4, 3, "orange", 2, 1),
lty = c(rep(1, 4), 3)
)
比较这些图,并且解释他们的不同
在某些情况下(通常是植被研究),使用多度的等级来代表特别的属性:个体数量(多度等级)、盖度(优势程度)或者两者兼而有之(例如Braun-Blanquet 多度优势等级)。这些等级数据即是顺序数据,同时也是随意的数据,这样的数据不容易进行简单的转化。在这种情况下,必须根据手头的原始数据来将等级数据还原为多度数据。
对于离散等级数据可以通过labdsv包的函数vegtrans()来进行数据转换。
例如,假如我们要将鱼类多度等级数据(在我们的spe数据从0到5的等级数据)转为平均个体数,我们可以通过提供两个向量来实现,一个是当前等级数,一个是转换等级。
注意:这个转化对于具有物种特异性多度鱼类数据集来说没有意义。
#使用任意的等级数据来对物种数据进行原始转化
current <- c(0, 1, 2, 3, 4, 5)
converted <- c(0, 1 ,5, 10, 20, 50)
spe.conv <- abundtrans(spe, current, converted)
这最后一部分不是很重要,最重要的就是前面的标准化和中心化的处理方法。《数量生态学:R语言的应用》的第二章到这里就全部结束了。
感谢你的阅读,如有错误之处请联系小蘑菇,欢迎你的批评指正!!!
有兴趣的可以关注微信公号:fafu 生信小蘑菇
请期待下一期内容。