数量生态学笔记||数据探索

上节课数量生态学笔记||绪论我们简单了解《数量生态学》的基本内容,特别介绍了书中用到的数据集Doubs、甲螨数据集。关于R并未做过多的介绍,因为这是一本生态学的书。但是关于学习方法我推荐一种卡片学习法

将知识点整理在一个小的可用随身携带的卡片上,可以随时翻阅,可以建立链接。也就是学习就像拼图,在整理、记忆、链接中形成自己的知识树。

上节课的卡片其实就是开始的那张导图,我鼓励制作自己的学习卡片(手写)。可以包括生态学知识点,R函数,并不是为了记忆而是为了联系。没用存量谈不上体系。

今天我们来学习书中的第二章:探索性数据分析。

在我们提到数据分析的时候还脑海里闪现的往往是简洁的报表、漂亮的数据图,再不济也会联想到假设检验(Hypothesis Testing)和建模(modeliling)。然而,数据采集完之后,数据表整理好之后,我要做的第一步并不是去做复杂的统计分析。而是要做一些统计来了解数据的概况,对数据有一个大致的认识。用这认识去指导我们后面的分析实践,这就是数据探索。如SPSS中就有一个菜单叫做描述统计。本章基本上也是属于这个范畴。

数据概况

首先我们载入数据:

rm(list=ls())
setwd("D:\\Users\\Administrator\\Desktop\\RStudio\\数量生态学\\Run")

#导入物种多度数据
spe<-read.csv("../DATA/DoubsSpe.csv",row.names = 1)
str(spe)
#导入环境数据
env<-read.csv("../DATA/DoubsEnv.csv",row.names = 1)
#导入空间坐标数据
spa<-read.csv("../DATA/DoubsSpa.csv",row.names = 1)

我们对物种群落数据做一个简单的描述统计,同时也是看看我们的和数据格式是否正常。


# 基础函数
# ********
spe #在控制台显示整个数据框的内容,但对于大样本的数据框
#并不建议直接显示
spe[1:5,1:10]      #只展示前5行和前10列
head(spe)           #只展示前几行
nrow(spe)           #提取数据框总行数
ncol(spe)           #提取数据框总列数
dim(spe)            #提取数据框的维度(显示数据框多少行,多少列)
colnames(spe)       #提取列名,在这里是物种名
rownames(spe)       #提取行名,在这里一行代表一个样方
summary(spe)         #以列为单位,对列变量进行描述性统计
#比较多度的中位值和平均值。大部分是对称分布吗?

如果多度分布是对称的,中位数应该和平均值差别不大。大家看这里的数据,显然多数数据并不是对称的。

# 多度数据总体分布情况
# *******************
# 整个多度数据值的范围
range(spe)
# 计算每种多度值的数量
ab <- table(unlist(spe))
ab
# 所有种混和在一起的多度分布柱状图
barplot(ab, las=1, xlab="多度等级", ylab="频度", col=gray(5:0/5))
# 多度数据中0值的数量
sum(spe==0)
# 多度数据中0值所占比例
sum(spe==0) / (nrow(spe)*ncol(spe))
#请观察多度频率分布柱状图,如何解读为什么0值(缺失)在数据框内频
#率这么高?

其实造成缺失的因素有很多,但是有两种需要我们的注意:

  • 真实的环境适合这个物种生存,只是我们采样的时候没采到(比如人家冬眠了,出去玩了,尚未迁徙到这里)。
  • 真实的环境不适合这个物种生存,在这里生存就会被淘汰。

所以对于零值我们要小心处理,关键还是理解数据的生物学意义。

样方的分布

数据探索也是也个数据和模型相互磨合的过程,不仅看用来描述我们实验本身的数据,也可以用来描述实验设计。

 样方位置地图
# **************
# 生成空的绘图窗口(横纵坐标轴比例1:1,带标题)
# 从spa数据框获取地理坐标x和y
plot(spa, asp=1, type="n", main="样方位置",
     xlab="x坐标 (km)", ylab="y坐标 (km)")
# 加一条连接各个样方点的蓝色线(代表Doubs河)
lines(spa, col="light blue")
# 添加每个样方的编号
text(spa, row.names(spa), cex=0.8, col="red")
# 添加文本
text(70, 10, "上游", cex=1.2, col="red")
text(20, 120, "下游", cex=1.2, col="red")

30g个样方沿着Doubs河的空间分布。绘制这幅图用到的plot函数是R的基础绘图函数。可以?plot()查看其帮助文档,asp是用来调整绘图版面的长宽比列的。


