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

glmmTMB模型观测数与分组数不符问题求助

问题:glmmTMB模型输出的观测数与分组数和实际数据集不符

我的数据集原本包含100500条观测、125只动物(Animal.ID因子共125个水平)、3个位点,但添加变量更新数据框后,运行glmmTMB模型输出的观测数仅为56290,Animal.ID分组数只剩70,与实际情况不符。

模型输出:

Formula:
type.x ~ std_rdden + std_forest2 + std_dev2 + (1 | site) + 
      (1 | Animal.ID) + Age.x + time.cat + Sex.x + road_category + season
Data: df7

AIC BIC logLik deviance df.resid
75769.3 75903.4 -37869.7 75739.3 56275

Random effects:

Conditional model:
Groups    Name        Variance  Std.Dev.
site      (Intercept) 2.936e-08 0.0001713
Animal.ID (Intercept) 2.000e-01 0.4472232
Number of obs: 56290, groups: site, 3; Animal.ID, 70

数据集实际结构(str()输出片段):

'data.frame':   100501 obs. of  55 variables:
  Animal.ID         : Factor w/ 125 levels "D1060

解决方法
  • 检查缺失值导致的行删除
    glmmTMB默认会自动移除包含NA值的观测(列表删除法),这是最常见的原因。运行以下代码验证:

    # 查看数据框中完整观测的数量
    sum(complete.cases(df7))
    # 查看每个变量的缺失值数量
    colSums(is.na(df7))
    

    如果sum(complete.cases(df7))返回56290,说明缺失值导致近一半观测被自动剔除,进而让部分动物的所有观测都被删掉,最终Animal.ID分组数降到70。

  • 验证分组变量的有效观测
    查看完整观测中实际存在的动物数量:

    length(unique(df7$Animal.ID[complete.cases(df7)]))
    # 或者查看每个动物的观测数分布
    table(df7$Animal.ID)
    

    这能确认哪些动物因为所有观测都含缺失值而被排除在模型之外。

  • 回溯数据更新过程
    检查添加变量时的操作,是否不小心做了子集筛选(比如误用filter()、subset()或行索引错误)。对比更新前后的数据框行数:

    # 假设旧数据框名为old_df
    nrow(old_df)
    nrow(df7)
    

    如果更新后df7的行数已经是56290,说明问题出在数据处理阶段,而非模型运行环节。

  • 处理缺失值而非强制保留
    若想保留更多观测,不要直接用na.action = na.pass(可能导致模型报错),建议先处理缺失值:

    • 对数值变量用均值/中位数插补,或用多重插补包(如mice)
    • 对分类变量用众数插补,或添加“缺失”水平
      处理完成后再重新运行模型。
  • 检查因子水平
    Animal.ID是因子类型,部分水平可能因观测被删除而变成空水平,可运行droplevels(df7$Animal.ID)查看实际有效水平数,确认是否与模型输出的70一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:03:21