当前位置: 首页 > news >正文

R语言【文章复现】——集成式地绘制高分辨率的多样性分布图,对方法的检验和优化,以及处理思路的思考

参考文献

本文对一篇 2022 年发表在 New Phytologist 的绘图方法文章中的技术路线进行复现。

An integrated high-resolution mapping shows congruent biodiversity patterns of Fagales and Pinales


Summary

文中,作者针对在全球尺度上绘制物种分布图提出了一种全新的方法。该方法整合了 多边形绘图polygon mapping)和 物种分布模型species distribution modellingSDM)。

多边形绘图算法 中,考虑了:

  • 分布距离distances of occurrences) 
  • 分布嵌套nestedness of occurrences

物种分布模型 中,考虑了 :

  • 多重建模算法multiple modelling algorithm
  • 复杂度complexity levels
  • 伪非分布区选择pseudo-absence selections

Materials and Methods

该新方法的整体流程有 5 个步骤:

  1. 数据收集data collection
  2. 数据清洗data cleaning
  3. 参数优化parameter optimization
  4. 集成绘图mapping by integration of SDM and polygons
  5. 地图检验map validating

下面进入正题。


新方法的步骤流程及细节

1. 数据收集与整合(Data collection and merging)

 文中,作者通过手动或R包从48个数据库中获取数据。为了减小因为某些类群的观测数据很少而低估了该类群的分布范围的风险,作者不仅收集了使用文字记录的数据库,还从已存在的分布图上获取分布记录,包括raster、shape甚至是专家手绘的地图最后,所有的分布数据都转换为使用十进制 经/纬度格式 的 EPSG 4326有关EPSG 4326的内容请自己查阅。

那么,实际的情况到底是怎样的呢?我们一起来看脚本  1_get_species_occurences.R

该脚本是作者通过 rgbif BIEN 来收集数据,其中下面两行表示搜集的数据只包含3列内容:物种名Taxon),经度x)和 维度y)。

colnames(GBIFgetAll) <- c("Taxon", "x", "y")colnames(BIENgetAll) <- c("Taxon", "x", "y")

同时,从给出的示例数据集 allGBIFandBIEN_Occurrences.rds 也能看出来:

Taxonx

y

1Pinus halepensis Mill.0.06938.645

2. 数据清洗(Data cleaning)

文中介绍的数据清洗可以分为四个步骤:

  • 首先是针对名称进行的处理,
  • 然后是针对坐标进行的处理,
  • 接着是根据物种原生区进行处理,
  • 最后是根据模型运算要求进行处理。

2.1. 针对数据中名称部分的清洗

根据 Catalogue of Life 对数据中 物种的同源异名(synonymous)、未处理名称(unresolved)、错误拼写(misspelled)或错误名称(wrong)和 错误或缺失的科名 进行标准化、更正或增加。

之后如下处理:

  • 只保留具有标准物种名称的记录
  • 去除所有重复记录
  • 将亚种记录视为种级记录
  • 去除所有杂交种记录

2.2. 针对数据中坐标部分的清洗

为了剔除人工栽培的分布记录和坐标点错误的记录,文中作如下处理:

  • 去除:以国家首都为中心,半径 10km 内的记录。
  • 去除:以国家中心为中心,半径 5km 内的记录。
  • 去除:以多样性研究机构为中心,半径 1km 内的记录。
  • 去除:以GBIF总部为中心,半径 0.5° 内的记录。
  • 去除:以 坐标点 0,0为中心,半径 0.5° 内的记录。

2.3. 根据物种原生区对数据进行清洗

POWO 上获取所有物种的区级原生分布区,在原生分布区的基础上向外延伸 ,如果记录未在范围内则去除。

如果此时某物种的记录有超过 50% 已经被去除,那么就要人工进行检查,确保没有丢弃好数据。

2.4. 根据模型运算要求对数据进行清洗

物种分布记录的不均匀性可能会增加模型运算的不准确性,还可能会增加因为零散分布的记录导致 SDM 出现权重偏差,进而导致低估了物种的分布范围。

因此,针对物种记录数量 >50,去除间距小于 0.1° 的记录。


2.#. 数据清洗的流程重现

作者提供了 2.1_occurrences_nameCorrection_primaryCleaning.R2.2_(optional)_occurrences_deepCleaning.R 两个脚本进行数据清洗。下面笔者将逐行进行分析:

2.#.1. occurrences_nameCorrection_primaryCleaning.R

首先,它要求设置 工作路径wkpath),随即生成数据清洗后的保存路径:

wkpath <- "D:/Work_Space/My-scripts/R/gdplants-main"
setwd(wkpath)name.correct.folder <- "./2.1_name_correction/"
cc.cleaned <- "./2.2_cleaning_cc/cleaning_cc_occurrences/"
cc.cleaned.report <- "./2.2_cleaning_cc/cleaning_cc_report/"
cc.cleaned.detail <- "./2.2_cleaning_cc/cleaning_cc_detail/"

示例使用的数据应该有以下三列"sciName", "x", "y",分别表示原始的物种名经度纬度

occ.all <- readRDS("./example/allGBIFandBIEN_Occurrences.rds")

