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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:55:22