我正在尝试glmnet
在数据集上使用该包.我正在使用cv.glmnet()
获取lambda值glmnet()
.这是数据集和错误消息:
> head(t2)
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12
1 1 1 0.7661266 45 2 0.80298213 9120 13 0 6 0 2
2 2 0 0.9571510 40 0 0.12187620 2600 4 0 0 0 1
3 3 0 0.6581801 38 1 0.08511338 3042 2 1 0 0 0
4 4 0 0.2338098 30 0 0.03604968 3300 5 0 0 0 0
5 5 0 0.9072394 49 1 0.02492570 …
Run Code Online (Sandbox Code Playgroud) 我想提取glmnet生成的模型系数并从中创建一个SQL查询.该函数 coef(cv.glmnet.fit)
产生一个' dgCMatrix
'对象.当我使用时将其转换为矩阵时as.matrix
,变量名称将丢失,只留下系数值.
我知道可以在屏幕上打印系数,但是可以将名称写入数据框吗?
任何人都可以帮助提取这些名字吗?
我正在尝试glmnet
在数据集上使用该包.我正在使用cv.glmnet()
获取lambda值glmnet()
.我将它们排除在第1,2,7,12列之外:id列,响应列,包含NA,并包含NA.
这是数据集和错误消息:
> head(t2)
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12
1 1 1 0.7661266 45 2 0.80298213 9120 13 0 6 0 2
2 2 0 0.9571510 40 0 0.12187620 2600 4 0 0 0 1
3 3 0 0.6581801 38 1 0.08511338 3042 2 1 0 0 0
4 4 0 0.2338098 30 0 0.03604968 3300 5 0 0 0 0
5 5 0 0.9072394 49 1 …
Run Code Online (Sandbox Code Playgroud) 我有一个问题,用宽数据集运行glmnet套索.我的数据N = 50,但p> 49000,所有因素.所以要运行glmnet,我必须创建一个model.matrix,但是当我调用model.matrix(formula,data)时,我的内存耗尽,其中formula = 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)
Run Code Online (Sandbox Code Playgroud)
之后,我尝试创建一个model.matrix进入glmnet.
formula <- as.formula(class ~ .)
X = model.matrix(formula, data)
model <- cv.glmnet(X, class, standardize=FALSE, family='multinomial', alpha=1, nfolds=10)
Run Code Online (Sandbox Code Playgroud)
在最后一步(X = model.matrix ...),我的内存不足.我能做什么?
我有一个8列的x矩阵.我想跑glmnet
去做套索回归.我知道我需要打电话:
glmnet(x, y, family = "binomial", ...).
Run Code Online (Sandbox Code Playgroud)
但是,我如何x
考虑所有单向交互呢?我是否必须手动重新制作数据框:如果是,是否有更简单的方法?我想我希望用R公式做点什么.
我正在运行67个观察和32个变量的回归.我正在使用glmnet包中的cv.glmnet函数进行变量选择.我想强制一个变量进入模型.(它在正常过程中被删除.)如何在cv.glmnet中指定此条件?
谢谢!
我的代码如下所示:
glmntfit <- cv.glmnet(mydata[,-1], mydata[,1])
coef(glmntfit, s=glmntfit$lambda.1se)
Run Code Online (Sandbox Code Playgroud)
我想要的变量是mydata [,2].
我有一个带二元结果的回归模型.我用glmnet拟合了模型并得到了选定的变量及其系数.
由于glmnet不计算变量重要性,我想将精确输出(选定变量及其系数)提供给glm以获取信息(标准错误等).
我搜索了r文件,似乎我可以在glm中使用"method"选项来指定用户定义的函数.但我没有这样做,有人可以帮助我吗?
我使用以下代码与glmnet:
> library(glmnet)
> fit = glmnet(as.matrix(mtcars[-1]), mtcars[,1])
> plot(fit, xvar='lambda')
Run Code Online (Sandbox Code Playgroud)
但是,我想打印最好的Lambda系数,就像在岭回归中一样.我看到以下适合的结构:
> str(fit)
List of 12
$ a0 : Named num [1:79] 20.1 21.6 23.2 24.7 26 ...
..- attr(*, "names")= chr [1:79] "s0" "s1" "s2" "s3" ...
$ beta :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
.. ..@ i : int [1:561] 0 4 0 4 0 4 0 4 0 4 ...
.. ..@ p : int [1:80] 0 0 2 4 6 8 10 12 …
Run Code Online (Sandbox Code Playgroud) 在过去的几个月里,我参与了许多项目,在这些项目中,我使用了这个glmnet
包,以适应弹性网模型.它很棒,但与大多数R建模功能相比,界面相当简陋.特别是,您必须提供响应向量和预测矩阵,而不是指定公式和数据框.你也会失去常规界面提供的许多生活质量的东西,例如对因子的敏感(?)处理,缺失值,将变量放入正确的顺序等等.
所以我通常最终编写自己的代码来重新创建公式/数据框架界面.由于客户机密性问题,我最终还是留下了这个代码,不得不再次为下一个项目编写代码.我想我也可以咬紧牙关并创建一个实际的包来做到这一点.但是,在我这样做之前有几个问题:
在我的数据集中,我有许多连续和虚拟变量.对于使用glmnet进行分析,我希望连续变量是标准化的,而不是虚拟变量.
我目前通过首先定义仅具有[0,1]值的列的虚拟向量然后scale
在所有非虚拟列上使用该命令来手动执行此操作.问题是,这不是很优雅.
但是glmnet有一个内置的standardize
论点.默认情况下这会使假人标准化吗?如果是这样,有没有一种优雅的方式来告诉glmnet的standardize
论点跳过假人?
glmnet ×10
r ×10
regression ×3
formula ×2
bigdata ×1
coefficients ×1
dataset ×1
glm ×1
interaction ×1
lambda ×1
model.matrix ×1
statistics ×1