此时,在 R 的工作环境里应该包含下图中的变量:

数据清洗中需要用到第三方的软件包,脚本中也给出了相应的代码:

options(repos=structure(c(CRAN="https://stat.ethz.ch/CRAN/")))packages <- c("Taxonstand", "CoordinateCleaner", "rgdal", "sp")for (p in packages) {if(!library(package = p, logical.return = TRUE, character.only = TRUE)){install.packages(p)library(package = p, character.only = TRUE)} else {   library(package = p, character.only = TRUE) }
}

注意Taxonstandrgdal 已经在CRAN下架了,官方建议使用 WorldFlorasf/terra 替换。但是仍可在网页上搜索资源进行安装。

加载好软件包后,继续创建输出的保存路径文件夹:

if(!dir.exists(name.correct.folder)) {dir.create(name.correct.folder, recursive = T)}
if(!dir.exists(cc.cleaned)) {dir.create(cc.cleaned, recursive = T)}
if(!dir.exists(cc.cleaned.report)) {dir.create(cc.cleaned.report, recursive = T)}
if(!dir.exists(cc.cleaned.detail)) {dir.create(cc.cleaned.detail, recursive = T)}

这里已经为两个脚本都准备好了文件下,下面就正式进行清洗工作了,让我们一起来梳理脚本的处理思路。


2.#.1.1. 针对数据中名称部分的清洗
spname0 <- as.character(unique(na.omit(occ.all[ ,"Taxon"]$Taxon)))name.correct0 <- TPL(spname0)

首先将采集数据中的 物种名 提取并去重,然后使用 Taxonstand::TPL() 进行物种名匹配。

因为 The Plant List 已经停止提供服务了,所以建议使用 WorldFlora。因为下载速度太慢,笔者使用了 U.Taxonstand

library(U.Taxonstand)
library(openxlsx)
dat1 <- read.xlsx("D:/ALL_Softwares/R-4.2.0/library/U.Taxonstand/Database-main/Plants_WFO_database_20220701/Plants_WFO_database_part1.xlsx")
dat2 <- read.xlsx("D:/ALL_Softwares/R-4.2.0/library/U.Taxonstand/Database-main/Plants_WFO_database_20220701/Plants_WFO_database_part2.xlsx")
dat3 <- read.xlsx("D:/ALL_Softwares/R-4.2.0/library/U.Taxonstand/Database-main/Plants_WFO_database_20220701/Plants_WFO_database_part3.xlsx")
WFO_database <- rbind(dat1, dat2, dat3)
rm(dat1, dat2, dat3)spname0 <- as.character(unique(na.omit(occ.all[ ,"Taxon"]$Taxon)))
# name.correct0 <- TPL(spname0)name.correct0 <- nameMatch(spList = spname0, spSource = WFO_database)
name.correct0['Taxon'] <- paste(name.correct0$Submitted_Name, name.correct0$Submitted_Author)name.correct <- merge(occ.all, name.correct0)

这样,原始数据中就增加了匹配后的名称信息。具体的数据结构请参考R语言实践——U.Taxonstand标准化动植物科学名。

接着挑选出所有匹配到接受名的记录:

name.corrected <- name.correct[which(is.na(name.correct$New_name) | !grepl("Accepted name needs to be determined", name.correct$New_name

相关文章:

  • SpringBoot内嵌Tomcat启动流程
  • 力扣2085-统计出现过一次的公共字符串
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • 竞赛保研 基于深度学的图像修复 图像补全
  • 【Python_PySide6学习笔记(三十一)】基于PySide6实现自定义串口设备连接界面类:可实现串口连接断开、定时发送等功能
  • 入门Docker1: 容器技术的基础
  • 1 快速前端开发
  • 一致性协议浅析
  • 【wow-ts】前端学习笔记Typescript基础语法(一)
  • 显示CPU架构的有关信息 lscpu
  • 数学建模 | 运筹学的 LINGO 软件(附 LINGO代码)
  • 【固态钽表面贴装电容】 MIL-PRF-55365 美军标
  • Windows 系统彻底卸载 SQL Server 通用方法
  • MySQL的安装
  • 利用人工智能和机器人技术实现复杂的自动化任务!
  • Elasticsearch 参考指南(升级前重新索引)
  • Java 多线程编程之:notify 和 wait 用法
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • ionic入门之数据绑定显示-1
  • ​flutter 代码混淆
  • ​queue --- 一个同步的队列类​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • (02)Hive SQL编译成MapReduce任务的过程
  • (09)Hive——CTE 公共表达式
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (二)斐波那契Fabonacci函数
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (强烈推荐)移动端音视频从零到上手(下)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (三)模仿学习-Action数据的模仿
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)VC++中ondraw在什么时候调用的
  • .md即markdown文件的基本常用编写语法
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net 生成二级域名
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .php文件都打不开,打不开php文件怎么办
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • []FET-430SIM508 研究日志 11.3.31
  • [《百万宝贝》观后]To be or not to be?
  • [<事务专题>]
  • [20150707]外部表与rowid.txt
  • [2023-年度总结]凡是过往,皆为序章
  • [APUE]进程关系(下)