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

使用MatchIt进行倾向得分匹配时遇非有限值报错求助

问题:Propensity Score Matching代码报错:存在缺失或非有限值的协变量

运行MatchIt进行倾向得分匹配时触发错误:

Error: Missing and non-finite values are not allowed in the covariates. Covariates with missingness or non-finite values: pat_gender, pat_race, pat_ethnicity

已确认数据无缺失值,且尝试将字符型pat_gender转为数值(Male=1,Female=0),但错误依旧。

使用的代码如下:

library(MatchIt)
library(dplyr)
library(optmatch)
 
mydata<- read.csv("C:/Users/Desktop/prp_for_psm_pq.csv")

set.seed(1234)

match.itzs <- matchit(cohort_flag ~ pat_age + pat_gender + pt_hist_in_months + pt_visit_count + pat_race + pat_ethnicity, data = mydata, ratio=1)

df.matchzs <- match.data(match.itzs)[1:ncol(cohort_initial)]

prp_cohort_psm_zs_test <- df.matchzs

排查与解决方法

  • 检查非有限值(Inf/-Inf):
    仅确认缺失值不够,需排查协变量中是否存在无限值。执行以下代码逐个检查目标变量:

    # 检查每个变量是否存在非有限值
    any(!is.finite(mydata$pat_gender))
    any(!is.finite(mydata$pat_race))
    any(!is.finite(mydata$pat_ethnicity))
    

    若返回TRUE,需定位并修正产生无限值的源头(比如之前的计算错误)。

  • 排查字符/因子变量的异常值:
    即使无缺失值,字符型变量可能存在空白字符串、特殊字符或未被覆盖的类别。执行以下代码查看变量分布:

    table(mydata$pat_gender, useNA = "always")
    table(mydata$pat_race, useNA = "always")
    table(mydata$pat_ethnicity, useNA = "always")
    

    若发现异常值(如空字符串、"Unknown"等未处理类别),需统一转换或剔除:

    # 示例:将pat_gender的非Male/Female值转为NA
    mydata$pat_gender <- ifelse(mydata$pat_gender %in% c("Male", "Female"), 
                               as.integer(mydata$pat_gender == "Male"), NA)
    # 剔除含NA的行(或根据需求插值)
    mydata <- na.omit(mydata)
    
  • 修正数据导入时的伪缺失值:
    若CSV文件中存在字符型的"NA"或空白,read.csv不会自动识别为缺失值。执行以下代码转换:

    library(dplyr)
    mydata <- mydata %>%
      mutate(across(c(pat_gender, pat_race, pat_ethnicity), ~na_if(., ""))) %>%
      mutate(across(c(pat_gender, pat_race, pat_ethnicity), ~na_if(., "NA")))
    

    再用sum(is.na(mydata))确认所有缺失值已被标记。

  • 验证变量类型转换是否成功:
    确认pat_gender已转为数值型,而非隐藏的字符型:

    str(mydata$pat_gender)
    

    若仍为字符型,强制转换:

    mydata$pat_gender <- as.integer(mydata$pat_gender == "Male")
    
  • 分步测试定位问题变量:
    简化模型,逐个加入协变量测试,定位具体触发错误的变量:

    # 先测试单个变量
    matchit(cohort_flag ~ pat_gender, data = mydata)
    # 逐步添加其他变量
    matchit(cohort_flag ~ pat_gender + pat_race, data = mydata)
    

    找到问题变量后针对性处理。

内容的提问来源于stack exchange,提问作者Leonardo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:05:22