我正在使用封装glmnet,我需要运行几个LASSO分析来校准大量变量(整个光谱中每个波长的%反射率)与一个因变量。我对程序和我希望解决的结果有一些疑问。我在下面显示了我的临时代码:
首先,我将数据分成训练(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, ]
然后我将每个目标特征(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
后来,我为训练集运行交叉验证的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")
最后,我使用函数“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))
这是一个简化的代码,到目前为止没有任何问题,重点是我想对整个代码进行循环(一百次重复)并得到交叉验证模型的非零系数以及每次重复的预测值与实际值(对于测试集)的相关系数。我试过但是没有得到任何明确的结果。有人可以给我一些提示吗? 谢谢!
答案 0 :(得分:0)
通常,在相同数据上反复运行相同类型的重复分析可能会非常棘手。在您的情况下,可能没有必要按照您的方式进行概述。
如果您试图找到最具预测性的变量,您可以使用PCA,主成分分析来选择变量中变量和变量之间变化最大的变量,但它根本不考虑您的结果,所以如果你如果模型设计不佳,它会在您的存储库中选择最不相关的数据,但它可能不具有预测性。所以你应该非常了解集合中的所有变量。对于某种线性或逻辑回归,这将是一种减少数据维数的方法。
yourPCA <- prcomp(yourData,
center = TRUE,
scale. = TRUE)
缩放和居中对于使这些模型正常工作至关重要,方法是将各种变量之间的距离设置为0,标准偏差为1.除非你知道自己在做什么,否则我会将它们保留原样。如果您有偏斜或神经数据,您可能需要在PCA之前解决此问题。仅在预测变量上运行此操作...将目标/结果变量保留在数据集之外。
如果您有分类问题,您希望解决大量数据,请尝试LDA,线性判别分析,它通过优化每个预测变量相对于OUTCOME变量的方差来减少变量......它特别考虑到了结果
require(MASS)
yourLDA =r <- lda(formula = outcome ~ .,
data = yourdata)
如果您知道每个类的全局概率,或者您可以将其遗漏,您也可以在LDA中设置先验概率,并且R / lda将从训练集中分配实际类的概率。你可以在这里阅读:
因此,这可以让您通过计算实体方法中的特征选择来朝着正确的方向前进,从而降低数据的复杂性。在通过重复建模来构建最稳健的模型时,这被称为交叉验证。 cv.glm
包中有一个boot
方法可以帮助您以安全的方式处理此问题。
您可以使用以下内容作为粗略指南:
require(boot)
yourCVGLM<- cv.glmnet(y = outcomeVariable, x = allPredictorVariables, family="gaussian", K=100)
。
这里K=100
指定您从当前数据观察中创建100个随机抽样模型而不是变量。
所以这个过程是双重的,使用上述两种方法中的一种减少变量,然后使用交叉验证从重复试验中构建单个模型,而不需要繁琐的循环!
尝试从第41页开始,但要仔细查看整个事情。您所追求的重复采样称为启动,它功能强大,可用于许多不同的模型类型。
没有那么多代码,你可能会希望,但指向你一个不错的方向。