在UK Biobank数据上运行PheWas遇svd(X)错误:无缺失值却提示异常
问题:PheWAS分析中
polr有序逻辑回归报错Error in svd(X): infinite or missing values in 'x' 背景
- 基于GitHub仓库PHESANT在UK Biobank临床/脑成像数据上开展PheWAS,检验脑小血管病(白质高信号体积,连续预测变量,存在缺失,不能插补)与抑郁发作次数(因变量,已填补缺失,取值-3~2052,多数为-3代表“不知道”)的关联
- 报错指向有序逻辑回归(
polr)代码段,推测由预测变量缺失值导致
疑似问题代码
### BEGIN TRYCATCH tryCatch({ confounders=thisdata[,3:numPreceedingCols, drop = FALSE] if (opt$standardise==TRUE) { geno = scale(geno) } fitB <- polr(phenoFactor ~ ., data=confounders, Hess=TRUE) fit <- polr(phenoFactor ~ geno + ., data=confounders, Hess=TRUE) # only save results if model converged if (fit$convergence == 0 & fitB$convergence == 0) { ctable <- coef(summary(fit)) sink() sink(resLogFile, append=TRUE) ct = coeftest(fit) # model p value compares model to baseline model lres = anova(fit, fitB) pvalue = pchisq(lres[2,"LR stat."], df=lres[2," Df"], lower.tail=FALSE) beta = ctable["geno", "Value"]; if (opt$confidenceintervals == TRUE) { se = ctable["geno", "Std. Error"] lower = beta - 1.96*se; upper = beta + 1.96*se; } else { lower = NA upper = NA }
解决方案
1. 按分位数分组处理预测变量(同时保留缺失样本)
将白质高信号体积转为有序分类变量,把缺失值设为独立类别,既符合研究需求,又解决缺失值导致的建模错误:
# 按四分位数对geno分组,自动忽略缺失值计算分位数 geno_groups <- cut(geno, breaks = quantile(geno, na.rm = TRUE), include.lowest = TRUE, labels = c("Q1(最低)", "Q2", "Q3", "Q4(最高)")) # 将缺失值标记为单独类别 geno_groups[is.na(geno_groups)] <- "Missing" # 转为有序因子(适配polr的有序逻辑回归特性) geno_groups <- factor(geno_groups, ordered = TRUE)
2. 修正数据输入与建模公式
polr无法处理含缺失值的输入,且原代码中geno不在confounders数据框内,会导致变量匹配错误,需调整:
# 将处理后的分组变量加入协变量数据框 confounders$geno <- geno_groups # 构建不含geno的基线模型数据框 confounders_baseline <- confounders[, !colnames(confounders) %in% "geno", drop = FALSE] # 重新拟合模型 fitB <- polr(phenoFactor ~ ., data=confounders_baseline, Hess=TRUE) fit <- polr(phenoFactor ~ ., data=confounders, Hess=TRUE)
3. 排查协变量的缺失值
协变量confounders中若存在缺失值,同样会触发报错,需检查并处理:
# 统计协变量各列缺失值数量 colSums(is.na(confounders_baseline)) # 处理方式示例: # - 分类变量:将NA转为"Missing"因子 confounders_baseline$some_cat_var[is.na(confounders_baseline$some_cat_var)] <- "Missing" confounders_baseline$some_cat_var <- factor(confounders_baseline$some_cat_var) # - 连续变量:同geno处理逻辑,分组+缺失值单独成组
4. 评估因变量的-3类别合理性
因变量中大量“不知道”(-3)样本可能干扰模型拟合,建议:
- 将-3设为单独的有序类别,与其他发作次数类别区分
- 或单独分析排除-3样本后的子集,对比结果稳定性
内容的提问来源于stack exchange,提问作者Fleeting_A
相关产品推荐
相关产品推荐

