R用cv.glmnet跑Lasso逻辑回归报any(const_vars)缺值错误怎么办
报错触发原因
该报错的核心诱因是cv.glmnet在执行自变量常数列校验的逻辑时,得到的校验结果向量const_vars包含缺失值,any(const_vars)返回NA,而if判断无法将NA识别为合法的TRUE/FALSE值,因此触发报错。具体触发场景包括:
- 自变量矩阵存在缺失值:
scaledData[,-51]中包含NA/NaN,计算列方差以判断是否为常数列时,方差结果会返回NA,最终导致const_vars向量出现缺失值 - 自变量存在标准差为0的常数列:若某列所有取值完全相同,同时伴随缺失值时,也会导致常数校验逻辑返回NA
- 数据缩放过程引入异常值:如果
scaledData是手动标准化生成的,常数列标准化时会出现除以0的情况,生成Inf/NaN异常值,也会导致常数校验失败 - 响应变量存在异常:
scaledData[,51]中存在缺失值,或分类取值不符合二分类要求,会触发上游逻辑异常,传导到常数校验步骤报错
数据校验定位方法
- 校验自变量矩阵缺失值:运行
sum(is.na(scaledData[,-51])),如果结果大于0说明自变量存在缺失值,可进一步运行which(colSums(is.na(scaledData[,-51]))>0)定位具体的缺失列 - 校验常数列:运行
apply(scaledData[,-51], 2, function(x) var(x, na.rm = T) == 0),返回TRUE的列即为标准差为0的常数列,这类列无法代入模型训练,需要提前删除 - 校验异常值:运行
sum(is.infinite(as.matrix(scaledData[,-51])))检查是否存在Inf值,确认标准化步骤是否对常数列做了除0操作 - 校验响应变量合规性:运行
table(scaledData[,51], useNA = "ifany"),查看二分类变量是否仅包含0/1两类、是否存在缺失值、是否存在某分类样本量为0的情况 - 快速验证:先过滤全表缺失值后重新运行模型
clean_df = na.omit(scaledData),如果不再报错即可确认是缺失值导致的问题
内容的提问来源于stack exchange,提问作者Edison Lin
相关产品推荐
相关产品推荐

