使用dismo的gbm.plot与pdp的partial生成的部分依赖图存在差异的原因?
我在做生境模型的部分依赖分析时也遇到过一模一样的问题——dismo的gbm.plot和pdp的partial画出来的图趋势一致,但Y轴刻度差得有点多,后来折腾了一阵才搞清楚是这两个函数对模型输出的处理逻辑不一样,给你拆解一下:
核心差异原因
响应变量的尺度转换逻辑不同
这是最常见的原因:dismo的gbm.plot会根据你构建GBM模型时指定的distribution参数自动适配输出尺度。比如如果是二分类生境模型(distribution = "bernoulli"),它默认输出的是对数优势比(log-odds);而pdp的partial默认输出的是响应尺度的值(比如概率),除非你手动指定type = "link"。反过来,如果你的模型是回归型(distribution = "gaussian"),两者的输出尺度可能更接近,但仍可能因为变量标准化的处理不同有细微差异。边际效应的计算方式有区别
gbm.plot是dismo专为其集成的GBM工具链设计的,它直接从GBM模型对象中提取内部预计算的边际效应值;而pdp::partial是通用的部分依赖图工具,它会对目标预测变量做网格采样,然后固定其他变量的均值(或按分布采样),再用模型重新预测得到边际效应。这种计算方式的差异也可能导致Y轴数值范围的细微偏差。默认参数的隐含设置不同
比如gbm.plot会自动处理变量的相对重要性,并且默认只展示单个变量的边际效应;而pdp::partial默认会考虑变量的交互(如果不指定ice = FALSE),或者采样的网格密度不同,这些都会间接影响Y轴的显示范围。
对齐两个图Y轴的解决方法
如果你想让两个工具生成的图尺度一致,可以按以下步骤调整:
- 确认模型的distribution参数:先检查你的GBM模型用的是
"bernoulli"、"gaussian"还是其他分布,这是尺度匹配的基础。 - 统一pdp的输出尺度:给
pdp::partial指定type参数,和gbm.plot的输出对齐:- 如果
gbm.plot输出的是对数优势比,用type = "link" - 如果是概率/原始响应值,用
type = "response"
- 如果
- 手动验证数值:可以用
gbm::predict.gbm分别生成两种尺度的预测值,对比两个工具的输出是否匹配,比如:# 假设你的GBM模型对象是habitat_gbm # 生成link尺度的预测值 link_preds <- predict(habitat_gbm, newdata = your_data, type = "link") # 生成response尺度的预测值 response_preds <- predict(habitat_gbm, newdata = your_data, type = "response")
举个实际代码示例,让pdp的图和dismo的gbm.plot对齐:
library(pdp) library(dismo) library(gbm) # 假设你的模型已经构建完成:habitat_gbm # 用pdp生成link尺度的纬度部分依赖图 lat_pdp_link <- partial(habitat_gbm, pred.var = "latitude", type = "link") plot(lat_pdp_link, main = "Latitude Partial Dependence (Link Scale)") # 对比dismo的gbm.plot输出 gbm.plot(habitat_gbm, variable = which(names(habitat_gbm$var.names) == "latitude"), plot.layout = 1, main = "Latitude Partial Dependence (dismo)")
这样调整后,两个图的Y轴尺度应该就会一致了,线条趋势本来就是匹配的,只是之前尺度没对齐而已。
内容的提问来源于stack exchange,提问作者Cruz

