在 R 中使用带有 MaxEnt 的测试样本文件
Using a test sample file with MaxEnt in R
我最近在 R 中使用 MaxEnt 进行了大量工作(dismo-package),但仅使用交叉验证来验证我的鸟类栖息地模型(仅单一物种)。现在我想使用一个自己创建的测试样本文件。我不得不手动选择这个点进行验证,不能使用 运行dom 测试点。
所以我的 R 脚本如下所示:
library(raster)
library(dismo)
setwd("H:/MaxEnt")
memory.limit(size = 400000)
punkteVG <- read.csv("Validierung_FL_XY_2016.csv", header=T, sep=";", dec=",")
punkteTG <- read.csv("Training_FL_XY_2016.csv", header=T, sep=";", dec=",")
punkteVG$X <- as.numeric(punkteVG$X)
punkteVG$Y <- as.numeric(punkteVG$Y)
punkteTG$X <- as.numeric(punkteTG$X)
punkteTG$Y <- as.numeric(punkteTG$Y)
##### mask NA ######
mask <- raster("final_merge_8class+le_bb_mask.img")
dataframe_VG <- extract(mask, punkteVG)
dataframe_VG[dataframe_VG == 0] <- NA
dataframe_TG <- extract(mask, punkteTG)
dataframe_TG[dataframe_TG == 0] <- NA
punkteVG <- punkteVG*dataframe_VG
punkteTG <- punkteTG*dataframe_TG
#### add the raster dataset ####
habitat_all <- stack("blockstats_stack_8class+le+area_8bit.img")
#### MODEL FITTING #####
library(rJava)
system.file(package = "dismo")
options(java.parameters = "-Xmx1g" )
setwd("H:/MaxEnt/results_8class_LE_AREA")
### backgroundpoints ###
set.seed(0)
backgrVMmax <- randomPoints(habitat_all, 100000, tryf=30)
backgrVM <- randomPoints(habitat_all, 1000, tryf=30)
### Renner (2015) PPM modelfitting Maxent ###
maxentVMmax_Renner<-maxent(habitat_all,punkteTG,backgrVMmax, path=paste('H:/MaxEnt/Ergebnisse_8class_LE_AREA/maxVMmax_Renner',sep=""),
args=c("-P",
"noautofeature",
"nothreshold",
"noproduct",
"maximumbackground=400000",
"noaddsamplestobackground",
"noremoveduplicates",
"replicates=10",
"replicatetype=subsample",
"randomtestpoints=20",
"randomseed=true",
"testsamplesfile=H:/MaxEnt/Validierung_FL_XY_2016_swd_NA"))
在 "maxent()"-command 之后我 运行 进入多个错误。首先,我收到一条错误消息,指出他需要大于 0(默认值)"randomtestpoints"。所以我添加了 "randomtestpoints = 20" (希望不会阻止程序使用该文件)。然后我得到:
Error: Test samples need to be in SWD format when background data is in SWD format
Error in file(file, "rt") : cannot open the connection
问题是,当我 运行 使用默认交叉验证的脚本时:
maxentVMmax_Renner<-maxent(habitat_all,punkteTG,backgrVMmax, path=paste('H:/MaxEnt/Ergebnisse_8class_LE_AREA/maxVMmax_Renner',sep=""),
args=c("-P",
"noautofeature",
"nothreshold",
"noproduct",
"maximumbackground=400000",
"noaddsamplestobackground",
"noremoveduplicates",
"replicates=10"))
...一切正常。
我还尝试了多种方法来获取格式正确的 csv-validation-data。两行(标记为 X 和 Y),三行(标记为物种,X 和 Y)和其他内容。我宁愿使用我用 read.csv 创建的 "punkteVG"-vector(这是验证数据)...但似乎 MaxEnt 想要他的文件。
我无法想象我的问题如此罕见。 "testsamplesfile"这个参数肯定有人用过
我发现了问题所在。所以就在这里,供其他人欣赏:
Subsample-file 的正确 maxent-command 如下所示:
maxentVMmax_Renner<-maxent(habitat_all, punkteTG, backgrVMmax, path=paste('H:/MaxEnt',sep=""),
args=c("-P",
"noautofeature",
"nothreshold",
"noproduct",
"maximumbackground=400000",
"noaddsamplestobackground",
"noremoveduplicates",
"replicates=1",
"replicatetype=Subsample",
"testsamplesfile=H:/MaxEnt/swd.csv"))
当然,不能重复多次,因为你只有一个子样本。
最重要的是 "swd.csv" Subsample-file 必须包括:
- X 和 Y 坐标
- 各个点的值(例如:"extract(habitat_all, PunkteVG)"
- 第一列需要包含单词 "species" 和 header "Species"(因为 MaxEnt 使用默认值 "species" 如果您不在其中定义一个发生数据)
所以最后一点就是这里的问题。基本上,如果你不在Subsample-file中定义species-colum,MaxEnt将不知道如何分配数据。
我最近在 R 中使用 MaxEnt 进行了大量工作(dismo-package),但仅使用交叉验证来验证我的鸟类栖息地模型(仅单一物种)。现在我想使用一个自己创建的测试样本文件。我不得不手动选择这个点进行验证,不能使用 运行dom 测试点。
所以我的 R 脚本如下所示:
library(raster)
library(dismo)
setwd("H:/MaxEnt")
memory.limit(size = 400000)
punkteVG <- read.csv("Validierung_FL_XY_2016.csv", header=T, sep=";", dec=",")
punkteTG <- read.csv("Training_FL_XY_2016.csv", header=T, sep=";", dec=",")
punkteVG$X <- as.numeric(punkteVG$X)
punkteVG$Y <- as.numeric(punkteVG$Y)
punkteTG$X <- as.numeric(punkteTG$X)
punkteTG$Y <- as.numeric(punkteTG$Y)
##### mask NA ######
mask <- raster("final_merge_8class+le_bb_mask.img")
dataframe_VG <- extract(mask, punkteVG)
dataframe_VG[dataframe_VG == 0] <- NA
dataframe_TG <- extract(mask, punkteTG)
dataframe_TG[dataframe_TG == 0] <- NA
punkteVG <- punkteVG*dataframe_VG
punkteTG <- punkteTG*dataframe_TG
#### add the raster dataset ####
habitat_all <- stack("blockstats_stack_8class+le+area_8bit.img")
#### MODEL FITTING #####
library(rJava)
system.file(package = "dismo")
options(java.parameters = "-Xmx1g" )
setwd("H:/MaxEnt/results_8class_LE_AREA")
### backgroundpoints ###
set.seed(0)
backgrVMmax <- randomPoints(habitat_all, 100000, tryf=30)
backgrVM <- randomPoints(habitat_all, 1000, tryf=30)
### Renner (2015) PPM modelfitting Maxent ###
maxentVMmax_Renner<-maxent(habitat_all,punkteTG,backgrVMmax, path=paste('H:/MaxEnt/Ergebnisse_8class_LE_AREA/maxVMmax_Renner',sep=""),
args=c("-P",
"noautofeature",
"nothreshold",
"noproduct",
"maximumbackground=400000",
"noaddsamplestobackground",
"noremoveduplicates",
"replicates=10",
"replicatetype=subsample",
"randomtestpoints=20",
"randomseed=true",
"testsamplesfile=H:/MaxEnt/Validierung_FL_XY_2016_swd_NA"))
在 "maxent()"-command 之后我 运行 进入多个错误。首先,我收到一条错误消息,指出他需要大于 0(默认值)"randomtestpoints"。所以我添加了 "randomtestpoints = 20" (希望不会阻止程序使用该文件)。然后我得到:
Error: Test samples need to be in SWD format when background data is in SWD format
Error in file(file, "rt") : cannot open the connection
问题是,当我 运行 使用默认交叉验证的脚本时:
maxentVMmax_Renner<-maxent(habitat_all,punkteTG,backgrVMmax, path=paste('H:/MaxEnt/Ergebnisse_8class_LE_AREA/maxVMmax_Renner',sep=""),
args=c("-P",
"noautofeature",
"nothreshold",
"noproduct",
"maximumbackground=400000",
"noaddsamplestobackground",
"noremoveduplicates",
"replicates=10"))
...一切正常。
我还尝试了多种方法来获取格式正确的 csv-validation-data。两行(标记为 X 和 Y),三行(标记为物种,X 和 Y)和其他内容。我宁愿使用我用 read.csv 创建的 "punkteVG"-vector(这是验证数据)...但似乎 MaxEnt 想要他的文件。
我无法想象我的问题如此罕见。 "testsamplesfile"这个参数肯定有人用过
我发现了问题所在。所以就在这里,供其他人欣赏:
Subsample-file 的正确 maxent-command 如下所示:
maxentVMmax_Renner<-maxent(habitat_all, punkteTG, backgrVMmax, path=paste('H:/MaxEnt',sep=""),
args=c("-P",
"noautofeature",
"nothreshold",
"noproduct",
"maximumbackground=400000",
"noaddsamplestobackground",
"noremoveduplicates",
"replicates=1",
"replicatetype=Subsample",
"testsamplesfile=H:/MaxEnt/swd.csv"))
当然,不能重复多次,因为你只有一个子样本。 最重要的是 "swd.csv" Subsample-file 必须包括:
- X 和 Y 坐标
- 各个点的值(例如:"extract(habitat_all, PunkteVG)"
- 第一列需要包含单词 "species" 和 header "Species"(因为 MaxEnt 使用默认值 "species" 如果您不在其中定义一个发生数据)
所以最后一点就是这里的问题。基本上,如果你不在Subsample-file中定义species-colum,MaxEnt将不知道如何分配数据。