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

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

数据转化的目的:

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

请期待下一期内容。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容