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

如何在GLMER中自定义随机效应设计矩阵Z?

问题与解决方案

问题背景

现有二分类响应变量y、协变量x,以及两列名称变量names1和names2(已过滤掉names1==names2的行)。需要拟合广义线性混合模型,要求每个名称(无论出现在names1还是names2)对应一个独立的随机截距,模型形式为:
$$y_i \sim \text{Binomial}(1, \text{logit}^{-1}(\beta_0 + \beta_1 x_i + \sum_{j \in {names1_i, names2_i}} b_j))$$
其中$b_j \sim N(0, \sigma_b^2)$为名称$j$的随机截距。已手动生成指示矩阵Z1-Z5(每列对应一个名称,观测中出现该名称时取值1),但不知如何将其融入glmer。

解决方案1:利用自定义Z矩阵(匹配已有操作)

直接基于你生成的Z矩阵,通过lme4的底层接口构建随机效应结构:

步骤1:准备数据与提取Z矩阵

library(lme4)

# 生成示例数据(优化后保证类型正确)
set.seed(123) # 添加随机种子确保结果可重复
y = rbinom(25, 1, 0.5)
names1 = rep(1:5, each = 5)
names2 = rep(1:5, 5)
x = rnorm(25)
df = data.frame(names1, names2, y, x)
df = df[df$names1 != df$names2,]

# 生成并提取Z矩阵
for (i in 1:length(unique(df$names1))) {
  df[paste0("Z", i)] <- ifelse(df$names1 == i | df$names2 == i, 1, 0)
}
Z_mat = as.matrix(df[, grep("^Z", colnames(df))])

步骤2:构建随机效应结构

用mkReTrms将Z矩阵转换为glmer可识别的格式:

# 分组水平对应所有名称(1到5)
re_trms = mkReTrms(Z = list(Z_mat), flist = list(name = factor(1:ncol(Z_mat))))

步骤3:拟合模型

将随机效应结构传入glmer,同时指定固定效应和模型族:

model = glmer(y ~ x, family = binomial, data = df, reTrms = re_trms)

# 查看模型结果
summary(model)

解决方案2:转换为长格式(更简洁易维护)

无需手动生成Z矩阵,通过数据格式转换直接用公式语法实现需求:

library(tidyr)

# 转换为长格式:每个观测拆分为两行,分别对应names1和names2
df_long = pivot_longer(df, cols = c(names1, names2), 
                       names_to = "source", values_to = "name")
# 为原始观测添加唯一ID,控制拆分后的数据相关性
df_long$obs_id = rep(1:nrow(df), each = 2)

# 拟合模型:(1|name)实现同一名称共享随机截距,(1|obs_id)控制观测内相关性
model_long = glmer(y ~ x + (1|name) + (1|obs_id), 
                   family = binomial, data = df_long)
summary(model_long)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:26:08