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

基于栅格预测结果绘制不确定性图的可行方法问询

解决R中栅格预测不确定性地图的生成问题

针对你使用embarcadero包的bart.step模型做物种分布预测,需要生成不确定性地图的需求,核心思路是自定义预测函数,让模型返回不确定性相关指标(如后验标准差、置信区间),再通过raster::predict批量计算栅格单元的不确定性。

方法:利用BART模型的后验样本计算不确定性

BART模型的优势是能生成多个后验预测样本,样本的离散程度直接反映预测不确定性。以下是具体实现步骤:

  1. 自定义预测函数
    这个函数会调用模型生成后验样本,计算每个栅格单元的预测均值和不确定性(这里用标准差,也可以替换为置信区间宽度):
predict_bart_uncertainty <- function(model, newdata) {
  # 生成100个后验预测样本(可根据需求调整数量)
  pred_samples <- predict(model, newdata = newdata, n.samples = 100, type = "response")
  # 计算预测均值(和原预测结果一致)
  pred_mean <- rowMeans(pred_samples)
  # 计算标准差(衡量不确定性:值越大,预测结果越不稳定)
  pred_sd <- apply(pred_samples, 1, sd)
  # 返回包含均值和不确定性的数据框
  data.frame(mean = pred_mean, uncertainty = pred_sd)
}
  1. 生成不确定性栅格
    用raster::predict调用自定义函数,批量处理栅格砖:
# 生成包含预测均值和不确定性的栅格砖
hytr_with_uncertainty <- predict(object = covs, model = sdm,
                                 fun = predict_bart_uncertainty,
                                 splitby = 20,  # 保持和原预测一致的分块参数
                                 na.rm = TRUE)

# 可视化不确定性地图
plot(hytr_with_uncertainty$uncertainty,
     box = FALSE,
     axes = FALSE,
     main = 'A. amphibius 预测不确定性(标准差)',
     legend.args=list(text='预测标准差', side=2, line=1.3))

可选:用置信区间宽度表示不确定性

如果你更倾向于用置信区间来展示不确定性,可以修改自定义函数,计算95%置信区间的上下限,并用区间宽度作为不确定性指标:

predict_bart_ci_uncertainty <- function(model, newdata) {
  pred_samples <- predict(model, newdata = newdata, n.samples = 100, type = "response")
  pred_mean <- rowMeans(pred_samples)
  # 计算95%置信区间上下限
  pred_lower <- apply(pred_samples, 1, quantile, 0.025)
  pred_upper <- apply(pred_samples, 1, quantile, 0.975)
  # 区间宽度作为不确定性
  ci_width <- pred_upper - pred_lower
  data.frame(mean = pred_mean, ci_width = ci_width)
}

# 生成并可视化置信区间宽度的不确定性地图
hytr_ci_uncertainty <- predict(object = covs, model = sdm,
                               fun = predict_bart_ci_uncertainty,
                               splitby = 20, na.rm = TRUE)

plot(hytr_ci_uncertainty$ci_width,
     box = FALSE,
     axes = FALSE,
     main = 'A. amphibius 预测不确定性(95%置信区间宽度)',
     legend.args=list(text='置信区间宽度', side=2, line=1.3))

注意事项

  • n.samples参数:样本数量越多,不确定性的估计越准确,但计算时间会相应增加,建议根据你的计算资源调整(比如50-200个样本)。
  • 如果你使用的是其他类型模型(如线性模型、随机森林),逻辑类似:自定义函数让模型返回不确定性指标(如lm的置信区间、随机森林的袋外预测方差),再传入raster::predict即可。

内容的提问来源于stack exchange,提问作者Kendra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:15:50