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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/624138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为网络设备 通过路由器子接口 Dot1q终结子接口实现跨VLAN通信

(二层交换机直接跳过三层交换价接入路由器时才使用该配置。推荐使用三层交换机建立VLANIF配置更简洁明了。如果VLAN较少可直接配置&#xff1b;路由器接口&#xff0c;一个物理接口一个VLAN) S1配置 vlan batch 2 to 3interface GigabitEthernet0/0/1port link-type trunkpor…

为什么代码里需要try/catch

throw 语句用来抛出一个用户自定义的异常,在抛出错误时&#xff0c;throw 之后的语句将不会执行 const getApi (data) > {if (isNaN(data)) {throw new Error(Parameter is not a number!);console.log(bar) // 这句永远不会执行&#xff0c;throw之后的代码都不会}}情况一…

[Python练习]使用Python爬虫爬取豆瓣top250的电影的页面源码

1.安装requests第三方库 在终端中输入以下代码&#xff08;直接在cmd命令提示符中&#xff0c;不需要打开Python&#xff09; pip install requests -i https://pypi.douban.com/simple/ 从豆瓣网提供的镜像网站下载requests第三方库 pip install requests 是从国外网站下…

喜报 ,思迈特荣获广东省“专精特新”企业认定,再创新高

近日&#xff0c;广东省工业和信息化厅发布 2023年专精特新中小企业名单&#xff0c;思迈特软件凭借专业技术实力、创新研发能力、行业影响力以及卓越的企业文化&#xff0c;经过层层选拔&#xff0c;荣获广东省“专精特新”企业认定。思迈特商业智能与大数据分析软件成功上架&…

智能制造工业互联网建设方案——青创智通工业物联网

智能制造已经成为工业发展的重要趋势。智能制造系统架构与工业物联网建设方案作为实现智能制造的关键环节&#xff0c;对于推动工业转型升级和提升企业竞争力具有重要意义。青创智通工业物联网重点探讨智能制造系统架构与工业物联网建设方案的核心要素、实施步骤和未来发展方向…

MySQL进阶篇(六)InnoDB 引擎

一、逻辑存储结构 &#xff08;1&#xff09;表空间 表空间是 InnoDB 存储引擎逻辑结构的最高层&#xff0c; 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) &#xff0c;则每张表都会有一个表空间&#xff08;xxx.ibd&#xff09;&#xff0c;一个 mysql 实…

可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上

OpenCV能够处理图像、视频、深度图像等各种类型的视觉数据&#xff0c;在某些情况下&#xff0c;尽管OpenCV可以显示窗口&#xff0c;但PyQt5可能更适合用于创建复杂的交互式应用程序&#xff0c;而自带GPU的H618就成为了这些图像显示的最佳载体。 这里分享一个代码&#xff0…

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz~10KHz转0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

云联接:揭开SD-WAN神秘面纱,颠覆你对网络的认知!

云联接&#xff08;Cloud Connect&#xff09;源于软件定义广域网&#xff08;SD-WAN&#xff09;。 软件定义广域网由于技术应用性强&#xff0c;近年来从一个由软件定义网络&#xff08;SDN&#xff09;部分衍生的分支概念发展为大规模普适的实践技术&#xff0c;已成为建立…

Detection-friendly dehazing: object detection in real-world hazy scenes

Detection-friendly dehazing: object detection in real-world hazy scenes 摘要 提出了一种联合架构BAD-Net&#xff0c;将去雾模块和检测模块连接成一个端到端的方法。另外&#xff0c;设计了了两个分支结构&#xff0c;用注意力融合模块来充分结合有雾和去雾特征&#xf…

bilibi分类id的秘密

问题 今天想通过rss来阅读bilibili的相关信息&#xff0c;但是如何获取排行榜的分类呢&#xff1f;研究了一下。 办法 浏览器最喜欢的F12&#xff0c;过滤关键才v2?rid,后面的数字就是分类id。 rss获取路径 [最后的数字是0&#xff0c;是所有投稿&#xff0c;数字是1的话是…

陪诊小程序开发|陪诊软件定制|陪诊系统成品功能包含哪些?

陪诊小程序是一种便捷的工具&#xff0c;为用户提供一系列服务和功能&#xff0c;方便患者在就医过程中获得更好的体验和效果。接下来我们将介绍几个主要的陪诊小程序功能。 陪诊小程序开发功能&#xff1a; 一、预约挂号功能。陪诊小程序能够连接用户和医疗机构的系统&#x…

10万字200道软件测试经典面试总结(附答案)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;获取《110万字200道软件测试经典面试总结&#xff08;附答案&#xff09;》pdf&#xff0c;背题更方便&#xff0c;一文在手&#xff…

python系列28:fastapi部署应用

1. 介绍与安装 FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;类似flask&#xff0c;Django&#xff0c;webpy 在部署时可能需要用到下面的库&#xff1a; Uvicorn 或者 Hypercorn负责ASGI 服务器。 Starlette 负责 web 部分…

df 计算同一列时间差(差分pandas.diff())

df pd.DataFrame({a: [1, 2, 3, 4, 5, 6],b: [1, 1, 2, 3, 5, 8],c: [1, 4, 9, 16, 25, 36]}) df.diff()# 计算某一列差值 df.c.diff(1)https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.diff.html

C语言多线程基础(pthread)

1.线程和进程的概念 线程&#xff1a;进程中的一个实体&#xff0c;是CPU调度和分派的基本单位。可以与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程&#xff0c;同一进程中的多个线程之间可以并发执行&#xff0c;线程在运行中呈现间断…

Python 将列表数据写入文件(txt, csv,excel)

写入txt文件 def text_save(filename, data):#filename为写入txt文件的路径&#xff0c;data为要写入数据列表. file open(filename,a) for i in range(len(data)): s str(data[i]).replace([,).replace(],)#去除[],这两行按数据不同&#xff0c;可以选择 s s.replace(&quo…

NVS入门(基于ESP-IDF)

主要参考资料&#xff1a; B站Up主 孤独的二进制《ESP32 存储篇 NVS 非易失性存储库》 ESP-IDF开发指南>API参考>非易失性存储: https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-reference/storage/nvs_flash.html 目录 概述NVS使用&#xff08;以W…

一键制作底片效果,让视频复古感倍增!

你是否厌倦了千篇一律的视频效果&#xff0c;想要尝试一些与众不同的视觉体验&#xff1f;是否想要让你的视频散发出一种复古、怀旧的气息&#xff1f;现在&#xff0c;有了我们的底片效果制作工具&#xff0c;这些愿望全部实现 首先第一步&#xff0c;我们要进入视频剪辑高手…

16.Linux基本使用和程序部署

文章目录 1.Linux 背景知识1.1Linux 是什么1.2Linux 发行版1.3关于 Linux 我们学习什么 2.Linux 环境搭建2.1环境搭建方式2.2使用云服务器2.3使用终端软件连接到 Linux2.3.1什么是终端软件2.3.2下载安装 XShell2.3.3使用 XShell 登陆主机 3.Linux 常用命令3.1 ls3.2 pwd3.3 cd3…