R语言线性回归报错求助:NA/NaN/Inf in 'y'及类型转换警告
问题排查与解决
你的错误和警告指向两个核心问题:因类型转换引入NA,以及因除以0或非数值数据导致的NA/Inf值,以下是具体排查步骤和解决方案:
1. 定位MedEarnings的类型问题
警告NAs introduced by coercion说明将字符型数据转换为数值型时产生了NA,而线性回归的因变量MedEarnings是主要排查对象:
- 运行以下代码检查数据类型和异常内容:
ACS数据中常出现# 查看MedEarnings的类型 class(Ex2_2$MedEarnings) # 如果是字符型,测试转换为数值时哪些值变成NA med_earn_num <- as.numeric(Ex2_2$MedEarnings) # 输出转换失败的原始值 unique(Ex2_2[is.na(med_earn_num), "MedEarnings"])"--"、"NA"或空白字符串表示数据缺失/抑制,这些内容会导致转换失败生成NA,进而触发lm的错误。
解决方法:清理并转换MedEarnings
library(dplyr) Ex2_2 <- Ex2_2 %>% mutate(MedEarnings = case_when( # 替换所有非数值标记为NA MedEarnings %in% c("--", "NA", "", "N/A") ~ NA_character_, TRUE ~ MedEarnings ) %>% as.numeric())
2. 检查百分比计算中的除以0问题
你创建的pct_*变量都依赖C01_001E作为分母,如果该变量存在0值,会生成Inf(无穷大),而lm不允许因变量或自变量中存在Inf:
- 运行以下代码检查分母是否为0:
# 统计C01_001E为0的行数 sum(Ex2_2$C01_001E == 0) # 查看这些行的详细内容 Ex2_2[Ex2_2$C01_001E == 0, ]
解决方法:处理分母为0的行
如果这些行没有分析价值,可以直接删除:
Ex2_2 <- Ex2_2 %>% filter(C01_001E != 0)
3. 全局验证数据完整性
最后运行以下代码,确认所有变量中已无NA/Inf:
# 统计每个变量的NA/Inf数量 sapply(Ex2_2, function(x) sum(is.na(x) | is.infinite(x)))
确保MedEarnings和所有自变量的计数为0后,再重新运行回归代码。
内容的提问来源于stack exchange,提问作者Luna
相关产品推荐
相关产品推荐

