嗯,看起来没有预先构建的公式界面,所以我继续制作自己的公式界面。你可以从 Github 下载它:https://github.com/hong-Revo/glmnetUtils https://github.com/Hong-Revo/glmnetUtils
或者在 R 中,使用devtools::install_github
:
install.packages("devtools")
library(devtools)
install_github("hong-revo/glmnetUtils")
library(glmnetUtils)
来自自述文件:
一些提高生活质量的功能可简化装配过程
弹性网络模型glmnet
, 具体来说:
-
glmnet.formula
提供公式/数据框接口glmnet
.
-
cv.glmnet.formula
做了类似的事情cv.glmnet
.
- 方法
predict
and coef
对于上述两者。
- 一个功能
cvAlpha.glmnet
通过交叉验证选择 alpha 和 lambda 参数,遵循中描述的方法
的帮助页面cv.glmnet
。可选择进行交叉验证
平行线。
- 方法
plot
, predict
and coef
对于上述情况。
顺便说一句,在写上面的时候,我想我意识到why以前没有人这样做过。 R 处理模型框架和模型矩阵的核心是terms
对象,其中包括一个矩阵,每个变量一行,每个主效应和交互作用一列。实际上,这(至少)大约是p x p矩阵,其中p是模型中变量的数量。什么时候p是 16000,这在当今的宽数据中很常见,所得矩阵的大小约为 1 GB。
尽管如此,我在使用这些对象时还没有遇到任何问题。如果这成为一个主要问题,我会看看是否能找到解决方法。
2016 年 10 月更新
我已向存储库推送了更新,以解决上述问题以及与因素相关的问题。从文档中:
glmnetUtils 可以通过两种方式从公式和数据帧生成模型矩阵。第一种是使用标准 R 机器,包括model.frame
and model.matrix
;第二种是一次构建一个变量矩阵。下面讨论和对比这些选项。
使用 model.frame
这是更简单的选项,也是与其他 R 建模函数最兼容的选项。这model.frame
函数接受一个公式和数据框并返回一个模型架:带有特殊信息的数据框,让 R 能够理解公式中的术语。例如,如果公式包含交互项,则模型框架将指定数据中的哪些列与交互相关,以及应如何处理它们。同样,如果公式包含如下表达式exp(x)
or I(x^2)
在右侧,model.frame
将计算这些表达式并将它们包含在输出中。
使用的主要缺点model.frame
是它生成一个术语对象,该对象对变量和交互的组织方式进行编码。该对象的属性之一是一个矩阵,每个变量一行,每个主效应和交互作用一列。至少,这(大约)是一个 p x p 方阵,其中 p 是模型中主效应的数量。对于 p > 10000 的宽数据集,该矩阵的大小可能接近或超过 1 GB。即使有足够的内存来存储此类对象,生成模型矩阵也可能需要大量时间。
标准 R 方法的另一个问题是因素的处理。通常情况下,model.matrix
会将 N 级因子转化为 N-1 列的指标矩阵,其中删除一列。这对于与 lm 和 glm 拟合的非正则模型是必要的,因为 N 列的完整集合是线性相关的。对于通常的治疗对比,解释是删除的列代表基线水平,而其他列的系数代表相对于基线的响应差异。
这可能不适合与 glmnet 配合的正则化模型。正则化过程将系数缩小到零,这迫使与基线的估计差异更小。但这只有在预先选择基线水平时才有意义,或者作为默认值才有意义;否则,它会有效地使级别更类似于任意选择的级别。
手动构建模型矩阵
为了处理上面的问题,glmnetUtils默认会避免使用model.frame
,而不是逐项构建模型矩阵。这避免了创建一个的内存成本terms
对象,并且可以明显比标准方法更快。它还将在模型矩阵中包含一个因子中所有级别的一列;也就是说,不假设基线水平。在这种情况下,系数表示与总体平均响应的差异,将它们缩小到零是有意义的(通常)。
不使用的主要缺点model.frame
就是公式只能比较简单。目前,只有简单的公式,例如y ~ x1 + x2 + ... + x_p
由代码处理,其中 x 是数据中已存在的列。不支持交互项和计算表达式。如果可能,您应该事先计算此类表达式。
2017 年 4 月更新
经过一番折腾,终于是这样了on CRAN. https://cran.r-project.org/web/packages/glmnetUtils/index.html