写在前面
物种分布模型 (SDMs) 是研究物种分布区域变化的重要工具,尤其在应对气候变化的研究中。megaSDM R包通过整合物种的扩散能力、生成范围变化的时间步长图、处理大型数据集以及采用计算密集型的环境子采样技术,显著提升了时空SDM分析的准确性和效率。该包能够高效地整合多个物种、时间段和气候情景的SDMs,生成独特的地图,展示物种对环境变化的响应。其创新特性包括生成详细的时间步长图,展示物种范围的扩展和收缩,从而揭示物种在不同阶段的动态变化。
同时笔者也对本教程的代码部分进行了详细解释,详看正文欢迎大家批评指正!在“群落生态学”公众号回复“群落生态学”获取中文翻译教程及代码。megaSDM: integrating dispersal and time-step analyses into species distribution models的全文中文翻译欢迎大家关注“分子生态学笔记”公众号,点击“SDM | megaSDM-批量化建模”进行查看。
megaSDM的一个重要特性是将扩散限制集成到物种分布模型中。通过入侵适宜性度量,megaSDM结合了物种的持续生境适宜性和扩散能力,提供了物种在不断变化的环境条件下扩展其分布范围的潜力。这种方法不仅适用于二进制生境适宜性模型,还可以应用于连续模型,使得扩散率的概率影响更加显著。
图1 megaSDM 简化流程图,展示了该包的主要功能及其示例输出。
环境子采样是megaSDM的另一大关键特性。该包优化了减少SDM空间或环境偏差的策略,使其能够对发生点和背景点进行多元环境分层过滤。这种方法有效地减轻了数据中的偏差,提高了模型的准确性。此外,megaSDM实现了并行处理,使其能够高效处理大量数据,提高计算效率,适用于大规模数据分析。
megaSDM的结构和工作流程包含了一系列模块化函数,支持分布数据和GIS数据操作、分布建模及数据分析。用户可以提供自己的物种分布数据、扩散速率数据和背景点,生成生境适宜性模型和二元分布图,并进行扩散限制分析和统计分析。整个工作流程包括环境数据处理、物种分布数据收集和筛选、环境子采样、背景点选择、MaxEnt建模及结果分析。通过这一流程,megaSDM能够生成详细的物种分布图,展示物种范围在不同时间段和气候情景下的变化。
图2 megaSDM中的createTimeMaps()函数生成的输出“时间地图”,详细描述了富兰克林地松鼠(Poliocitellus franklinii)在两种不同气候情景(RCP4.5和RCP8.5;分别来自Riahi等,2011年和Thomson等,2011年)和三个不同时间点(2010年、2050年和2070年)的范围变化。蓝色区域表示扩展区域,红色区域表示收缩区域,紫色/粉红色区域表示在三个时间点之间的暂时波动(例如,从2010年到2050年扩展,然后从2050年到2070年收缩)。黄色区域在整个时间段内始终保持占据状态。右列的地图将范围扩展限制在富兰克林地松鼠的平均扩散速率(1.23公里/年;Schloss等,2012年)。
在输入数据方面,megaSDM至少需要物种名称的矢量数据和覆盖每个时间段的环境栅格层数据。这些数据应涵盖研究区域的地理范围。用户可以使用megaSDM内置的函数下载物种分布数据,或者提供自有的数据。扩散速率数据可以用于分析扩散限制对物种分布的影响,而背景点数据则用于提高模型的准确性。
图3 在RCP 8.5气候情景(Riahi等,2011年)下2070年P. franklinii的连续生境适宜性(0-1),未结合2010年模型分布的扩散(a)和(b)“可入侵适宜性”,通过将扩散概率函数(红色曲线)乘以适宜性数据计算得出,假定自2010年以来的平均扩散速率为1.23公里/年(Schloss等,2012年)。红色曲线近似表示使用伽马分布到达至少给定距离的扩散概率。
图4 图示详细说明了megaSDM中BackgroundPoints()函数生成背景点的不同方法。面板(a)显示了“随机”生成方法,其中10个背景点(黑色叉号)在训练区域(灰色多边形)内随机采样,不考虑出现点的位置(黑色点)。另一种常用的背景点生成技术是“空间限制”方法,在这种方法中,在出现点周围构建缓冲区(b,蓝色多边形),10个背景点仅在缓冲区内采样(b,黑色星号)。“组合”方法(c)在缓冲区内生成一部分背景点(黑色星号),其比例由函数参数决定,其余背景点则从整个研究区域中生成(黑色叉号),提供了一种空间加权方案。
megaSDM的建模过程主要依赖于MaxEnt建模技术,该技术基于最大熵方法和机器学习,能够准确估计栖息地适宜性和物种分布。megaSDM允许用户调整MaxEnt的多个参数,以优化模型性能。此外,该包支持重复和子采样,以确保模型的统计严谨性。模型评估完成后,megaSDM生成的连续和二元分布图展示了物种在不同时间段和气候情景下的分布情况。通过对这些图的分析,用户可以更好地理解物种对环境变化的响应。
此外,megaSDM还提供了详细的统计分析工具。例如,additionalStats函数可以计算二元分布的总体面积、范围面积的变化百分比以及物种分布范围的重心变化。如果提供了扩散率数据,这些分析将更加精确。最后,createRichnessMaps函数可以生成物种丰富度图,展示物种丰富度对时间和气候变化的响应。
图5 由165种北美哺乳动物物种的SDMs生成的物种丰富度地图,分别为2010年(a)和RCP 8.5气候情景下2070年(b-c;Riahi等,2011年)。在(b)中,未考虑扩散能力。在(c)中,范围扩展受到平均扩散速率(公里/年)的限制,扩散速率由Schloss等人(2012年)计算,并考虑了与2010年物种分布的距离。地图(d)显示了应用扩散限制的丰富度地图(b)与未应用扩散速率的地图(c)之间的差异。
总的来说,megaSDM提供了全面的工具集,用于分析物种对气候变化的响应。它适合进阶的SDM用户,通过一系列创新方法提升了SDM的精度和效率。
正文
1.设置
软件包megaSDM 利用 MaxEnt 框架和并行处理技术,高效地创建和投影物种分布模型。用户可以通过 GBIF(全球生物多样性信息设施)下载物种的出现数据,通过对环境数据的二次抽样减少空间偏见,生成背景(伪缺失)点,训练模型,并根据每个物种的扩散速率和中间区域波动将模型投影到不同的时间段。此外,该包还能为每个时间段和分类单元生成物种丰富度图。
本示例展示了 megaSDM 的主要功能,并可作为开展其他 SDM 分析的模板。想要了解更多关于该包的方法、特色及全面的讨论,以及每个函数的详细参数列表,请参阅相关文档和函数说明。
对于首次使用 megaSDM 的用户,该建模工具依赖于 MaxEnt 算法,并通过“maxent.jar”可执行文件进行操作。在首次安装 megaSDM 时,该文件会与软件包一同安装。但如果您是首次运行 MaxEnt 或 megaSDM,您可能需要单独下载“maxent.jar”文件以确保其正常工作。该文件可在以下网址获取:https://github.com/mrmaxent/Maxent或随软件包一起在 https://github.com/brshipley/megaSDM/inst/extdata/ 中找到。
下载并双击“maxent.jar”文件后,如果 maxent.jar 对话框未能加载(MacOS 用户常见),您可能需要先下载并安装 Java 运行时环境,可在 https://www.oracle.com/java/technologies/javase-jre8-downloads.html 找到相关资源,以便运行建模功能。
如果在下载软件包或运行示例时遇到任何问题,建议首先访问 https://github.com/brshipley/megaSDM/README.Md 确保您的包依赖性是最新的。
最后,请将您的工作目录设置为您希望 megaSDM 输出所有文件的位置。这将有助于您更好地组织和管理建模结果。
WD <-"F:/EXAMPLE"
# CHANGE TO OWN WORKING DIRECTORY
# 改变到自己的工作目录
setwd(WD)
2.环境数据管理
2.1训练和学习区域投影/剪裁
物种分布模型中使用了训练区和研究区两个概念。训练区是模型训练的地区,即模型生成的出现点和背景点所在的位置。而研究区则是我们感兴趣的区域,即模型将在其中进行预测并评估当前时段以及未来或过去时段的栖息地适宜性的区域。
功能 TrainStudyEnv 负责为所需的训练和研究区域创建和管理当前时间段的环境栅格数据。首先,我们需要列出将用于裁剪、重新采样和重新投影的环境栅格。在本示例中,训练区的文件存放在 extdata/trainingarea 目录下,该目录随 megaSDM 软件包一起提供。
input_TA <-list.files(system.file("extdata", "trainingarea",package = "megaSDM"),
pattern = ".bil$",
full.names = TRUE)
# If you have your own data, replace the system.file command with
# a pathway to the training area files.
# 如果你有自己的数据,用通往训练区文件的路径替换system.file命令。
接下来,我们定义了变量 envoutput ,这是一个指定位置,用于存放训练和研究区域栅格数据的输出目录(位于工作目录中)。如果该目录不存在,megaSDM 将自动创建一个新的目录。在本示例中,我们希望将环境层的输出存储到名为 “TestRun” 的目录中。
envoutput <-"TestRun"
在这个案例中,我们的训练和研究区域将完全一致,大致对应于美国东南部地区。我们不需要对数据进行重新投影或重新采样,因为栅格数据已处在相同的投影和分辨率下。我们将通过调用此函数并将其结果赋值给列表 TSEnv 来完成这一步骤。这样,这两个栅格数据除了被保存在“TestRun”目录中外,还会存储在 R 环境中,供后续使用。
# Here we define the extent of the training and study regions in c(xmin, xmax, ymin, ymax) form.
# 这里我们以c(xmin, xmax, ymin, ymax)的形式定义训练和研究区域的范围。
TSEnv <-TrainStudyEnv(input_TA = input_TA,
output = envoutput,
clipTrain = c(-91.5, -75, 25.5, 36),
clipStudy = c(-91.5, -75, 25.5, 36))
2.2未来或历史环境适宜性预测
在获取当前时间段的训练和研究环境图层之后,接下来的 PredictEnv 函数将对未来或过去的环境图层进行剪辑、重新采样和重新投影,以确保它们与 TrainStudyEnv 函数创建的研究区域栅格相匹配。
PredictEnv 函数需要一系列未来或历史环境文件。在本示例中,未来的气候层按气候情景分组,再根据年份进行排序。此功能涵盖了两种气候情景(RCP4.5 和 RCP8.5)以及两个未来年份(2050 年和 2070 年)的栅格数据。
Env2050_4.5 <- list.files(system.file("extdata", "predictenv/RCP4.5/2050",package = "megaSDM"),
pattern = ".bil$",
full.names = TRUE)
Env2070_4.5 <- list.files(system.file("extdata", "predictenv/RCP4.5/2070",package = "megaSDM"),
pattern = ".bil$",
full.names = TRUE)
Env4.5 <- list(Env2050_4.5, Env2070_4.5)
# The "time_periods" argument contains the current time (the time of the training
# and study rasters) first and then the time periods for the forecast/hindcast.
# "time_periods "参数首先包含当前时间(训练和研究光栅的时间),然后是预测/倒推的时间段。
PredictEnv(studylayers = TSEnv$study,
futurelayers = Env4.5,
time_periods = c(2010, 2050, 2070),
output = envoutput,
scenario_name = "RCP4.5")
# Repeat with a different climate scenario (RCP8.5):
# 使用不同的气候情景重复操作(RCP8.5):
Env2050_8.5 <- list.files(system.file("extdata", "predictenv/RCP8.5/2050",package = "megaSDM"),
pattern = ".bil$",
full.names = TRUE)
Env2070_8.5 <- list.files(system.file("extdata", "predictenv/RCP8.5/2070",package = "megaSDM"),
pattern = ".bil$",
full.names = TRUE)
Env8.5 <- list(Env2050_8.5, Env2070_8.5)
PredictEnv(studylayers = TSEnv$study,
futurelayers = Env8.5,
time_periods = c(2010, 2050, 2070),
output = envoutput,
scenario_name = "RCP8.5")
这段代码是用于处理和投影环境数据,以支持物种分布模型(SDM)在不同气候情景和时间段下的预测。代码首先通过 list.files 函数从 megaSDM 包的 "extdata" 文件夹中获取特定气候情景和年份(例如 RCP4.5 的 2050 和 2070 年)的环境层文件列表,这些文件以 ".bil" 格式存储。环境数据文件被聚集到列表 Env4.5 中,随后这个列表被用作 PredictEnv 函数的输入,该函数负责将现有的研究区域栅格数据与未来的环境层数据进行匹配和投影。
PredictEnv 函数接收研究区域的环境层(studylayers),未来或历史的环境层列表(futurelayers),和时间段列表(time_periods),然后输出到指定的目录,同时标记这些投影所用的气候情景名称。在这个例子中,时间段列表 time_periods 包括了当前时间(2010年,即训练和研究栅格的时间)和未来的时间点(2050年和2070年)。
此过程为 RCP4.5 情景完成后,同样的步骤会重复执行一次,但针对另一个气候情景 RCP8.5,使用 2050 年和 2070 年的环境数据,确保模型可以在两种不同的气候预测情景下评估物种的潜在分布变化。这样的处理使得科学家能够评估不同气候情景对物种分布的可能影响,从而更全面地理解气候变化对生物多样性的潜在影响。
3.出现文件生成
3.1事件集合
OccurrenceCollection 函数是 gbif::occ_search 函数的一个封装器,它从全球生物多样性信息设施(GBIF)下载指定范围内的物种出现点数据。与 occ_search 相比,这个功能在处理大量分类群时更为高效。此外,它还会根据 GBIF 的分类对提供的物种列表进行核查,并在必要时进行重命名或合并分类。请注意,此步骤需要与 GBIF 服务器进行交互,因此必须连接互联网。在网络连接不稳定的情况下下载大量数据(如多个物种)可能会导致数据收集不完整。
# This function only takes occurrences from the described trainingarea extent.
# The defined extent should be the same (or similar to) as the extent of the training area.
# Given in latitude/longitude coordinates:
# 该功能只从描述的训练区范围内提取出现点。
# 所定义的范围应该与训练区的范围相同(或类似)。
# 以纬度/经度坐标给出:
extent_occ <-c(-91.5, -75, 25.5, 36)
# A list of southeastern mammals for this example
# 本示例中的东南部哺乳动物列表
spplist <-c("Puma concolor coryi",
"Podomys floridanus",
"Sylvilagus aquaticus",
"Sylvilagus palustris",
"Geomys pinetis",
"Neofiber alleni")
# Define the file folder where the occurrences will be written, within the working directory
# (if this folder doesn't already exist, megaSDM will make it)
#定义文件夹的位置,用于存储出现点,该位置位于工作目录中
#(如果这个文件夹尚不存在,megaSDM 将会创建它)
occ_output <-"occurrences"
Occurrences <-OccurrenceCollection(spplist = spplist,
output = occ_output,
trainingarea = extent_occ)
# NOTE: when running this using R Markdown, you may get "incomplete final line..."
#warnings. However, they do not appear to affect the total number or identity
#of the occurrence points and when the code is run off of the console, the
#warnings do not appear.
# 注意:在使用 R Markdown 运行此代码时,您可能会收到“incomplete final line...”的警告。
# 然而,这些警告似乎不影响出现点的总数或身份,当在控制台之外运行代码时,这些警告不会出现。
# Because one species was renamed, rename species list to reflect taxonomy changes
# 由于有一个物种被重新命名,因此重新命名物种列表以反映分类学的变更。
spplist <-Occurrences$Scientific.Name
这段代码主要用于从指定的训练区范围内提取出现点,并处理与这些出现点相关的数据。首先,它设定了一个地理范围extent_occ,用于界定哪些出现点数据应该被包含在内,这个范围用经纬度坐标表示。然后,定义了一个物种列表spplist,包括了几种东南部哺乳动物,这些物种将被用于收集出现点数据。
接下来,代码指定了一个文件夹occ_output,用于存储从GBIF等数据库收集到的出现点数据。如果该文件夹不存在,megaSDM软件包将自动创建它。Occurrences函数负责收集上述指定物种在训练区域内的出现点,这些数据将被写入先前定义的文件夹中。
此外,代码中还提到了在使用R Markdown运行时可能会遇到的“incomplete final line...”警告,但这些警告并不影响出现点的总数或识别,并且在控制台外运行代码时不会出现这些警告。最后,由于物种名称的更改,需要更新物种列表spplist以反映这些分类学上的变化,这通过重新赋值从Occurrences函数返回的科学名称来实现。这个过程确保了数据的准确性和最新性,使得后续的分析能够基于正确的物种信息进行。
3.2事件管理
在收集事件点之后,需要对它们进行格式化处理,确保数据的一致性,并能够被 MaxEnt 正确读取。OccurrenceManagement 函数接受一个出现点文件列表,从每个点提取环境数据,并根据需要对数据集进行环境子采样,以实现更精准的模型建立。此功能采用的环境二次采样方法由 Varela 等人在 2014 年提出,该方法将环境数据划分为指定数量的箱体,然后从每种独特的箱体组合中选取一个点。这有助于缓解出现点数据集中固有的环境偏差。
在本示例中,我们计划使用之前步骤生成的环境数据,从每个点中提取环境数据(envextract = TRUE)。我们还希望对数据进行环境子采样(envsample = TRUE),为每个环境变量设置 25 个分箱。最终,我们将输出路径设置为与前一个函数相同,以覆盖原始的出现点文件。
# First, get the list of the occurrence files
# 首先,获取出现点文件的列表
occlist <-list.files(occ_output,pattern = ".csv", full.names =TRUE)
OccurrenceManagement(occlist =occlist,
output = occ_output,
envextract = TRUE,
envsample = TRUE,
nbins = 25,
envdata = TSEnv$training)
这段代码用于管理和处理生态学研究中的物种出现点数据。首先,通过使用list.files函数,它从指定的输出目录occ_output中获取所有CSV格式的出现点文件列表,并将其存储在变量occlist中。接着,OccurrenceManagement函数被调用来处理这些出现点数据。
OccurrenceManagement函数的主要任务包括从每个出现点中提取环境数据,并对这些数据进行环境子采样以减少样本偏差。在这个函数中,envextract参数设置为TRUE表示从每个出现点的位置提取环境变量数据;envsample参数同样设置为TRUE表示启用环境子采样功能,这有助于在模型训练中减少过拟合的风险。环境子采样通过将环境数据分布到25个箱(bin)中,并从每个箱中选择样本来实现。此外,函数使用TSEnv$training中定义的环境数据作为子采样的基础。此步骤确保了数据的处理既符合统计学原理又适应了具体的生态模型需求,为后续的物种分布模型提供了准备好的数据集。
4.背景点
为了仅基于存在数据对物种分布进行建模,需要生成一组描述训练区域环境条件的“背景点”。
4.1背景缓冲区
虽然生成背景点的最佳方法尚存争议,但相比于随机生成的物种分布模型(SDM)的背景点,空间受限的背景点往往更为有效。在 megaSDM 中,BackgroundBuffers 函数会在出现点周围创建缓冲区,确保背景点只在出现点的一定半径内被采样。此功能利用并行处理技术显著提升了处理速度,并能同时处理一组物种。此过程中使用的计算机内核数(由“ncores”参数指定)应设置为不超过计算机内核总数减一的值。
# Get the list of occurrence files again
# (even if they were written out in the same folder as before)
# 重新获取出现点文件列表(即使文件已存于之前相同的文件夹中)
occlist <-list.files(occ_output,pattern = ".csv", full.names =TRUE)
# The location to print out the background buffers (.shp) (will be created if it doesn't exist)
# 指定输出背景缓冲区 (.shp) 的位置(若不存在将自动创建)
buff_output <-"TestRun/buffers"
# Generates buffers for each species.
# 为每个物种生成缓冲区。
BackgroundBuffers(occlist =occlist,
envdata =TSEnv$training,
buff_output,
ncores = 2)
此代码段主要用于在生态模型中处理背景缓冲区,它首先通过list.files函数重新获取之前可能已经生成并存储在特定文件夹中的出现点文件列表。文件列表的获取不受之前存储位置的影响,即使文件未变动也会重新列出,确保最新的文件列表被使用。
接下来,代码设定了用于输出生成的背景缓冲区文件(.shp格式)的位置,此位置定义在变量buff_output中,指向"TestRun/buffers"目录。如果该目录不存在,系统将自动创建它,确保文件的输出不会因目录不存在而中断。
BackgroundBuffers函数随后被调用,它接收四个参数:出现点文件列表、环境数据、输出目录以及用于并行处理的核心数。这个函数的作用是为列表中的每个物种生成空间缓冲区,这些缓冲区基于每个物种的出现点并利用提供的环境数据来定义。通过设定ncores为2,函数将使用两个核心进行处理,提高了数据处理的效率。生成的缓冲区用于后续的空间分析,如定义模型的背景点,帮助在生态建模中考虑空间上的潜在偏差。
4.2背景点生成
BackgroundPoints 函数为每个物种生成一组背景点。此函数提供了生成背景点数量、空间偏差程度以及是否对背景点进行环境二次采样的灵活设置。
# Set the parameters for the background point generation
# (how many points, and how spatially-constrained)
# 设置生成背景点的参数(点数多少,空间限制程度如何)
# How many background points should be generated per species?
# 每个物种应生成多少背景点?
nbg <-1000
# What proportion of the background points should be sampled from within the buffers?
# 多大比例的背景点应从缓冲区内采样?
spatial_weights <-0.5
# Should the background points be environmentally subsampled (Varela) or
# randomly distributed (random)?
# 背景点是应进行环境二次采样(Varela 方式)还是随机分布(random方式)?
sampleMethod <-"Varela"
# Because we want a partial spatial constraint (50% of points within the buffer),
# we must make a list of the buffer files to use in the creation of the background points.
# In the example, these files are created from the BackgroundBuffers function, but they can also be generated outside of megaSDM and brought in here.
# 由于我们希望部分空间限制(缓冲区内 50% 的点),
# 我们必须创建一个缓冲文件列表,用于生成背景点。
# 在这个示例中,这些文件由 BackgroundBuffers 函数创建,
# 但也可以在megaSDM 外部生成并在此引入。
bufflist <-list.files(buff_output,pattern = ".shp$", full.names =TRUE)
# Define the location where the background points will be printed out to (.shp)
# (This directory will be created if it doesn't already exist)
# 定义背景点输出位置 (.shp) (若不存在将自动创建)
bg_output <-"TestRun/backgrounds"
BackgroundPoints(spplist =spplist,
envdata =TSEnv$training,
output = bg_output,
nbg = nbg,
spatial_weights =spatial_weights,
buffers =bufflist,
method = sampleMethod,
ncores = 2)
这段代码用于设置和执行背景点生成,以便于物种分布模型的构建。首先定义了每个物种需要生成的背景点数量(nbg设为1000),这决定了模型中用于代表非出现区域环境条件的数据点的数量。接着,设定了在背景缓冲区内采样背景点的比例(spatial_weights设为0.5),意味着50%的背景点将从每个物种的出现点创建的空间缓冲区内选取,这有助于在模型中保持空间上的实际分布特征。
接下来,选择了背景点的生成方式(sampleMethod),在这里选择了“Varela”方式,这是一种环境二次采样方法,用于在保留环境代表性的同时减少样本数量,以避免在模型训练中的过拟合。为实施这些设置,需要一个包含缓冲文件的列表(bufflist),这些文件指定了哪些区域应该从中生成背景点。这些文件通常是通过BackgroundBuffers函数生成的,但也可以是外部生成的并导入到项目中。
最后,定义了背景点输出的位置(bg_output),指定背景点数据将被保存到的文件夹,如果文件夹不存在,系统将自动创建它。BackgroundPoints函数随后被调用,传入了物种列表、环境数据、输出位置、背景点数量、空间权重、缓冲文件列表、采样方法以及用于并行处理的核心数(ncores设为2),有效加快数据处理速度。
4.3因物种而异的环境集
当采用一组与特定物种生物学密切相关的环境变量时,物种分布模型(SDM)通常会表现得更为准确。VariableEnv 功能允许更改用于每个物种的环境变量集,以便根据每个物种的栖息地适宜性进行调整分析。
# Define a list of the environmental variables to keep for each species
# In this example, we simply want all of the species to have the same environmental variables.
# 首先,定义每个物种所需保留的环境变量列表
# 在此示例中,我们希望所有物种都具有相同的环境变量。
envvar <- rep("Bio1,Bio12,Bio14,Bio6,Bio9", length = length(occlist))
# Define a list of the background point files
# (either created in the BackgroundPoints function or generated separately)
# 定义背景点文件列表
#(在BackgroundPoints 函数中创建或单独生成)
bglist <-list.files(bg_output,pattern = ".csv", full.names =TRUE)
# In this example, megaSDM overwrites the occurrence and background points,
# but they could be placed in a different folder if requested.
# 在此示例中,megaSDM 会覆盖现有的出现点和背景点文件,
# 但如果需要,也可以将它们放在不同的文件夹中。
VariableEnv(occlist =occlist,
bglist = bglist,
env_vars = envvar,
occ_output = occ_output,
bg_output = bg_output)
这段代码涉及设置和管理物种分布模型中的环境变量以及背景点文件的处理。首先,代码定义了需要为每个物种保留的环境变量列表。在这个例子中,所有物种使用相同的环境变量集,包括Bio1(年平均温度)、Bio12(年降水量)、Bio14(湿季降水量)、Bio6(最冷月平均温度)和Bio9(最干季平均温度),通过rep函数创建一个重复的字符串列表,保证列表长度与出现点文件列表occlist的长度相匹配。
接下来,通过list.files函数从指定目录bg_output中获取所有.csv格式的背景点文件列表,这些文件可以是之前通过BackgroundPoints函数生成的,也可以是外部生成并导入的。
最后,调用VariableEnv函数,它用于指定和管理每个物种的环境变量。函数输入包括出现点文件列表occlist、背景点文件列表bglist、环境变量列表envvar以及出现点和背景点的输出目录occ_output和bg_output。在本例中,如果已经存在相同的文件名,megaSDM将会覆盖现有的出现点和背景点文件,但也提供了选项,可以将这些文件保存在不同的文件夹中以避免覆盖。
5.分布建模和投影
5.1MaxEnt 建模
在出现和背景点管理(如果需要)之后,megaSDM 将使用 MaxEnt 算法对栖息地适宜性进行建模。该MaxEntModel函数为每个物种生成实际的 MaxEnt 模型。MaxEnt 参数(例如,正则化、特征类型、交叉验证方法)可以在此函数中进行操作:请参阅文档以获取可以更改的设置和默认值的完整列表。
# First, define a list of all background and occurrence point files
#首先,定义所有背景点和出现点文件的列表
occlist <-list.files(occ_output,pattern = ".csv", full.names =TRUE)
bglist <-list.files(bg_output,pattern = ".csv", full.names =TRUE)
# Define where the results of the MaxEnt model runs will be printed out to (as .lambdas files)
#定义MaxEnt 模型运行结果输出位置(.lambdas文件)
model_output <-"TestRun/models"
# "nrep" is set to 4, meaning that the MaxEnt algorithm will run 4 times with different
# subsets of occurrence points for a better representation of the habitat suitability.
# "nrep"设置为4,意味着MaxEnt 算法将运行4 次,
#使用不同子集的出现点以更好地代表栖息地适宜性。
MaxEntModel(occlist =occlist,
bglist = bglist,
model_output =model_output,
ncores = 2,
nrep = 4,
alloutputs =FALSE)
这段代码主要用于配置和执行 MaxEnt 模型,以预测物种的栖息地适宜性。首先,代码通过 list.files 函数从指定的输出目录中获取所有CSV格式的背景点和出现点文件列表,并分别存储在 occlist 和 bglist 变量中。这确保了模型使用的数据是最新的,并且涵盖了所有相关的地理位置信息。
接着,定义了一个输出目录 model_output,用于存储 MaxEnt 模型运行的结果文件(通常是 .lambdas 文件)。这些文件包含了模型的参数设置和每次运行的结果,对后续的模型分析和验证至关重要。
然后,通过调用 MaxEntModel 函数来运行模型。在这里,nrep 参数被设置为 4,这意味着 MaxEnt 算法将使用四个不同的出现点子集进行四次运行,这样做可以增加模型结果的稳健性,通过多次采样反映栖息地适宜性的不同可能性。ncores 参数设置为 2,允许模型利用两个处理核心并行运行,从而提高计算效率。最后,alloutputs 参数被设置为 FALSE,这意味着不会输出每一次迭代的所有详细结果,仅保存最终的摘要信息,这有助于节省存储空间并便于管理输出结果。这整个流程通过精细的参数设置和文件管理,确保了模型运行的有效性和结果的准确性。
5.2最大化投影
在生成模型参数(或使用从其他程序中生成的 .lambdas 文件)之后,megaSDM 会取得这些 .lambdas 文件,并将它们投影到研究区域当前及预测/历史环境条件上。MaxEntProj 函数使用这些生成的模型参数,将它们投影到当前和未来的环境中,排除表现不佳的模型,从之前步骤中的多次运行中创建集成模型,并生成二进制的存在/不存在分布图。
# First, create a list of the time periods and climate scenarios used in the analysis (starting with the year the model is trained on)
#首先,创建用于分析的时间段和气候情景列表(从模型训练的年份开始)
time_periods <-c(2010,2050,2070)
scenarios <-c("RCP4.5", "RCP8.5")
# Define the directory where the current study area rasters are located
#(generated from the TrainStudyEnv function or brought in from a separate location)
#定义当前研究区域栅格的存放目录(由 TrainStudyEnv 函数生成或从其他地方引入)
study_dir <-"TestRun/studyarea"
# Define the directories where the future study area rasters are location
#(generated from the PredictEnv function or brought in from a separate location)
#定义未来研究区域栅格的存放目录(由 PredictEnv 函数生成或从其他地方引入)
# Define a list of directories for the projected climate layers,
# separated into the different climate scenarios and years:
#定义不同气候情景和年份的预测气候层目录列表:
#list(c(Scenario1Year1, Scenario1Year2),
# c(Scenario2Year1, Scenario2Year2))
predictdir <-list(c("TestRun/RCP4.5/2050",
"TestRun/RCP4.5/2070"),
c("TestRun/RCP8.5/2050",
"TestRun/RCP8.5/2070"))
# Define Where the results will be printed out.
# For this example, We'll define a new folder within
# the working directory that is specifically for the model
# projecions and analysis.
#定义结果输出目录。
#在此示例中,我们将在工作目录中定义一个新的文件夹,专门用于模型投影和分析。
result_dir <-"Results"
# Other options are also available (check the documentation page)
#还有其他选项可用(查阅文档页)
MaxEntProj(input = model_output,
time_periods = time_periods,
scenarios = scenarios,
study_dir =study_dir,
predict_dirs = predictdir,
output = result_dir,
aucval = 0.7,
ncores = 2)
这段代码首先创建了用于分析的时间段和气候情景列表。时间段包括2010年、2050年和2070年,而气候情景包括RCP4.5和RCP8.5。接下来,定义了存放当前研究区域栅格的目录,这些栅格由TrainStudyEnv函数生成或从其他地方引入。接着,定义了未来研究区域栅格的存放目录,这些栅格由PredictEnv函数生成或从其他地方引入。
预测气候层目录列表按照不同的气候情景和年份进行划分。列表中的每个元素包含相应气候情景下的预测年份目录,例如TestRun/RCP4.5/2050和TestRun/RCP4.5/2070,另一个气候情景RCP8.5的年份目录也是如此。
接下来,定义了结果输出目录。在这个示例中,结果将被输出到一个名为Results的新文件夹,该文件夹位于工作目录中,专门用于存放模型投影和分析的结果。
最后,通过调用MaxEntProj函数,执行模型投影和分析。该函数的参数包括模型输出、时间段、气候情景、研究区域目录、预测目录列表、结果输出目录、AUC阈值和使用的核心数量。其中,AUC阈值设置为0.7,核心数量为2。函数的详细参数设置可以F1查阅相关文档页面。
6.分析
6.1时间地图
createTimeMaps 函数利用每个时间段的二进制地图创建“时间地图”:这些地图详细展示了物种分布随时间逐步扩展和收缩的过程,使得可以可视化单向范围的变化(例如,所有时间步骤的范围扩展)以及更复杂的动态(例如,从2010年到2050年的范围扩展,随后是2050年到2070年的范围收缩)。
# The time maps will be written out to the directory supplied in "result_dir"
#时间地图将输出到在"result_dir" 中指定的目录
result_dir <-"Results"
createTimeMaps(result_dir =result_dir,
time_periods =time_periods,
scenarios =scenarios,
dispersal =FALSE,
ncores = 2)
这段代码用于生成和输出时间地图,这些地图用于展示物种在不同时间段和气候情景下的分布变化。首先,定义了输出目录 result_dir 为"Results",所有生成的时间地图将被保存在这个目录中。这样的设置帮助组织输出文件,确保结果易于访问和分析。
接着,调用 createTimeMaps 函数,该函数负责创建时间地图。函数参数包括输出目录、时间段 (time_periods)、气候情景 (scenarios),以及是否考虑物种的扩散能力 (dispersal)。在这个例子中,dispersal 被设置为 FALSE,表明在生成时间地图时没有考虑物种的扩散限制,这可能影响对未来分布的预测准确性。最后,ncores 参数设置为 2,利用双核并行处理来加速地图的生成过程。这种方法允许快速有效地评估和可视化物种在不同气候变化情景下随时间的潜在分布变化,为生态研究和保护规划提供重要信息。
6.2附加统计数据
该 additionalStats 函数通过多个时间步长和不同的气候情景,生成有关物种分布范围大小及其变化的统计数据。此外,它还生成多个图表,并将这些图表保存在由 result_dir 指定的目录中,以便直观地展示这些变化。
additionalStats(result_dir =result_dir,
time_periods =time_periods,
scenarios = scenarios,
dispersal = FALSE,
ncores = 2)
这段代码使用 additionalStats 函数来执行额外的统计分析,这些分析旨在更深入地理解和评估不同时间段和气候情景下的物种分布变化。函数使用 result_dir 指定的目录作为结果的输出位置,这里设置的是"Results",确保所有统计输出都集中存储,便于后续的查找和参考。time_periods 和 scenarios 参数分别指定了分析涉及的时间段和气候情景,这些参数确保了统计分析覆盖了整个研究的时间和情景范围。dispersal 参数在这里设置为 FALSE,表明在统计分析中没有考虑物种的扩散限制,这对于评估模型的敏感性和适应性有一定的影响。最后,ncores 设置为 2,这允许程序在执行统计计算时使用两个处理核心,优化了计算效率。通过这样的配置,该函数能够提供关于物种预测分布的各种统计信息,帮助研究者评估模型的表现和预测的可靠性。
7.扩散率
将扩散限制纳入物种分布模型(SDM)有助于更精确地预测物种未来可能栖息的地点。dispersalRate 函数通过使用物种的年平均扩散率数据(单位为公里/年)来限定连续的栖息地适宜性图以及每个物种的扩散能力的存在/不存在图。
# Add in dispersal data (normally you would read a .csv file with two columns, but in this example the data is just added in by hand here).
#添加扩散数据(通常您会读取一个包含两列的 .csv 文件,但在此示例中,数据直接手工添加)。
dispersaldata <-data.frame(Species = spplist, Rate = c(48.92,
1.21,
6.07,
3.37,
0.96,
3.27))
dispersalRate(result_dir = result_dir,
dispersaldata = dispersaldata,
time_periods = time_periods,
scenarios =scenarios,
ncores = 2)
# Repeat the time map and additional stats steps for the dispersal constrained data.
# Set dispersal = TRUE this time.
#重复时间地图和其他统计步骤,针对受扩散限制的数据。
#这次设置dispersal = TRUE。
createTimeMaps(result_dir,
time_periods,
scenarios,
dispersal =TRUE,
dispersaldata =dispersaldata,
ncores = 2)
# The additional stats function will compare the species ranges between the
# dispersal-constrained and the regular data.
#额外的统计功能将比较受扩散限制的数据和常规数据之间的物种分布范围。
additionalStats(result_dir,
time_periods,
scenarios,
dispersal = TRUE,
dispersaldata = dispersaldata,
ncores = 2)
这段代码首先手动添加了扩散数据,通常这些数据会从一个包含两列的CSV文件中读取,但在此示例中,数据是直接在代码中定义的。创建了一个名为dispersaldata的数据框,其中包括物种名称和各自的年扩散率,这些数据将用于考虑物种的潜在移动能力或自然扩散能力。
接着,代码调用了dispersalRate函数,将扩散数据与已定义的结果目录、时间段和气候情景一起处理,使用两个核心进行计算。此函数的目的是考虑物种的扩散能力来调整栖息地适宜性预测,使其更符合实际的生物地理分布动态。
然后,代码再次执行createTimeMaps和additionalStats函数,但这次设置dispersal参数为TRUE,意味着在生成时间地图和进行额外统计分析时会考虑扩散限制。这一步骤允许评估考虑扩散能力对物种预测分布的影响,通过比较受扩散限制和常规数据下的物种分布范围,可以深入了解扩散因素对生态预测准确性的具体影响。这些功能最终生成的图表和统计数据将存储在指定的result_dir目录中,为进一步分析和报告提供依据。
8.物种丰富度
该 createRichnessMaps 函数通过堆叠二进制分布图,为在所有时间段和场景中检测的一组物种创建物种丰富度图。此外,该函数还将考虑扩散约束的物种丰富度分析与常规分析进行对比。
#从之前的步骤取得result_dir = result_dir, time_periods = time_periods, scenarios = scenarios,应用到现在分析中。
createRichnessMaps(result_dir =result_dir, #taken from previous steps
time_periods =time_periods, #taken from previous steps
scenarios =scenarios, #taken from previous steps
dispersal =TRUE,
taxonlist =FALSE)
# A list of the higher taxa of each species (e.g., family) can be provided (taxonlist) to create separate richness maps for each higher taxon.
# 可以提供每个物种的更高分类单位(例如,科)的列表(taxonlist),以创建每个更高分类单位的单独丰富度地图。
这段代码涉及使用 createRichnessMaps 函数生成物种丰富度地图,该函数利用已从前面的步骤获得的结果目录、时间段和气候情景。在此函数调用中,dispersal 参数被设置为 TRUE,意味着在生成丰富度地图时考虑了物种的扩散限制,这可以提供更接近自然分布动态的丰富度评估。
此外,尽管在此例中没有启用 taxonlist (设置为 FALSE),但该参数允许用户提供每个物种的更高分类单位(如科)的列表。启用此功能时,系统将为每个更高分类单位生成单独的丰富度地图,这有助于在更宽泛的生物分类层次上分析和理解生物多样性的分布格局。此功能特别适用于需要评估不同生物群组响应环境变化的生态学研究和保护生物多样性的管理工作。