在R中使用MaxEnt构建SDM时无法运行Jackknife测试及报错问题
在R中使用MaxEnt构建SDM时的刀切法测试问题
问题说明
我在R中使用MaxEnt构建物种分布模型(SDM),但无法正常运行刀切法(Jackknife)测试:
- 设置
jackknife=TRUE参数后没有效果 - 尝试使用ENMevaluate函数时触发类型转换错误
原始代码
# 添加阿联酋shapefile uae = readOGR(dsn ="C:/Users/Predator/Downloads", layer="Boundaries_UAE_0_GAUL") # 获取物种分布点 pj = gbif("Prosopis", "juliflora", ext=uae, geo=T) # 仅保留地理点,返回数据框 pj = pj[,c("lon","lat")] # 提取经纬度列 # 获取WorldClim气候数据 biow = raster::getData("worldclim", var="bio", res=2.5) # 裁剪到阿联酋范围 bio <- crop(biow, extent(uae)) # 下载未来CMIP5气候数据(50年后,RCP4.5,AC模型) biof = raster::getData("CMIP5", var="bio", res=2.5, rcp=45, year=50, model="AC", download = TRUE) # 裁剪到阿联酋范围 biof <- crop(biof, extent(uae)) # 统一未来数据与当前数据的变量名 names(biof) = names(bio) # K折分组(5组) group = kfold(pj,5) pres_train = pj[group!=1,] pres_test = pj[group==1,] # 训练MaxEnt模型,尝试启用刀切法 xm = maxent(bio, pres_train, jackknife=TRUE) # 尝试用ENMevaluate评估模型,触发错误 enm_eval <- ENMevaluate( algorithm = "maxent", xm, bio, pres_test, bg )
报错信息
运行ENMevaluate时出现以下错误:
Error in as.data.frame.default(occs) :
cannot coerce class ‘structure("MaxEnt", package = "dismo")’ to a data.frame
解决方法
1. 修复MaxEnt刀切法无效问题
- 更新dismo包:旧版本dismo对
jackknife参数支持不完善,执行install.packages("dismo")更新到最新版 - 直接传递MaxEnt命令行参数:如果
jackknife=TRUE仍无效,手动通过args参数传递指令:xm = maxent(bio, pres_train, args=c("jackknife=true")) - 检查MaxEnt Java环境:确保R能正确调用MaxEnt的Java程序,可通过
dismo::maxent()的path参数指定MaxEnt jar包路径(若默认路径未找到)
2. 修复ENMevaluate参数错误
ENMevaluate的参数顺序和类型完全错误,正确调用逻辑如下:
- 首先需要生成背景点(
bg参数必须提供) - 函数核心参数是存在点、环境变量、背景点,而非已训练的模型
- 正确调用代码:
# 生成背景点(数量建议为存在点的10倍) bg <- randomPoints(bio, n = nrow(pj)*10, ext = uae) # 调用ENMevaluate,启用刀切法与5折交叉验证 enm_eval <- ENMevaluate( occs = pres_train, # 训练用存在点 envs = bio, # 环境变量图层 bg = bg, # 背景点 algorithm = "maxent", # 建模算法 kfolds = 5, # K折数 jackknife = TRUE # 启用刀切法 )
错误原因是你将已训练的MaxEnt模型xm传给了需要存在点数据框的occs参数,导致类型不匹配报错。
内容的提问来源于stack exchange,提问作者Ahmad Mamdouh Akkad
相关产品推荐
相关产品推荐

