在logit尺度上并在gbm.plot中居中的Y轴

我目前正在探索dismo包中的gbm函数,以创建用于物种分布建模的提升回归树。我使用了dismo的示例文档以及Elith等人于2008年在《动物生态学杂志》上发表的论文《提升回归树的工作指南》。在Elith等人的文章的第808至809页,作者解释了部分依赖图,并在第809页底部给出了一个例子(图6)。根据dismo的示例文档《用于生态建模的提升回归树》,gbm.plot“绘制响应变量对一个或多个预测变量的部分依赖关系”。

Gbm.plot创建的图形几乎与Elith等人论文中的例子完全相同。然而,有几个参数我无法设置以达到与论文中完全相同的图形效果。

  1. 论文中的Y轴采用logit尺度,并居中以使数据分布的平均值为零。gbm.plot中的Y轴表示拟合函数。

  2. 论文中的地毯图位于图表顶部,而gbm.step中的地毯图位于底部。

  3. Gbm.plot使用变量名作为X轴标签。论文中使用了有意义的轴标签。

以下是Elith论文中的图与使用gbm.plot生成的图的对比

Elith等人2009年的图6Elith等人2009年的图6

来自gbm.plot的图来自gbm.plot的图

我的解决方案

在寻找解决方案时,我发现了这个问题,它让我想到查看源代码(这是我第一次这样做)。通过源代码,我能够很好地了解函数的构成,但仍有许多我不理解的地方。

  1. 我不确定如何更改Y轴以转换为logit尺度并居中,使其平均值为零。

  2. 我能够更改源代码,将地毯图移到图表顶部。我找到了地毯函数的命令,并添加了side=3参数。

  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="")

它应该只绘制漂亮的标签。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注