LASSO分析(glmnet包)。我可以循环分析和结果提取吗?

时间:2018-01-17 10:36:14

标签: r glmnet

我正在使用封装glmnet,我需要运行几个LASSO分析来校准大量变量(整个光谱中每个波长的%反射率)与一个因变量。我对程序和我希望解决的结果有一些疑问。我在下面显示了我的临时代码:

  1. 首先,我将数据分成训练(70%的n)和测试集。

    smp_size <- floor(0.70 * nrow(mydata))
    set.seed(123)
    train_ind <- sample(seq_len(nrow(mydata)), size = smp_size)
    train <- mydata[train_ind, ]
    test <- mydata[-train_ind, ]
    
  2. 然后我将每个目标特征(y)和自变量(x)分开,如下所示:

    vars.train <- train[3:2153]
    vars.test <- test[3:2153]
    
    x.train <- data.matrix(vars.train)
    x.test <- data.matrix(vars.test)
    y.train <- train$X1
    y.test <- test$X1
    
  3. 后来,我为训练集运行交叉验证的LASSO模型,并提取和写入lambdamin的非零系数。这是因为我的一个问题是要注意模型选择哪些变量(反射光谱的波段)。

    install.packages("glmnet")
    library(glmnet)
    cv.lasso.1 <- cv.glmnet(y=y.train, x= x.train, family="gaussian", nfolds = 
    5, standardize=TRUE, alpha=1)
    
    coef(cv.lasso.1,s=cv.lasso.1$lambda.min) # Using lambda min.
    (cv.lasso.1)
    
    install.packages("broom")
    library(broom)
    c <- tidy(coef(cv.lasso.1, s="lambda.min"))
    write.csv(c, file = "results") 
    
  4. 最后,我使用函数“predict”并将对象“cv.lasso1”(先前获得的模型)应用于测试集(x.2)的变量,以获得对变量和我运行测试集的Y的预测值和实际值之间的相关性。

    predict.1.2 <- predict(cv.lasso.1, newx=x.2, type = "response", s = 
    "lambda.min")
    cor.test(x=c(predict.1.2), y=c(y.2))  
    
  5. 这是一个简化的代码,到目前为止没有任何问题,重点是我想对整个代码进行循环(一百次重复)并得到交叉验证模型的非零系数以及每次重复的预测值与实际值(对于测试集)的相关系数。我试过但是没有得到任何明确的结果。有人可以给我一些提示吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

通常,在相同数据上反复运行相同类型的重复分析可能会非常棘手。在您的情况下,可能没有必要按照您的方式进行概述。

如果您试图找到最具预测性的变量,您可以使用PCA,主成分分析来选择变量中变量和变量之间变化最大的变量,但它根本不考虑您的结果,所以如果你如果模型设计不佳,它会在您的存储库中选择最不相关的数据,但它可能不具有预测性。所以你应该非常了解集合中的所有变量。对于某种线性或逻辑回归,这将是一种减少数据维数的方法。

You can read about it here

yourPCA <- prcomp(yourData, center = TRUE, scale. = TRUE)

缩放和居中对于使这些模型正常工作至关重要,方法是将各种变量之间的距离设置为0,标准偏差为1.除非你知道自己在做什么,否则我会将它们保留原样。如果您有偏斜或神经数据,您可能需要在PCA之前解决此问题。仅在预测变量上运行此操作...将目标/结果变量保留在数据集之外。

如果您有分类问题,您希望解决大量数据,请尝试LDA,线性判别分析,它通过优化每个预测变量相对于OUTCOME变量的方差来减少变量......它特别考虑到了结果

require(MASS) yourLDA =r <- lda(formula = outcome ~ ., data = yourdata)

如果您知道每个类的全局概率,或者您可以将其遗漏,您也可以在LDA中设置先验概率,并且R / lda将从训练集中分配实际类的概率。你可以在这里阅读:

LDA from MASS package

因此,这可以让您通过计算实体方法中的特征选择来朝着正确的方向前进,从而降低数据的复杂性。在通过重复建模来构建最稳健的模型时,这被称为交叉验证。 cv.glm包中有一个boot方法可以帮助您以安全的方式处理此问题。

您可以使用以下内容作为粗略指南:

require(boot) yourCVGLM<- cv.glmnet(y = outcomeVariable, x = allPredictorVariables, family="gaussian", K=100)。 这里K=100指定您从当前数据观察中创建100个随机抽样模型而不是变量。

所以这个过程是双重的,使用上述两种方法中的一种减少变量,然后使用交叉验证从重复试验中构建单个模型,而不需要繁琐的循环!

Read about cv.glm here

尝试从第41页开始,但要仔细查看整个事情。您所追求的重复采样称为启动,它功能强大,可用于许多不同的模型类型。

没有那么多代码,你可能会希望,但指向你一个不错的方向。