Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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_Glmnet_Lasso Regression_Model.matrix - Fatal编程技术网

R 运行glmnet()的大矩阵

R 运行glmnet()的大矩阵,r,glmnet,lasso-regression,model.matrix,R,Glmnet,Lasso Regression,Model.matrix,我有一个问题,运行glmnet套索与广泛的数据集。我的数据N=50,但p>49000,所有因素。所以要运行glmnet,我必须创建一个model.matrix,但是当我调用model.matrix(公式,数据)时,我的内存就用完了,公式=Class~ 作为一个工作示例,我将生成一个数据集: data <- matrix(rep(0,50*49000), nrow=50) for(i in 1:50) { x = rep(letters[2:8], 7000) y = sample(x=1:

我有一个问题,运行glmnet套索与广泛的数据集。我的数据N=50,但p>49000,所有因素。所以要运行glmnet,我必须创建一个model.matrix,但是当我调用model.matrix(公式,数据)时,我的内存就用完了,公式=Class~

作为一个工作示例,我将生成一个数据集:

data <- matrix(rep(0,50*49000), nrow=50)
for(i in 1:50) {
x = rep(letters[2:8], 7000)
y = sample(x=1:49000, size=49000)
data[i,] <- x[y]
}

data <- as.data.frame(data)
x = c(rep('A', 20), rep('B', 15), rep('C', 15))
y = sample(x=1:50, size=50)
class = x[y]
data <- cbind(data, class)

数据我询问了特雷弗·黑斯蒂教授,得到了以下建议:

“你好,弗拉维奥

model.matrix要杀了你。 您将有49K个因子,模型矩阵试图将它们表示为对比度,这将是6列矩阵,因此49*6约300K列。 为什么不制作二进制虚拟变量(每个因子7个),直接构造它而不使用model.matrix呢 这是通过sparseMatrix实现的(glmnet接受稀疏矩阵格式)”

我就是这么做的,而且做得非常好。我认为这对其他人是有用的

一篇包含代码的文章由此问题产生:

为了避免断开链接,我将在此处发布部分帖子:

公式方法的问题是,一般来说,基因组数据的列数比观察数多。我在那个案例中使用的数据有40000列,只有73个观察值。要创建一小组测试数据,请运行以下代码:

for(i in 1:50) {
    x = rep(letters[2:8], 7000)
    y = sample(x=1:49000, size=49000)
    data[i,] <- x[y]
}

data <- as.data.frame(data)
x <- c(rep('A', 20), rep('B', 15), rep('C', 15))
y <- sample(x=1:50, size=50)
class = x[y]
data <- cbind(data, class)
for(1:50中的i){
x=代表(字母[2:8],7000)
y=样品(x=1:49000,尺寸=49000)

数据[i,]可能感兴趣的人。我开发了一个名为
biglasso
的R包,它适合大数据的套索类型模型。它使用内存映射(Big)基于
bigmemory
包设计矩阵,可无缝处理大于RAM的数据。此外,与
glmnet
相比,通过使用新提出的特征筛选规则以及更好的实现,它的计算和内存效率更高。请查看详细信息,并随时提供任何建议s/comments.

需要更多RAM。(或者用最少的应用程序和数据重新启动。)这只是一个24MB宽的对象。我只有50个样本。我不敢相信没有解决方案!我没有说没有解决方案。你也可以尝试
Matrix::sparse.model.Matrix
MatrixModels::modelMatrix(*,sparse=TRUE)
那不行!!!自己试试这个例子。用sparse.model.matrix创建的对象要大得多。我在发布这个问题之前就试过了。@FlavioBarros-也许可以添加一个你使用的代码示例?我认为这会很有帮助。这是最好的答案吗?似乎不方便。为了避免断开链接,最好将代码添加到答案中。@MartínBel,问题已经解决。谢谢你的建议。当你用谷歌搜索
r glmnet时,这个线程就会出现。所以,这个信息的好地方,即使对OP没有好处。谢谢你的帮助。这很好。但是biglasso不支持AUC评估指标
for(i in 1:50) {
    x = rep(letters[2:8], 7000)
    y = sample(x=1:49000, size=49000)
    data[i,] <- x[y]
}

data <- as.data.frame(data)
x <- c(rep('A', 20), rep('B', 15), rep('C', 15))
y <- sample(x=1:50, size=50)
class = x[y]
data <- cbind(data, class)
formula <- as.formula(class ~ .)
X <- model.matrix(formula, data)
model <- cv.glmnet(X, class, standardize=FALSE, family='multinomial', alpha=1, nfolds=10)
## Creates a matrix using the first column
X <- sparse.model.matrix(~data[,1]-1)

## Check if the column have more then one level
for (i in 2:ncol(data)) {

## In the case of more then one level apply dummy coding 
if (nlevels(data[,i])>1) {
    coluna <- sparse.model.matrix(~data[,i]-1)
    X <- cBind(X, coluna)
}
## Transform fator to numeric
else {
   coluna <- as.numeric(as.factor(data[,i]))
   X <- cBind(X, coluna)
}
mod.lasso <- cv.glmnet(X, class, standardize=FALSE, family='multinomial', alpha=1, nfolds=10)