在甲基化数据上使用 glmnet 进行特征选择和模型 (p>>N)

机器算法验证 r 正则化 网络 弹性网 下定决心
2022-01-17 02:07:29

我想使用 GLM 和 Elastic Net 来选择那些相关的特征 + 建立一个线性回归模型(即预测和理解,所以最好保留相对较少的参数)。输出是连续的。它是20000每个基因50案例。我一直在阅读有关该glmnet软件包的信息,但我不能 100% 确定要遵循的步骤:

  1. 执行 CV 以选择 lambda:
    cv <- cv.glmnet(x,y,alpha=0.5)
    (Q1)给定输入数据,您会选择不同的 alpha 值吗?
    (Q2)在构建模型之前我需要做其他事情吗?

  2. 拟合模型:
    model=glmnet(x,y,type.gaussian="covariance",lambda=cv$lambda.min)
    (Q3)有什么比“协方差”更好的吗?
    (Q4)如果 lambda 被 CV 选择,为什么这一步需要nlambda=
    (Q5)lambda.min使用还是更好lambda.1se

  3. 获取系数,以查看哪些参数已失效(“.”):
    predict(model, type="coefficients")

    在帮助页面中有许多predict方法(例如,predict.fishnetpredict.glmnetpredict.lognet等)。但是,正如我在一个例子中看到的那样,任何“简单”的预测。
    (Q6)我应该使用predictorpredict.glmnet还是other?

尽管我读过关于正则化方法的内容,但我在 R 和这些统计包中还是很新的,所以很难确定我是否正在使我的问题适应代码。任何建议都将受到欢迎。

更新
基于“如前所述,类 train 的对象包含一个finalModel名为模型的预测函数。”

caret用于调整 alpha 和 lambda

  trc = trainControl(method=cv, number=10)  
  fitM = train(x, y, trControl = trC, method="glmnet")  

是否fitM替换之前的步骤 2?如果是这样,现在如何指定 glmnet 选项(type.gaussian="naive",lambda=cv$lambda.min/1se)?
接下来的predict步骤,我可以替换modelfitM吗?

如果我做

  trc = trainControl(method=cv, number=10)  
  fitM = train(x, y, trControl = trC, method="glmnet")  
  predict(fitM$finalModel, type="coefficients")

这是否有意义,还是我错误地混合了两个包词汇?

1个回答

第1部分

在弹性网络中,采用了两种类型的参数约束

  1. 套索约束(即关于绝对值的大小βj)
  2. 岭约束(即关于平方值的大小βj)

α控制两种类型的相对权重。Lasso 约束允许选择/删除模型中的变量。岭约束可以处理共线变量。您更重视哪一个将取决于数据属性;许多相关变量可能需要这两种约束,一些相关变量可能表明更加强调脊约束。

解决这个问题的一种方法是治疗α作为调优参数λ并使用提供最低 CV 误差的值,以与调整相同的方式λ目前与cv.glmnet.

R 包caret可以使用glmnet包构建模型,并且应该设置为调整这两个参数αλ.

第2部分

第三季度

是的,在这种情况下mn(变量数观察次数),?glmnet建议使用的帮助页面

type.gaussian = "naive"

而不是存储沿途计算的所有内积,这对于大量变量或当mn,"naive"选项将循环n每次都需要电脑内积。

如果您没有指定此参数,则无论如何glmnet都会选择"naive"m>500,但最好明确指定这一点,以防默认值和选项稍后在包中更改,并且您将在将来的某个日期运行代码。

第四季度

简短的回答,您现在不需要指定一个高值,nlambda因为您已经选择了一个最佳值,条件是α=0.5. 但是,如果你想绘制系数路径等,那么有一组适度的值λ在间隔上会产生一组更好的路径。相对于一个特定路径执行整个路径的计算负担λ并不是那么好,这是为了正确地完成这项工作而开发算法的大量努力的结果。我只会保留nlambda默认值,除非它在计算时间上有明显差异。

Q5

这是一个关于简约的问题。期权是lambda.min指价值λCV 误差最低。这个值的误差λ是误差的平均值k折叠,因此这个误差估计是不确定的。代表的lambda.1se价值λ在比最佳模型 ( lambda.min) 更简单的搜索中,但其误差在最佳模型的1 个标准误差内。换句话说,使用 的值lambda.1se作为选择的值λ产生的模型比最佳模型略简单,但鉴于误差的不确定性,无法将其与最佳模型区分开来k-fold CV 估计最佳模型的误差。

这是你的选择:

  1. 可能过于复杂或略微过度拟合的最佳模型:lambda.min
  2. 在给定不确定性的情况下,与最佳模型具有可比误差的最简单模型:lambda.1se

第 3 部分

这是一个简单的函数,你会在 R 中遇到很多。你在predict()99.9% 的时间里都在使用这个函数。R 将为作为第一个参数提供的对象安排使用正确的函数。

从技术上讲,predict它是一个通用函数,它具有用于不同类型(技术上称为类)对象的方法(函数的版本)。由 所创建的对象具有特定的类(或多个类),具体取决于实际安装的模型类型。glmnet (包)为这些不同类型的对象的函数提供方法。R 知道这些方法,并将根据提供的对象的类选择合适的方法。glmnetpredict