我目前正在探索dismo包中的gbm函数,以创建用于物种分布建模的提升回归树。我使用了dismo的示例文档以及Elith等人于2008年在《动物生态学杂志》上发表的论文《提升回归树的工作指南》。在Elith等人的文章的第808至809页,作者解释了部分依赖图,并在第809页底部给出了一个例子(图6)。根据dismo的示例文档《用于生态建模的提升回归树》,gbm.plot“绘制响应变量对一个或多个预测变量的部分依赖关系”。
Gbm.plot创建的图形几乎与Elith等人论文中的例子完全相同。然而,有几个参数我无法设置以达到与论文中完全相同的图形效果。
-
论文中的Y轴采用logit尺度,并居中以使数据分布的平均值为零。gbm.plot中的Y轴表示拟合函数。
-
论文中的地毯图位于图表顶部,而gbm.step中的地毯图位于底部。
-
Gbm.plot使用变量名作为X轴标签。论文中使用了有意义的轴标签。
以下是Elith论文中的图与使用gbm.plot生成的图的对比
Elith等人2009年的图6
来自gbm.plot的图
我的解决方案
在寻找解决方案时,我发现了这个问题,它让我想到查看源代码(这是我第一次这样做)。通过源代码,我能够很好地了解函数的构成,但仍有许多我不理解的地方。
-
我不确定如何更改Y轴以转换为logit尺度并居中,使其平均值为零。
-
我能够更改源代码,将地毯图移到图表顶部。我找到了地毯函数的命令,并添加了
side=3
参数。 -
对于变量名,我认为需要创建一个合适的变量名列表,将其附加到数据中,并以某种方式将其读入源代码。这对我来说仍然太难了。
我将非常感谢任何建议。我也认为,如果其他生态学家使用Elith的论文作为指导,他们可能会遇到相同的问题。
以下是我运行以生成图表的代码示例
gbm.plot(all.sum.tc4.lr001, rug=TRUE, smooth=TRUE, n.plots=9, common.scale=TRUE, write.title = FALSE, show.contrib=TRUE, plot.layout=c(2,3), cex.lab=1.5)
回答:
虽然晚了,但我可以提供一个解决问题3的变通方法:为gbm.plot添加自定义X轴标签。我相信有更好的方法,但这是我所做的。如果您有大量数据并且经常调整使用的变量,这个方法会很有帮助。
步骤1. 找到dismo包中gbm.plot的源代码。选择所有代码,创建一个新脚本,并将函数命名为gbm.plot2。搜索“var.name”。替换任何更改var.name的实例。例如:
var.name <- gbm.call$predictor.names[k]var.name <- x.label
替换为:
var.name <- labels[j]
现在保存脚本并使用source()调用它,或者运行整个脚本以将gbm.plot2添加到全局环境中。
步骤2. 假设我们的数据框名为“df”,有200列。选择您想在gbm.step中调用的列号。
vars <- c(17, 175, 198)
步骤3. 创建一个包含两列的数据框:一列包含您可能感兴趣的所有可能变量名,另一列包含您想要使用的标签。确保ColumnNames确实与“colnames(df)[vars]”中找到的匹配。
ColumnNames <- c("HiHorAve", "Elev", "Type5")Labels <- c("Hi Hello Avenue", "Probably Elevation", "Type 5 of Something")labels <- data.frame(ColumnNames,Labels)
现在按它们在数据框中出现的顺序排列标签。如果您有许多变量并且数据框的形状经常变化,这会很有帮助。
labels <- labels[match(colnames(df)[vars], labels$ColumnNames),]
步骤4. 像这样运行您的gbm.step方程:
BRTmodel<- gbm.step(data=df, gbm.x=vars, gbm.y = 5, .....)
步骤5. 获取模型摘要——它按相对重要性对变量进行排序。然后按相对重要性排列标签。
smry1<- summary(BRTmodel)labels <- labels[order(match(names(df)[vars],smry1$var))]labels <- labels$Labels #将标签提取到一个向量中
步骤6. 现在运行您的新gbm.plot脚本!
gbm.plot2(BRTmodel, n.plots=3, y.label="")
它应该只绘制漂亮的标签。