下面我们把物种数据映射到采样点之上,看看物种是怎样随着河流变化的。


#某些鱼类的分布地图
# ******************
# 将绘图窗口分割为4个绘图区域,每行两个
par(mfrow=c(2,2))
plot(spa, asp=1, col="brown", cex=spe$TRU, main="褐鳟",
     xlab="x坐标 (km)", ylab="y坐标 (km)")
lines(spa, col="light blue")
plot(spa, asp=1, col="brown", cex=spe$OMB, main="茴鱼",
     xlab="x坐标 (km)", ylab="y坐标 (km)")
lines(spa, col="light blue")
plot(spa, asp=1, col="brown", cex=spe$BAR, main="鲃鱼",
     xlab="x坐标 (km)", ylab="y坐标 (km)")
lines(spa, col="light blue")
plot(spa, asp=1, col="brown", cex=spe$BCO, main="欧鳊",
     xlab="x坐标 (km)", ylab="y坐标 (km)")
lines(spa, col="light blue")
#观察所生成的4张图,你就会明白为什么Verneaux 选择这4种鱼类作为不同区域的生态指示种,看了后面将要展示的环境因子空间分布情况会更清楚。

从这个图上我们清楚地看到,褐鳟、茴鱼、鲃鱼、欧鳊的多度是沿着Doubs河从上游到下游分布的,也就明白为什么Verneaux 选择这4种鱼类作为不同区域的生态指示种。注意之前提到的零值问题,这里是同一条河流不会有迁移的障碍,这几种鱼的生活史也较接近不存在有冬眠的不一致的情况。

另一个引起我们注意的就是plot()函数的参数cex的用法,它的作用是定义数据点标识的大小。提问,为什么这个标识是圆形的而不是其他的呢?可以调吗?

每个物种在多少样方中出现?,我们可以看看物种的相对频度。

# 比较物种频度
# **************
# 计算每个物种出现的样方数
#按列进行计数,因此函数apply()第二个参数MARGIN应该设定为2
spe.pres <- apply(spe > 0, 2, sum)
# 按照升序的方式重新排列结果
sort(spe.pres)
# 计算频度百分比
spe.relf <- 100*spe.pres/nrow(spe)
round(sort(spe.relf), 1)    # 设置排列结果为1位小数
#绘柱状图
par(mfrow=c(1,2))       # 将绘图窗口垂直一分为二
hist(spe.pres, main="物种出现数", right=FALSE, las=1,
     xlab="出现数", ylab="物种数量",
     breaks=seq(0,30,by=5), col="bisque")
hist(spe.relf, main="物种相对频度", right=FALSE, las=1,
     xlab="出现率(%)", ylab="物种数量",
     breaks=seq(0, 100, by=10), col="bisque")

我问,这两个图的纵轴都是“物种数量”为什么最大值还不一样呢?频度图让我们了解每个物种存在于多少个样方内。接下来我们看看每个样方内存在多少物种(物种的丰度)。思考频度与丰度的差异。主义apply函数的应用,apply函数家族在R中应用很普遍。

# 样方比较:物种丰富度
# ********************
# 计算每个样方内物种数
# 以行汇总,apply()函数第二个参数MARGIN应该设定为1
sit.pres <- apply(spe > 0, 1, sum)
#按照升序的方式重新排列结果
sort(sit.pres)
par(mfrow=c(1,2))   #将绘图窗口垂直一分为二
# 绘制样方沿着河流的分布位置和所含物种丰富度
plot(sit.pres,type="s", las=1, col="gray",
     main="物种丰富度-上下游的梯度",
     xlab="样方沿着河流的位置", ylab="物种丰富度")
text(sit.pres, row.names(spe), cex=.8, col="red")
# 使用地理坐标绘制气泡地图
plot(spa, asp=1, main="物种丰富度地图", pch=21, col="white",
     bg="brown", cex=5*sit.pres/max(sit.pres), xlab="x坐标 (km)",
     ylab="y坐标 (km)")
lines(spa, col="light blue")
#你能否辨析沿着河流哪里是物种丰富度的热点地区?

我们可以清楚地看出沿河流物种的整体分布。

最后我们用vegan包中的diversity()函数计算生物多样性指数。

#计算生物多样性指数
# *****************
# 载入所需要的vegan程序包
library(vegan) # 如果未载入,需要执行这一步
#访问diversity() 帮助界面
?diversity
N0 <- rowSums(spe > 0)               #物种丰富度
H <- diversity(spe)                    # Shannon熵指数
N1 <- exp(H)                        # Shannon 多样性指数
N2 <- diversity(spe, "inv")              # Simpson多样性指数
J <- H/log(N0)                          # Pielou 均匀度
E1 <- N1/N0                            # Shannon均匀度 (Hill比率)
E2 <- N2/N0                            # Simpson均匀度 (Hill比率)
div <- data.frame(N0, H, N1, N2, E1, E2, J)
div

