基于栅格预测结果绘制不确定性图的可行方法问询
解决R中栅格预测不确定性地图的生成问题
针对你使用embarcadero包的bart.step模型做物种分布预测,需要生成不确定性地图的需求,核心思路是自定义预测函数,让模型返回不确定性相关指标(如后验标准差、置信区间),再通过raster::predict批量计算栅格单元的不确定性。
方法:利用BART模型的后验样本计算不确定性
BART模型的优势是能生成多个后验预测样本,样本的离散程度直接反映预测不确定性。以下是具体实现步骤:
- 自定义预测函数
这个函数会调用模型生成后验样本,计算每个栅格单元的预测均值和不确定性(这里用标准差,也可以替换为置信区间宽度):
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) }
- 生成不确定性栅格
用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
相关产品推荐
相关产品推荐

