如何使用 glmnet 在收缩(套索)方法中处理 NA 值

机器算法验证 缺失数据 套索 网络
2022-03-09 19:26:44

我在 GWAS 中使用“glmnet”进行套索回归。一些变体和个体有缺失值,glmnet 似乎无法处理缺失值。

有什么解决办法吗?还是有其他包可以处理套索回归中的缺失值?

这是我的脚本。

> library(glmnet)
> geno6<-read.table("c6sigCnt.geno")
> geno6[1:10,1:10] #genotype file (0,1,2 for minor allele counts)

   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   1  1  1  1  1  1  1  1  1   0
2   NA NA 1  1  1  1  1  1  1   1
3   0  0  0  0  0  0  0  0  0   2
4   0  1  0  0  0  0  0  0  0   1
5   1  0  1  1  1  1  1  1  1   1
6   0  2  0  0  0  0  0  0  0   0
7   0  0  0  0  0  0  0  0  0   2
8   0 NA  0  0  0  0  0  0  0   0
9   1  0  1  1  1  1  1  1  1   1
10  1  1  1  1  1  1  1  1  1   0

> pheno6<-read.table("c6sigCnt.pheno")
> head(pheno6) #case-control (1,2 for affection status)

  V1
1  2
2  2
3  2
4  2
5  2

> geno61<-as.matrix(geno6) 
> pheno61<-pheno6[,1] 
> fit_lasso <- glmnet(geno61,pheno61,family="binomial",alpha=1,nlambda=100) 

**Error in lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,  : 
  NA/NaN/Inf in foreign function call (arg 5)**
3个回答

省略具有 NA 值的案例可能会导致偏差。另一种方法是对缺失数据执行多次插补,例如使用mice,然后对每个插补执行套索。Lasso 可能会为插补返回不同的选定变量集,但您可以检查在插补数据集中选择每个变量的频率,以确定最佳候选变量。

当然,如果数据点丢失的概率与其真实值相关,则插补是不适用的。因此,在进行插补之前,根据对主题的了解,确保至少不太可能出现这种情况。

使用complete.cases和/或na.omit标识那些没有 NA 的行。

cc <- complete.cases(geno6) & complete.cases(pheno6)
geno61 <- as.matrix(geno6[cc, ])
pheno61 <- pheno6[cc, 1]

glmnet(geno61, pheno61, ...)    

我知道这是一个老问题 - 但我想补充一点,除了用老鼠进行插补之外,为了获得更可靠的协变量列表,可以在堆叠所有插补数据集(好像它是 1 个数据集)后执行套索,但对记录进行加权通过缺失变量的比例。见:伍德等。人。2008年