如何在Python statsmodels线性混合效果模型中拥有多个组?

时间:2016-08-25 18:50:35

标签: python r statsmodels lme4 mixed-models

我正在尝试使用Python statsmodels线性混合效果模型来拟合具有两个随机截距的模型,例如:两组。我无法弄清楚如何初始化模型,以便我可以做到这一点。

这是一个例子。我的数据如下所示(取自here):

subject gender  scenario    attitude    frequency
F1  F   1   pol 213.3
F1  F   1   inf 204.5
F1  F   2   pol 285.1
F1  F   2   inf 259.7
F1  F   3   pol 203.9
F1  F   3   inf 286.9
F1  F   4   pol 250.8
F1  F   4   inf 276.8

我想制作一个带有两个随机效果的线性混合效果模型 - 一个用于主题组,另一个用于场景组。我想这样做:

import statsmodels.api as sm
model = sm.MixedLM.from_formula("frequency ~ attitude + gender", data, groups=data[['subject', 'scenario']])
result = model.fit()
print result.summary()

我一直收到这个错误:

LinAlgError: Singular matrix

它在R中运行正常。当我在R中使用基于公式的渲染中的lme4时它很合适:

politeness.model = lmer(frequency ~ attitude + gender + 
        (1|subject)  + (1|scenario), data=politeness)

我不明白为什么会这样。它在我使用任何一个随机效果/组时起作用,例如

model = sm.MixedLM.from_formula("frequency ~ attitude + gender", data, groups=data['subject'])

然后我得到:

                 Mixed Linear Model Regression Results
===============================================================
Model:                MixedLM   Dependent Variable:   frequency
No. Observations:     83        Method:               REML     
No. Groups:           6         Scale:                850.9456 
Min. group size:      13        Likelihood:           -393.3720
Max. group size:      14        Converged:            Yes      
Mean group size:      13.8                                     
---------------------------------------------------------------
                 Coef.   Std.Err.   z    P>|z|  [0.025   0.975]
---------------------------------------------------------------
Intercept        256.785   15.226 16.864 0.000  226.942 286.629
attitude[T.pol]  -19.415    6.407 -3.030 0.002  -31.972  -6.858
gender[T.M]     -108.325   21.064 -5.143 0.000 -149.610 -67.041
Intercept RE     603.948   23.995                              
===============================================================

或者,如果我这样做:

model = sm.MixedLM.from_formula("frequency ~ attitude + gender", data, groups=data['scenario'])

这是我得到的结果:

              Mixed Linear Model Regression Results
================================================================
Model:               MixedLM    Dependent Variable:    frequency
No. Observations:    83         Method:                REML     
No. Groups:          7          Scale:                 1110.3788
Min. group size:     11         Likelihood:            -402.5003
Max. group size:     12         Converged:             Yes      
Mean group size:     11.9                                       
----------------------------------------------------------------
                 Coef.   Std.Err.    z    P>|z|  [0.025   0.975]
----------------------------------------------------------------
Intercept        256.892    8.120  31.637 0.000  240.977 272.807
attitude[T.pol]  -19.807    7.319  -2.706 0.007  -34.153  -5.462
gender[T.M]     -108.603    7.319 -14.838 0.000 -122.948 -94.257
Intercept RE     182.718    5.502                               
================================================================

我不知道发生了什么。我觉得我在问题的统计数据中遗漏了一些基本的东西。

2 个答案:

答案 0 :(得分:7)

您正在尝试使用交叉随机效果来拟合模型,即,您希望允许跨场景的主题之间的一致变化以及跨主题的场景之间的一致变化。你可以在statsmodels中使用多个随机效应项,但它们必须是嵌套的。拟合交叉(而不是嵌套)随机效应需要更复杂的算法,事实上statsmodels documentation表示(截至2016年8月25日,重点已添加):

  

当前实现的一些限制是它不支持残差上更复杂的结构(它们总是同方差),而它不支持交叉随机效应。我们希望在下一个版本中实现这些功能。

据我所知,您的选择是(1)回退到嵌套模型(即适合模型,就好像任一场景嵌套在主题中或反之亦然 - 或尝试两者兼有看看差异是否重要); (2)退回到lme4,在R内或通过rpy2

与往常一样,您有权全额退还您使用statsmodels所支付的款项......

答案 1 :(得分:3)

使用方差分量可以拟合多个或交叉的随机截距交叉效果,方差分量以与一组混合效果不同的方式实现。

我没有找到示例,文档似乎只是部分更新。

单元测试包含使用MixedLM公式接口的示例:

https://github.com/statsmodels/statsmodels/blob/master/statsmodels/regression/tests/test_lme.py#L284