使用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
相关产品推荐
相关产品推荐

