【问题标题】:How to have multiple groups in Python statsmodels linear mixed effects model?如何在 Python statsmodels 线性混合效应模型中有多个组?
【发布时间】:2016-08-25 18:50:35
【问题描述】:

我正在尝试使用 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                               
================================================================

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

【问题讨论】:

  • 请不要包含数据的图像,而应包含文本。更好的是,以某种方式包含数据,而不是允许可重复的示例。执行此操作时,请花一些时间阅读您的问题并修复一些缺失的元素。例如,“或者,如果我这样做:”后跟空格。
  • @lmo 感谢您的反馈。我不确定如何将表格格式化为文本——比如代码?还修复了原帖中的错误。
  • 可能值得查看带有 statmodel 标签的 python 问题,看看其他人是如何做到的。
  • ... 也... 我会(强烈)建议您删除问题的最后三句话。您感到沮丧是可以理解的,但抱怨免费软件通常无法激励编写它的人来帮助您……(也许您可以自愿/提出一些建议来改进文档?)
  • 我不太了解 statsmodels 平台,但我想 github.com/statsmodels/statsmodels 并打开一个新问题,询问文档帮助如何/在哪里最有用。或者,如果您觉得大胆,请阅读 Github 的工作原理(如有必要),分叉存储库,进行一些有用的文档更改,然后提交拉取请求。

标签: python r statsmodels lme4 mixed-models


【解决方案1】:

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

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

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

与往常一样,您有权全额退还您为使用 statsmodels 而支付的费用...

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 2020-12-03
      • 2018-07-26
      • 2018-10-22
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      相关资源
      最近更新 更多