如何将R glmer公式改写为Python statsmodels mixedlm对应公式
GLMER转statsmodels实现方案
首先明确R端模型的核心结构,所有预处理和参数设定需完全对齐:
- 数据预处理:过滤掉
type值为target的样本 - 模型类型:二项分布广义线性混合模型(logit链接,因变量为二分类
correct) - 固定效应:
lm1:截距 +type固定效应lmnull:仅截距
- 随机效应:
subject_id分组下的随机截距 +type随机斜率,允许截距与斜率相关(对应R语法(1+type|subject_id))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
相关产品推荐
相关产品推荐

