You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:17:38