统计分析与数据挖掘生命科学-简书专题数据科学与R语言

《数量生态学:R语言的应用》第二版阅读笔记2

2021-04-22  本文已影响0人  fafu生信小蘑菇

第二章-第二部分-生态数据转换

数据转化的目的:

对于我们的物种数据,通常具有相同的刚量,通常是正值和零,对这样的数据几种简单的转化函数,可以降低极大值的影响:

  • 平方根转化: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")
标准化.png

比较多度数据转化和标准化前后的数据分布范围和分布情况

若要展示物种多度数据转化或标准化前后的变化,也可以绘制物种沿河流的多度分布图

这里绘制物种从河流上游到下游分布图

#比较多度数据转化和标准化前后的数据分布范围和分布情况
#绘制物种从河流上游到下游分布图
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)
)

物种沿着河流分布图比较数据转化和标准化.png

比较这些图,并且解释他们的不同

在某些情况下(通常是植被研究),使用多度的等级来代表特别的属性:个体数量(多度等级)、盖度(优势程度)或者两者兼而有之(例如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 生信小蘑菇

请期待下一期内容。

上一篇下一篇

猜你喜欢

热点阅读