大家看到在计算的结果中,第8个样方几个指数出现了inf看看原始数据spe的第8个样方有什么规律,说出为什么会出现INF。

环境数据

现在我们已经对物种数据有了基本的了解,下面我们看一下环境数据。

# 部分环境变量的气泡地图
# *******************************************
par(mfrow=c(2,2))
plot(spa, asp=1, main="海拔", pch=21, col="white", bg="red",
     cex=5*env$alt/max(env$alt), xlab="x", ylab="y")
lines(spa, col="light blue")
plot(spa, asp=1, main="流量", pch=21, col="white", bg="blue",
     cex=5*env$deb/max(env$deb), xlab="x", ylab="y")
lines(spa, col="light blue")
plot(spa, asp=1, main="氧含量", pch=21, col="white", bg="green3",
     cex=5*env$oxy/max(env$oxy), xlab="x", ylab="y")
lines(spa, col="light blue")
plot(spa, asp=1, main="硝酸盐浓度", pch=21, col="white", bg="brown",
     cex=5*env$nit/max(env$nit), xlab="x", ylab="y")
lines(spa, col="light blue")
#哪幅图最能展示上下游的梯度?如何解释其他环境变量的空间分布格局?

我们可以说是海拔反映了环境变量的梯度。流量和海拔都好解释,想一下含氧量和硝酸盐浓度只靠这几张图能解释吗?在(150,200)处的硝酸盐浓度很高而氧含量很低,为什么?

环境变量量沿河流分布情况。

#线条图
# *****
par(mfrow=c(2,2))
plot(env$das, env$alt, type="l", xlab="离源头距离 (km)",
     ylab="海拔 (m)", col="red", main="海拔")
plot(env$das, env$deb, type="l", xlab="离源头距离 (km)",
     ylab="流量 (m3/s)", col="blue", main="流量")
plot(env$das, env$oxy, type="l", xlab="离源头距离 (km)",
     ylab="氧含量 (mg/L)", col="green3", main="氧含量")
plot(env$das, env$nit, type="l", xlab="离源头距离 (km)",
     ylab="硝酸盐浓度 (mg/L)", col="brown", main="硝酸盐浓度")

如果要了解任意任意两个环境变量之间的关系,我们可以使用强大的矩阵散点图绘制函数pairs().

# 所有变量对之间的二维散点图
# **************************
#载入自编的函数R脚本
source("panelutils.R")  # panelutils.R脚本文件必须与当前R工作空间在同一文件
#夹下
# 带频度分布的柱状图和光滑拟合曲线的双变量散点图
op <- par(mfrow=c(1,1), pty="s")
pairs(env, panel=panel.smooth, diag.panel=panel.hist,
      main="双变量散点图(带频度分布图和平滑曲线)")
par(op)
#从柱状图能否看出哪些变量符合正态分布?
#需要注意的是,对于回归分析和典范排序,并没有要求解释变量符合正态
#分布。是否有很多散点图显示出变量之间的线性关系或至少是单调关系?

简单的转化可以改善某些变量的数据分布,另外变量之间的刚量不同很多分析要将其标准化。

# 某个环境变量简单转化
# ********************
range(env$pen)
# 坡度变量对数转化(y = ln(x))
# 比较转化前后数值的柱状图和箱线图
par(mfrow=c(2,2))
hist(env$pen, col="bisque", right=FALSE, main="坡度频度分布图",ylab="频度",xlab="坡度")
hist(log(env$pen), col="light green", right=F, main="对数化坡度频度分布图",ylab="频度",xlab="对数化坡度")
boxplot(env$pen, col="bisque", main="坡度箱线图", ylab="坡度")
boxplot(log(env$pen), col="light green", main="对数化坡度箱线图",
        ylab="对数化坡度")

# 所有环境变量的标准化
# *********************
# 中心化和标准化=标准化变量 (z-scores)
env.z <- decostand(env, "standardize")
apply(env.z, 2, mean)   # 平均值 = 0
apply(env.z, 2, sd)     # 标准差 = 1
# 使用scale()函数也可以运行相同的标准化(输出的是矩阵)
env.z <- as.data.frame(scale(env))

探索性数据分析|百科
卡片学习法
学习卡片大法
Detailed Table

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

推荐阅读更多精彩内容