我正在为 R 使用caret包来为我的模型选择变量。使用rfe命令时,应传递 rfeControl 对象,该对象具有方法参数。此参数的选项有 boot、cv、LOOCV 和 LGOCV。由于我正在处理时间序列数据,因此我需要使用特殊的引导/交叉验证技术,因为普通技术不适用于时间序列数据(否则分布会损坏等)。
我的问题是如何插入我自己的引导实现但仍使用插入符号rfe方法,该方法具有我需要的所有其他东西。
没有简单的方法。如果您研究代码,rfe.default()
您会注意到在使用method = "boot"
该createResample()
函数的情况下。这是生成引导样本的函数。类似的函数用于其他 CV 方法。
有一条艰难的路;超越create*()
最合适的功能;说你想做一个block bootstrap或者ME bootstrap,接管createResample()
功能并使用method = "boot"
,或者如果你想要一个特殊形式的CV,使用method = "cv"
并接管createFolds()
。
您将需要编写自己的create*()
函数并将插入符号 NAMESPACE 中的函数替换为您的版本。不容易,但非常可行。假设您编写自己的createResample()
函数;首先,您需要注意,此函数会创建n = times
bootstrap 样本,并将其返回到一个矩阵中,该矩阵的times
列数和行数与您的样本数一样多。您需要编写一个自定义createResample()
函数,该函数返回相同的对象,但执行您想要使用的时间序列引导。
编写完该函数后,您需要将其放入 caret 命名空间,以便 caret 包中的函数使用它。为此,您使用assignInNamespace()
. 假设您的新引导函数被调用createMyResample()
并且它是您的工作区,要将其插入到插入符号命名空间中,请执行以下操作:
assignInNamespace("createResample", createMyResample, ns = "caret")
抱歉,我不能更具体,但你没有说你希望如何执行 bootstrap/CV,也没有说你想用什么 R 代码来进行重采样。如果您提供有关如何进行重采样的更多详细信息,我会再看一下,看看我是否可以帮助您编写create*()
函数。
如果没有这一切,请联系 caret 的作者和维护者 Max Kuhn;他可能会提供进一步的建议,或者至少您可以建议将此功能作为未来版本的愿望清单。