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

使用gtsummary生成线性混合模型表格报错求助

问题分析与解决办法

报错number of levels of each grouping factor must be < number of observations (problems: A)的核心原因是:按D分层后,某一个/几个子数据集中,分组变量A的水平数大于等于该子集的总观测数,导致线性混合模型无法估计随机截距(每个分组至少需要多个观测才能计算随机效应的方差)。

第一步:定位问题分组

先运行以下代码,查看每个D分组下的观测数和A的水平数,快速找到出问题的分组:

dt %>%
  group_by(D) %>%
  summarize(
    观测数 = n(),
    A的水平数 = n_distinct(A),
    .groups = "drop"
  )

找到A的水平数 >= 观测数的D分组,这就是报错的根源。

解决方案

方案1:筛选有效分组

直接排除观测数不足的D分组,只保留能拟合混合模型的子集:

# 先筛选符合条件的D分组
有效D分组 <- dt %>%
  group_by(D) %>%
  filter(n() > n_distinct(A)) %>%
  pull(D) %>%
  unique()

# 运行修正后的代码
dt %>%
  filter(D %in% 有效D分组) %>%
  tbl_strata(
    strata = D, 
    ~ lmerTest::lmer(E ~ C*B + (1|A), data = .x) %>%
      tbl_regression(),
    .combine_with = "tbl_stack"
  ) %>%
  modify_column_unhide(c(std.error, statistic)) %>%
  as_flex_table()

方案2:动态调整模型结构

如果不能排除分组,对观测数不足的子集改用普通线性模型替代混合模型:

dt %>%
  tbl_strata(
    strata = D, 
    ~ {
      子集观测数 <- nrow(.x)
      A的水平数 <- n_distinct(.x$A)
      # 根据数据量选择模型
      if (子集观测数 > A的水平数) {
        lmerTest::lmer(E ~ C*B + (1|A), data = .x) %>% tbl_regression()
      } else {
        lm(E ~ C*B, data = .x) %>% tbl_regression()
      }
    },
    .combine_with = "tbl_stack"
  ) %>%
  modify_column_unhide(c(std.error, statistic)) %>%
  as_flex_table()

方案3:检查并修正数据

确认A变量的编码是否存在错误(比如字符串型A因空格、大小写差异产生假水平),运行unique(dt$A)查看,修正后再重新执行原代码。

内容的提问来源于stack exchange,提问作者12666727b9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:48:27