Como ter vários grupos no modelo de efeitos mistos lineares do Python statsmodels?
Estou tentando usar o modelo de efeitos mistos lineares do Python statsmodels para ajustar um modelo que possui duas interceptações aleatórias, por exemplo dois grupos. Não consigo descobrir como inicializar o modelo para que eu possa fazer isso.
Aqui está o exemplo. Tenho dados parecidos com os seguintes (extraídos deaqui):
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
Quero criar um modelo linear de efeitos mistos com dois efeitos aleatórios - um para o grupo de sujeitos e outro para o grupo de cenários. Estou tentando fazer isso:
import statsmodels.api as sm
model = sm.MixedLM.from_formula("frequency ~ attitude + gender", data, groups=data[['subject', 'scenario']])
result = model.fit()
print result.summary()
Eu continuo recebendo esse erro:
LinAlgError: Singular matrix
Funciona bem em R. Quando usolme4
em R com a renderização baseada em fórmula, ele se encaixa perfeitamente:
politeness.model = lmer(frequency ~ attitude + gender +
(1|subject) + (1|scenario), data=politeness)
Não entendo por que isso está acontecendo. Funciona quando uso qualquer efeito / grupo aleatório, por exemplo
model = sm.MixedLM.from_formula("frequency ~ attitude + gender", data, groups=data['subject'])
Então eu recebo:
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
===============================================================
Como alternativa, se eu fizer:
model = sm.MixedLM.from_formula("frequency ~ attitude + gender", data, groups=data['scenario'])
Este é o resultado que recebo:
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
================================================================
Eu não tenho ideia do que está acontecendo. Sinto que estou perdendo algo fundamental nas estatísticas do problema.