预测cv.glmnet给我每行r相同的值

时间:2020-02-27 13:48:23

标签: r regression prediction glmnet

我正在对基因型的二进制数据集使用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行的表型数据。但是想看看我是否正在处理另一个问题。

2 个答案:

答案 0 :(得分:0)

通常会在您选择的Lambda错误时发生。尝试使用“ lambda.min”

答案 1 :(得分: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个自变量/预测变量,套索就显得过分了。您可以应用简单的线性回归:

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