¿Cómo realizar un modelo / regresión multinivel para datos de panel en Python?
Tengo datos anuales a lo largo del tiempo (datos longitudinales) con medidas repetidas para muchos de los sujetos. Creo que necesito modelos / regresiones multinivel para lidiar con grupos de mediciones correlacionados para los mismos individuos a lo largo del tiempo. Actualmente, los datos se encuentran en tablas separadas para cada año.
Me preguntaba si había una forma incorporada en scikit-learn, como LinearRegression (), que podría realizar una regresión multinivel donde el Nivel 1 son todos los datos a lo largo de los años, y el Nivel 2 es para los agrupados en el sujetos (grupos de medidas de cada sujeto a lo largo del tiempo). Y si es así, si es mejor tener los datos longitudinales dispuestos a lo largo (donde las medidas de cada sujeto a lo largo del tiempo están todas en una fila) o apiladas (donde cada medida para cada año es su propia fila).
¿Hay alguna forma de hacer esto?
Respuestas
La regresión lineal no será adecuada para un modelo multinivel.
Un modelo de efectos mixtos es una buena forma de adaptarse a la mayoría de los modelos multinivel.
En Python puedes usar mixedlmen statsmodels. Por ejemplo:
In [1]: import statsmodels.api as sm
In [2]: import statsmodels.formula.api as smf
In [3]: data = sm.datasets.get_rdataset("dietox", "geepack").data
In [4]: md = smf.mixedlm("Weight ~ Time", data, groups=data["Pig"])
In [5]: mdf = md.fit()
In [6]: print(mdf.summary())
Mixed Linear Model Regression Results
========================================================
Model: MixedLM Dependent Variable: Weight
No. Observations: 861 Method: REML
No. Groups: 72 Scale: 11.3669
Min. group size: 11 Log-Likelihood: -2404.7753
Max. group size: 12 Converged: Yes
Mean group size: 12.0
--------------------------------------------------------
Coef. Std.Err. z P>|z| [0.025 0.975]
--------------------------------------------------------
Intercept 15.724 0.788 19.952 0.000 14.179 17.268
Time 6.943 0.033 207.939 0.000 6.877 7.008
Group Var 40.394 2.149
========================================================