首页 > 解决方案 > 从 2D 到 1D,如何在混合模型中传递第二个随机效应 [Python, Statsmodel]

问题描述

这个问题的构建:Q

假设我有一个这样的数据框:

import pandas as pd
d = {'y':[1.2,2.41,3.12,4.76],'x':['A','B'],'r1':['a','b','c','d'],'r2':['a2','b2','c2','d2']}
df = pd.DataFrame(d)

y 是一个连续变量。x 是分类的并且是固定分量。它是二进制的。r1, r2 是分类的。它们是随机分量。

我会将它传递给混合模型:

import statsmodels.formula.api as smf
md = smf.mixedlm("y ~ x", df, groups=df["r1"], re_formula="~ r1")

这很好用。

但是现在我想添加第二个随机变量,但这只能作为一维数组来完成......而且我不知道如何将我传递给的数据重新排列groups为一维数组

综上所述:如何以这种方式重新排列数据框,以便我可以将 2 个变量groups作为一维数组传递?请显示此语法。

标签: pythonpandasdataframestatsmodels

解决方案


所以你需要crossed random effects models.

从文档中:

Statsmodels MixedLM 处理大多数非交叉随机效应模型和一些交叉模型。为了在模型中包含交叉随机效应,有必要将整个数据集视为一个组。然后可以使用模型的方差分量参数来定义具有交叉和非交叉随机效应的各种组合的模型。


由于您需要一个没有独立组的交叉模型,因此您需要将每个人放在同一组中并使用方差分量指定随机效应。

import pandas as pd                                                                                                        
import statsmodels.api as sm                                                                                               

d = {'y':[1,2,3,4],'x':[1,2,3,4],'r1':[1,2,3,4],'r2':[1,2,3,4]}
df = pd.DataFrame(d)                                                                                                          
df["group"] = 1    # all in the case group                                                                                                        

vcf = {"r1": "0 + C(r1)", "r2": "0 + C(r2)"}  # formula                                                        
model = sm.MixedLM.from_formula("y ~ x", groups="group",                                                    
                                vc_formula=vcf, re_formula="~r1", data=df)                                                   
result = model.fit()  

推荐阅读