预测cv.glmnet为每一行r给出相同的值

3

我正在使用 cv.glmnet 对一个包含基因型的二元数据集进行分析,以预测连续性变量的表型。数据大致如下,但包含超过 200 个基因:

       Pheno K00074 K00100 K00179 K00180
1  18.063630      0      0      0      0
2  16.746644      0      0      0      0
3  16.016194      1      0      0      0
4  -1.469207      1      1      0      0
5  -3.047956      1      0      1      1
6  15.274531      1      0      0      0 

我使用 cv.glmnetpredict 的代码如下:

cv.lasso <- cv.glmnet(x = as.matrix(zx), y = unlist(zy), alpha = 1,
                      type.measure = 'mse',keep = TRUE) # runs the model
    
prediction<-predict(cv.lasso,s = cv.lasso$lambda.1se,
                    newx = as.matrix(batch1218.kegg[,-1]),type = 'class')

其中zx是基因存在/缺失的二进制列,zy是表型列。batch1218.kegg是我想用来预测表型的新的基因型数据。然而,我的预测结果看起来像这样:

         1
1 6.438563
2 6.438563
3 6.438563
4 6.438563
5 6.438563
6 6.438563

每一行的数字都相同。其他表型也出现了相同的情况。我想问题可能是我只使用了大约38行表型数据,相对于大量的预测变量。但我想要确定是否存在其他问题。


我们可能需要更多的数据来帮助您,通常最好发布足够的数据以复制问题。您可以在数据子集上使用 dput(例如您在此处提供的6行)- 我们需要一些 zxzybatch1218.kegg 来尝试解决问题。 - Andy Baxter
1
@AndrewBaxter 对不起,我在这里提问还是个新手。不过我想我已经找到了问题所在,那就是套索回归会将所有系数收缩至0,因此大多数表型实际上没有任何预测能力。对于那些确实有一些显著基因的表型,预测结果也存在一定的变异性。 - rholeepoly
2个回答

1
这通常发生在您选择的 Lambda 函数错误时。尝试使用 "lambda.min"。

0

以下是使用示例数据集重现您的错误:

library(glmnet)

data = data.frame(Pheno=rnorm(200),K00074=rbinom(200,1,0.5),
K00100=rbinom(200,1,0.5),K00179=rbinom(200,1,0.5),K00180=rbinom(200,1,0.5))

zx = data[1:100,-1]
zy = data$Pheno[1:100]

batch1218.kegg = data[101:200,]

cv.lasso <- cv.glmnet(x = as.matrix(zx), y = unlist(zy), alpha = 1,
                      type.measure = 'mse',keep = TRUE) # runs the model

prediction<-predict(cv.lasso,s = cv.lasso$lambda.1se,
                    newx = as.matrix(batch1218.kegg[,-1]),type = 'class')

head(prediction)
             1
101 0.07435786
102 0.07435786
103 0.07435786
104 0.07435786
105 0.07435786
106 0.07435786

你的因变量是连续的,也就是说这是回归问题,类型不应该是“类别”,但无论如何,如果所有最佳拟合都在将所有变量减少到零时出现,那么你只会得到截距作为非零值,因此所有预测结果都是相同的数值:

coef(cv.lasso,s=cv.lasso$lambda.1se)
5 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept) 0.07435786
K00074      .         
K00100      .         
K00179      .         
K00180      . 

从你的数据框来看,如果你只有4个自变量/预测变量,使用Lasso回归会过度。你可以只应用简单的线性回归:

head(predict(glm(Pheno ~ .,data=data[1:100,])))
          1           2           3           4           5           6 
 0.21560938  0.28477818  0.28477818 -0.05017303 -0.11487138 -0.18404019 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接