美文网首页统计分析与数据挖掘生命科学-简书专题数据科学与R语言
《数量生态学:R语言的应用》第二版阅读笔记2

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

作者: fafu生信小蘑菇 | 来源:发表于2021-04-22 12:09 被阅读0次

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

    数据转化的目的:

    • 使不同物理单位的变量具有可比性(可以利用归一化,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")
    
    标准化.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 生信小蘑菇

    请期待下一期内容。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ifvzlltx.html