You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:25:57