在R中进行DLNM_Meta分析时遇glm.fit报错:'x'含NA/NaN/Inf
解决dlnm包DLNM_Meta分析中glm.fit的NA/NaN/Inf报错问题
报错信息
Error in glm.fit(x = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, : NA/NaN/Inf in 'x'
原代码
library(dlnm) ; library(mvmeta) ; library(splines); library(tidyverse) setwd("D:/Documents/2021-2024/first/subject") fujian <- read.csv("20050101_20191231_fujian.csv",row.names=1) alldata<- subset(fujian, month %in% 8:11) dim(alldata) head(alldata) regions <- as.character(unique(alldata$area)) data <- lapply(regions,function(x) alldata[alldata$area==x,]) names(data) <- regions m <- length(regions) ranges <- t(sapply(data, function(x) range(x$tmean,na.rm=T))) fqaic <- function(model) { loglik <- sum(dpois(model$y,model$fitted.values,log=TRUE)) phi <- summary(model)$dispersion qaic <- -2*loglik + 2*summary(model)$df[3]*phi return(qaic) } reg <- "A" bound <- colMeans(ranges) varknots <- bound[1] + diff(bound)/3*(1:2) argvar001 <- list(type="bs",degree=3,knots=varknots,bound=bound,cen=mean(data[[reg]]$tmean)) arglag001 <- list(type="ns",df=3) suppressWarnings( cb001 <- crossbasis(data[[reg]]$tmean,lag=21,argvar=argvar001,arglag=arglag001,group = data[[reg]]$year) ) summary(cb001) model001 <- glm(case ~ cb001 + dow + ns(time,df=6), family=quasipoisson(),data[[reg]],maxit = 1000,na.action="na.exclude") summary(model001) fqaic001 <- fqaic(model001)
排查与解决步骤
检查数据缺失值:先确认核心变量的缺失情况,运行以下代码查看各列缺失数量:
colSums(is.na(data[[reg]])) sum(is.na(cb001))若
cb001存在缺失,大概率是样条基生成时的问题。调整crossbasis的bound参数:原代码中
bound用了所有区域温度范围的均值,可能导致当前区域A的温度值超出bound范围,生成无效的样条基。改为使用当前区域自身的温度范围:bound <- range(data[[reg]]$tmean, na.rm = TRUE) varknots <- bound[1] + diff(bound)/3*(1:2) argvar001 <- list(type="bs",degree=3,knots=varknots,bound=bound,cen=mean(data[[reg]]$tmean))检查time变量格式:确保
time是数值型变量(若为日期格式需转换),避免样条函数ns()生成异常值:# 若time是日期列,转换为数值 data[[reg]]$time <- as.numeric(data[[reg]]$time)逐步简化模型排查:先运行仅包含
cb001的最简模型,确认无报错后再逐步加入其他变量,定位问题来源:# 最简模型测试 model_test <- glm(case ~ cb001, family=quasipoisson(), data=data[[reg]], na.action="na.exclude") # 依次加入变量 model_test2 <- glm(case ~ cb001 + dow, family=quasipoisson(), data=data[[reg]], na.action="na.exclude") model_test3 <- glm(case ~ cb001 + dow + ns(time,df=6), family=quasipoisson(), data=data[[reg]], na.action="na.exclude")
内容的提问来源于stack exchange,提问作者wo qo
相关产品推荐
相关产品推荐

