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

