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

如何将R glmer公式改写为Python statsmodels mixedlm对应公式

GLMER转statsmodels实现方案

首先明确R端模型的核心结构,所有预处理和参数设定需完全对齐:

  • 数据预处理:过滤掉type值为target的样本
  • 模型类型:二项分布广义线性混合模型(logit链接,因变量为二分类correct)
  • 固定效应:
    • lm1:截距 + type固定效应
    • lmnull:仅截距
  • 随机效应:
    1. subject_id分组下的随机截距 + type随机斜率,允许截距与斜率相关(对应R语法(1+type|subject_id))
    2. category分组下的随机截距(对应R语法(1|category))

可直接运行的实现代码

注意:需使用statsmodels 0.14.0及以上版本,低版本不支持拉普拉斯近似的频率派GLMM拟合。

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
import statsmodels.api as sm

# 1. 数据预处理,和R端filter逻辑完全对齐
df_fit = df[df["type"] != "target"].copy()
# 提前将type转为分类变量,若需对齐R端参考水平,可通过set_categories指定顺序
df_fit["type"] = pd.Categorical(df_fit["type"])

# 2. 拟合带type固定效应的模型(对应R端lm1)
lm1 = smf.mixedlm(
    formula="correct ~ C(type)",
    data=df_fit,
    groups=df_fit["subject_id"],  # 主分组指定为subject_id
    re_formula="1",  # 主分组默认估计随机截距
    vc_formula={
        # subject_id分组下的type随机斜率,和主分组随机截距共同构成(1+type|subject_id)结构,默认估计自由协方差
        "subject_type_slope": "0 + C(type)",
        # category分组下的随机截距,对应(1|category)结构
        "category_intercept": "0 + C(category)"
    },
    family=sm.families.Binomial()  # 指定二项分布,匹配R端family=binomial()
)
res_lm1 = lm1.fit(method="laplace", reml=False)  # 拉普拉斯近似对齐glmer默认估计逻辑,GLMM使用ML估计关闭REML

# 3. 拟合仅截距的零模型(对应R端lmnull)
lmnull = smf.mixedlm(
    formula="correct ~ 1",
    data=df_fit,
    groups=df_fit["subject_id"],
    re_formula="1",
    vc_formula={
        "subject_type_slope": "0 + C(type)",
        "category_intercept": "0 + C(category)"
    },
    family=sm.families.Binomial()
)
res_lmnull = lmnull.fit(method="laplace", reml=False)

# 查看模型结果,和R端summary()输出对应
print(res_lm1.summary())
print(res_lmnull.summary())

关键设定说明

  • 随机效应语法差异:statsmodels不支持lme4风格的(x|g)公式写法,需通过三类参数拆分设定:groups指定主分组、re_formula指定主分组的随机效应结构、vc_formula指定交叉分组/额外方差成分,才能实现多水平交叉随机效应。
  • 随机效应相关性匹配:上述写法中subject_id的随机截距和同组type随机斜率默认估计无约束协方差,和R中(1+type|subject_id)的设定完全一致;如果需要模拟R中(1+type||subject_id)的独立随机效应(截距斜率协方差为0),在拟合时传入参数free={"subject_type_slope": np.eye(len(df_fit["type"].cat.categories))}即可。
  • 估计方法对齐:必须指定family=sm.families.Binomial()才是二项GLMM,默认MixedLM为高斯线性混合模型;选择method="laplace"和glmer默认的拉普拉斯近似逻辑一致,GLMM不适用REML估计,需设置reml=False使用极大似然估计。
  • 分类变量对齐:显式使用C(type)将type作为分类变量处理,默认采用处理编码(和R的因子默认编码一致),如果需要对齐R端的因子参考水平,提前通过pd.Categorical设置类别顺序即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:06:18