带 Cox 回归的弹性网络
Elastic net with Cox regression
我正在尝试对具有 ~100k 特征的 120 个样本执行带 cox 回归的弹性网络。
我用 glmnet 包尝试了 R,但 R 不支持大矩阵(似乎 R 不是为 64 位设计的)。此外,包 glmnet 确实支持稀疏矩阵,但无论出于何种原因,他们都没有实现稀疏矩阵 + cox 回归。
我不是在推动 R,但这是我迄今为止找到的唯一工具。任何人都知道我可以使用什么程序来计算大模型上的弹性网 + cox 回归?我读过我可以使用支持向量机,但我需要先计算模型,由于上述限制,我不能在 R 中这样做。
编辑:
澄清一点。我没有报告 R 中的错误,因为显然 R 受其矩阵可以容纳多少元素的限制是正常的(至于 glmnet 不支持稀疏矩阵 + cox 我不知道)。我不是在推动一个工具,但如果有另一个包或一个独立的程序可以执行我正在寻找的东西,那会更容易。
如果有人有想法或之前已经这样做过,请分享您的方法(R、Matlab 等)。
编辑 2:
这是我用来测试的:
我制作了一个 100x100000 的矩阵。添加标签并尝试使用 model.matrix.
创建模型
data <- matrix(rnorm(100*100000), 100, 100000)
formula <- as.formula(class ~ .)
x = c(rep('A', 40), rep('B', 30), rep('C', 30))
y = sample(x=1:100, size=100)
class = x[y]
data <- cbind(data, class)
X <- model.matrix(formula, data)
我得到的错误:
Error: cannot allocate vector of size 37.3 Gb
In addition: Warning messages:
1: In terms.formula(object, data = data) :
Reached total allocation of 12211Mb: see help(memory.size)
2: In terms.formula(object, data = data) :
Reached total allocation of 12211Mb: see help(memory.size)
3: In terms.formula(object, data = data) :
Reached total allocation of 12211Mb: see help(memory.size)
4: In terms.formula(object, data = data) :
Reached total allocation of 12211Mb: see help(memory.size)
提前致谢! :)
编辑 3:
感谢@marbel,我能够构建一个有效且不会变得太大的测试模型。看来我的问题来自于在我的测试中使用 cbind。
一些提示:
a) 这是一个相当小的数据集,R 应该绰绰有余。您所需要的只是一台现代计算机,这意味着相当数量的 RAM。我想对于这么小的数据集,4GB 应该足够了。
该包在 Julia 和 Python 中可用,但我不确定该模型是否可用。
Here and here 您有带有 GLMNET 包的 cox 模型示例。还有一个包叫 survival
.
您的代码至少有两个问题:
- 这不是你想在 R 中做的事情:
data <- cbind(data, class)
。只是内存效率不高。如果您需要执行此类操作,请使用 data.table
package。它允许通过引用进行赋值,查看 :=
运算符。
- 如果您的所有数据都是数字,则不需要使用
model.matrix
,只需使用 data.matrix(X)
。
- 如果您有分类变量,请仅对它们使用
model.matrix
,然后将它们添加到 X 矩阵,也许使用 data.table
,一次使用 ?data.table::set
或:=
运算符。
希望这可以帮助您调试代码。祝你好运!
我正在尝试对具有 ~100k 特征的 120 个样本执行带 cox 回归的弹性网络。
我用 glmnet 包尝试了 R,但 R 不支持大矩阵(似乎 R 不是为 64 位设计的)。此外,包 glmnet 确实支持稀疏矩阵,但无论出于何种原因,他们都没有实现稀疏矩阵 + cox 回归。
我不是在推动 R,但这是我迄今为止找到的唯一工具。任何人都知道我可以使用什么程序来计算大模型上的弹性网 + cox 回归?我读过我可以使用支持向量机,但我需要先计算模型,由于上述限制,我不能在 R 中这样做。
编辑: 澄清一点。我没有报告 R 中的错误,因为显然 R 受其矩阵可以容纳多少元素的限制是正常的(至于 glmnet 不支持稀疏矩阵 + cox 我不知道)。我不是在推动一个工具,但如果有另一个包或一个独立的程序可以执行我正在寻找的东西,那会更容易。
如果有人有想法或之前已经这样做过,请分享您的方法(R、Matlab 等)。
编辑 2:
这是我用来测试的: 我制作了一个 100x100000 的矩阵。添加标签并尝试使用 model.matrix.
创建模型data <- matrix(rnorm(100*100000), 100, 100000)
formula <- as.formula(class ~ .)
x = c(rep('A', 40), rep('B', 30), rep('C', 30))
y = sample(x=1:100, size=100)
class = x[y]
data <- cbind(data, class)
X <- model.matrix(formula, data)
我得到的错误:
Error: cannot allocate vector of size 37.3 Gb
In addition: Warning messages:
1: In terms.formula(object, data = data) :
Reached total allocation of 12211Mb: see help(memory.size)
2: In terms.formula(object, data = data) :
Reached total allocation of 12211Mb: see help(memory.size)
3: In terms.formula(object, data = data) :
Reached total allocation of 12211Mb: see help(memory.size)
4: In terms.formula(object, data = data) :
Reached total allocation of 12211Mb: see help(memory.size)
提前致谢! :)
编辑 3: 感谢@marbel,我能够构建一个有效且不会变得太大的测试模型。看来我的问题来自于在我的测试中使用 cbind。
一些提示:
a) 这是一个相当小的数据集,R 应该绰绰有余。您所需要的只是一台现代计算机,这意味着相当数量的 RAM。我想对于这么小的数据集,4GB 应该足够了。
该包在 Julia 和 Python 中可用,但我不确定该模型是否可用。
Here and here 您有带有 GLMNET 包的 cox 模型示例。还有一个包叫 survival
.
您的代码至少有两个问题:
- 这不是你想在 R 中做的事情:
data <- cbind(data, class)
。只是内存效率不高。如果您需要执行此类操作,请使用data.table
package。它允许通过引用进行赋值,查看:=
运算符。 - 如果您的所有数据都是数字,则不需要使用
model.matrix
,只需使用data.matrix(X)
。 - 如果您有分类变量,请仅对它们使用
model.matrix
,然后将它们添加到 X 矩阵,也许使用data.table
,一次使用?data.table::set
或:=
运算符。
希望这可以帮助您调试代码。祝你好运!