写在前面的题外话:目前已经进入本书的第三章的学习。这对于统计学知识薄弱的我来说,已经略显吃力了···后面也许会难度提升,且抱着打怪升级般激动并忐忑的心情继续前进,希望能够坚持以预想的方式把这本书吃完。Keep moving~
首先,关联测度其目的是量化对象对或变量对之间的关系。
比较对象对的分析称为Q模式,比较变量对的分析称为R模式。
Q模式中,关联测度是对象之间的相异或相似,例如欧氏距离、Jaccard相似系数。R模式中,关联测度是变量之间的依赖性测度,例如协方差或相关系数。
Q模式下对称或非对称的系数下的双零问题:
这里的对称是指对象n1与对象n2之间的系数与n2与n1之间的系数是相同的。
双零问题应该注意的是零值是否具有明确的意义。比如在物种多度矩阵中的零值,一个物种在两个样方内同时缺失,其原因可能是完全不同的。它可能是该样方不适合该物种生存,也可能是暂时未扩散,或者是没有被监测出来等原因。所以在这时,物种的存在信息比物种缺失的信息有更明确的意义。
在进行关联测度分析前,需要明确以下几个问题:
1、是比较对象(Q模式分析)还是比较变量(R模式分析)?
2、是处理物种数据(通常是非对称系数)还是其他类型的变量(对称系数)?
3、数据是二元(二元系数)还是定量(数量系数)?还是这两种类型的混合?或者其他类型数据(序数,特殊的系数)?
Q模式:计算对象之间的相异矩阵
用到的R包有stats(自带的)、vegan、ade4、adespatial、cluster和FD。
在R里,所有的相似测度方阵可以转化为相异测度矩阵,距离方阵对角线的值均为0。并且默认所有关联测度均是相异测度。
定量的物种数据通常需要使用非对称的距离矩阵。
百分数差异(Bray-Curtis)相异矩阵:可以直接由原始数据计算。
弦(chord)距离:实际是指先将样方向量的范数标准化后再计算样方对的欧氏距离。
Hellinger距离:是多度值先除以样方多度总和再取平方根后计算的欧氏距离。可以减少较大多度值的权重。
定量的物种数据的代码运行:
先加载所要用到的安装包,以及函数“coldiss”、“panelutils”和数据Doubs。
在进行相异矩阵分析前,剔除无物种数据的样方。
原始数据的百分数差异(Bray-Curtis)相异矩阵:spe.db <- vegdist(spe)
对数转化后物种数据的Bray-Curtis相异矩阵:spe.dbln <- vegdist(log1p(spe))
这里使用log1p实际是相当于log(1+x),可以适用于|x|<<1。
弦(chord)距离矩阵:spe.dc <- dist.ldc(spe, “chord”)
如果是用vegan包计算:spe.norm <- decostand(spe, “nor”)
spe.dc <- dist(spe.norm)
Hellinger距离矩阵:spe.dh <- dist.ldc(spe) (函数默认)
如果是用vegan包计算:spe.hel <- decostand(spe, “hel”)
spe.dh <- dist(spe.hel)
对数转化后弦距离矩阵:spe.logchord <- dist.ldc(spe, “log.chord”)
如果是用vegan包计算:spe.ln <- log1p(spe)
spe.ln.norm <- decostand(spe.ln, “nor”)
spe.logchord <- dist (spe.ln.norm)
Q模式:二元(有-无)物种数据
数据为0-1模式,若是把定量数据转化为二元数据,则将所有大于0的值全部变为1。这里主要介绍了Jaccard系数和Sorensen系数以及Ochiai系数。两者的区别是,Jaccard系数是两个样方共有系数除以两个样方所含的全部物种数。Sorensen系数是给予两个样方共有物种数双倍的权重,其反数等价于基于物种有无数据计算的百分数差异相异系数。Ochiai系数与弦距离、Hellinger距离和对数弦距离都有关系。即弦转化、Hellinger转化和对数弦转化对物种有无的数据均有意义。
代码运行:
Jaccard相异矩阵:spe.dj <- vegdist (spe, “jac”, binary =TRUE)
或者用dist函数:spe.dj2 <- dist (spe, “binary”)
或用dist.binary函数:spe.dj3 <- dist.binary(spe, method = 1)
Sorensen 相异矩阵:spe.ds <- dist.ldc(spe, “Sorensen”)
或:spe.ds2 <- vegdist(spe, method = “bray”, binary = TRUE)
或:spe.ds3 <- dist.binary(spe, method = 5)
Ochiai 相异矩阵:spe.och <- dist.ldc(spe, “ochiai”)
或:spe.och <- dist.binary(spe, method = 7)
(所有的二元距离函数在计算系数时,会自动对数据进行二元转化。Vegdist函数的binary参数设置为TRUE即可。)
关联矩阵一般只是作为中间实体,所以下面使用coldiss()函数进行可视化。
coldiss()函数的使用说明:coldiss(D = dist.object, nc =4, byrank =TRUE, diag = FALSE)
D为相异矩阵,nc为颜色种类数量,byrank为分级:TRUE为等大小分级,每个颜色所包含的值的数量一样多。FALSE为等区间分级,每个颜色所包含的值的区间一样长。diag表示样方号的位置。TRUE表示在矩阵对角线上。
基于原始鱼类多度数据的百分数差异相异矩阵:coldiss(spe.db, byrank = FALSE, diag = TRUE)
基于对数转化数据的百分数差异相异矩阵:coldiss(spe.dbln,byrank = FALSE, diag = TRUE)
弦距离矩阵:coldiss(spe.dc, byrank = FALSE, diag =TRUE)
Hellinger距离矩阵:coldiss(spe.dh, byrank = FALSE, diag = TRUE)
对数转化后的弦距离矩阵:coldiss(spe.logchord,byrank = FALSE, diag = TRUE)
Jaccard相异矩阵:coldiss(spe.dj, byrank = FALSE, diag = TRUE)
简单匹配相异系数:coldiss(spe.s1 ^ 2, byrank = FALSE, diag =TRUE)
Q模式:定量数据(除物种多度数据外的数据)
对于双零有明确解释的定量数据,欧氏距离是对称距离测度的最佳选择。欧氏距离的值没有上限,但受每个变量量纲的强烈影响。因此一般要求原始数据具有相同的量纲。如果赋予不同量纲的变量相同的权重,需要使用标准化后的数据。
可视化运行:
标准化后计算的欧氏距离矩阵:env.de <- dist(scale(env2))
coldiss(env.de, nc= 16, diag = TRUE) ##nc = 16为等数量的分级
物种数据的Hellinger距离矩阵:coldiss (spe.dh,nc = 16, diag = TRUE)
基于二维空间坐标的欧氏距离矩阵:spa.de <-dist(spa)
coldiss(spa.de, nc= 16, diag = TRUE)
基于一维dfs变量的欧氏距离矩阵:
dfs.df <- as.data.frame(env$dfs, row.names = rownames(env))
riv.de <- dist(dfs.df)
coldiss(riv.de, nc= 16, diag = TRUE)
Q模式:二元数据(除物种有-无数据外的数据)
对于二元数据,最简单的对称相似测度是“简单匹配系数S1”。
随机生成数据进行练习:
10个1和20个0,顺序随机:var1 <- sample(c(rep(1, 10), rep(0,20)))
15个0在一起,15个1在一起:var2 <- c(rep(0, 15), rep(1, 15))
3个1,3个0交替出现:var3 <- rep(c(1, 1, 1, 0, 0, 0), 5)
5个1,10个0交替出现:var4 <- rep(c(rep(1, 5), rep(0, 10)), 2)
前16个是7个1,和9个0的随机排列,接着是4个0和10个1:
var5.1 <-sample(c(rep(1, 7), rep(0, 9)))
var5.2 <-c(rep(0, 4), rep(1, 10))
var5 <-c(var5.1, var5.2)
5个变量合成一个数据框:(dat <- data.frame(var1, var2, var3,var4, var5))
简单匹配系数的计算:dat.s1 <- dist.binary(dat, method = 2)
coldiss(dat.s1,diag = TRUE)
R模式:计算变量之间的依赖矩阵
1、R模式:物种多度数据
除了相关系数,在Q模式中用到的卡方距离同样也适用于Q模式的转置矩阵(即R模式)。
spe.t <- t(spe)
spe.t.chi <- decostand(spe.t,"chi.square")
spe.t.D16 <- dist(spe.t.chi)
coldiss(spe.t.D16, diag = TRUE)
2、R模式:物种有-无数据
鱼类有-无数据的Jaccard指数:
spe.t.S7 <- vegdist(spe.t,"jaccard", binary = TRUE)
coldiss(spe.t.S7, diag = TRUE)
3、R模式:定量和序数数据(除物种多度外的数据)
对于相同量纲的定量变量而言,协方差和Pearson相关系数都是不错的选择。但是因为它们都是线性模型,所以当变量之间是单调但非线性关系时效果将变得不好。对于不同量纲的变量,Pearson相关系数r比协方差更合适,因为r实际上是标准化后的协方差。序数变量对或单调但非线性关系定量变量对的比较可以采用秩相关系数。
环境变量之间的Pearson线性相关系数r:
env.pearson <- cor(env) # default method = "pearson"
round(env.pearson, 2)
绘图前重新排位变量:env.o <- order.single(env.pearson)
pairs(
env[, env.o],
lower.panel = panel.smooth,
upper.panel = panel.cor,
diag.panel = panel.hist,
main = "Pearson Correlation Matrix"
)
秩相关:env.ken <- cor(env, method ="kendall")
env.o <- order.single(env.ken)
4、R模式:二元数据(除物种多度外的数据)
比较成对的二元变量最简单的方式是计算Pearson相关系数。
物种数据的非对称的关联测度可以通过两个步骤获得:首先对原始数据进行转化,然后计算欧氏距离。
附代码及笔记链接,需要自取。
链接:https://pan.baidu.com/s/1udkF1kgW3k59CpL6fI19-Q
提取码:ie9a
网友评论