Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R glmnet的公式接口_R_Formula_Glmnet - Fatal编程技术网

R glmnet的公式接口

R glmnet的公式接口,r,formula,glmnet,R,Formula,Glmnet,在过去的几个月里,我参与了许多项目,在这些项目中,我使用了glmnet包来适应弹性网络模型。这很好,但与大多数R建模功能相比,界面非常简单。特别是,您必须给出响应向量和预测矩阵,而不是指定公式和数据帧。您还失去了常规接口提供的许多生活质量方面的东西,例如,对因素的合理处理、缺少值、将变量放入正确的顺序等 因此,我通常会编写自己的代码来重新创建公式/数据帧接口。由于客户的机密性问题,我最终也留下了这段代码,不得不为下一个项目重新编写。我想我不妨咬紧牙关,创建一个实际的包来实现这一点。然而,在我这样

在过去的几个月里,我参与了许多项目,在这些项目中,我使用了
glmnet
包来适应弹性网络模型。这很好,但与大多数R建模功能相比,界面非常简单。特别是,您必须给出响应向量和预测矩阵,而不是指定公式和数据帧。您还失去了常规接口提供的许多生活质量方面的东西,例如,对因素的合理处理、缺少值、将变量放入正确的顺序等

因此,我通常会编写自己的代码来重新创建公式/数据帧接口。由于客户的机密性问题,我最终也留下了这段代码,不得不为下一个项目重新编写。我想我不妨咬紧牙关,创建一个实际的包来实现这一点。然而,在我这样做之前,有几个问题:

  • 是否存在使公式/数据框接口与弹性网络模型的使用复杂化的问题?(我知道,广泛的数据集可能需要稀疏的模型矩阵。)
  • 是否有任何现有的包可以这样做

嗯,看起来好像没有预先构建的公式界面,所以我继续做了自己的。您可以从Github下载:

或者在R中,使用
devtools::install\u github

install.packages("devtools")
library(devtools)
install_github("hong-revo/glmnetUtils")
library(glmnetUtils)
自述文件:

一些生活质量函数可以简化装配过程 带有
glmnet
的弹性网络模型,具体如下:

  • glmnet.formula
    glmnet
    提供公式/数据帧接口
  • cv.glmnet.formula
    cv.glmnet
    执行类似的操作
  • 预测
    coef
    的方法
  • 函数
    cvAlpha.glmnet
    通过交叉验证选择alpha和lambda参数,方法如中所述
    cv.glmnet
    的帮助页面。交叉验证是否在 平行
  • 上述方法的
    绘图
    预测
    coef
顺便说一句,在写上述内容时,我想我意识到了为什么以前没有人这样做。R处理模型框架和模型矩阵的核心是
术语
对象,它包括一个矩阵,每个变量一行,每个主效应和交互一列。实际上,这(至少)大致是一个pxp矩阵,其中p是模型中变量的数量。当p为16000时(这在如今的大数据中很常见),生成的矩阵大小约为1 GB

不过,我在使用这些对象时还没有遇到任何问题。如果这成为一个主要问题,我会看看是否能找到解决办法


更新日期:2016年10月 我推动了回购协议的更新,以解决上述问题以及与因素相关的问题。从文件中:

GLMNETILS可以通过两种方式从公式和数据框中生成模型矩阵。第一种是使用标准R机械,包括
model.frame
model.matrix
;第二个是一次构建一个变量的矩阵。下面将对这些选项进行讨论和对比

使用model.frame 这是一个更简单的选项,也是与其他R建模功能最兼容的选项。
model.frame
函数接受公式和数据框并返回一个模型框:一个附加了特殊信息的数据框,可以让R理解公式中的术语。例如,如果公式包含交互项,则模型框架将指定数据中与交互相关的列,以及应如何处理这些列。类似地,如果公式包含RHS上的表达式,如
exp(x)
I(x^2)
,则
model.frame
将计算这些表达式并将其包含在输出中

使用
model.frame
的主要缺点是它生成一个术语对象,该对象对变量和交互的组织方式进行编码。该对象的属性之一是矩阵,每个变量一行,每个主效果和交互一列。至少,这是(近似)一个p x p平方矩阵,其中p是模型中主要影响的数量。对于p>10000的宽数据集,此矩阵的大小可能接近或超过千兆字节。即使有足够的内存来存储这样的对象,生成模型矩阵也可能需要大量的时间

标准R方法的另一个问题是因子的处理。通常,
model.matrix
会将一个N级因子转换为一个包含N-1列的指标矩阵,其中一列被删除。这对于适合lm和glm的未规范化模型是必要的,因为完整的N列集是线性相关的。与通常的治疗对比,解释是下降列代表基线水平,而其他列的系数代表相对于基线的响应差异

这可能不适用于符合glmnet的正则化模型。正则化过程将系数收缩到零,这将迫使估计值与基线的差值变小。但这只有在事先选择了基线水平,或者作为默认值有意义时才有意义;否则,它将有效地使级别更类似于任意选择的级别

手动构建模型矩阵 为了解决上述问题,默认情况下,GLMNETILS将避免使用
model.frame
,而是逐项建立模型矩阵。这避免了创建
术语
对象的内存开销,并且可以明显快于标准方法。它还将在模型矩阵中为所有