Python Линейные модели: как сообщить Python, что это столбцы идентификаторов для идентификации группы? - PullRequest
0 голосов
/ 21 февраля 2020

Я хотел бы запустить групповую регрессию (модель с фиксированным эффектом) для группы лиц, которые однозначно идентифицируются по province и city в течение времени t.

Код для создать фрейм данных и запустить регрессию

import numpy as np
import pandas as pd
from linearmodels import PanelOLS
data = {'y':[1,2,3,1,0,3],
        'x1': [0,1,2,3,0,2],
        'x2':[1,1,3,2,1,0],
        't':  ['2020-02-18', '2020-02-18', '2020-02-17', '2020-02-18', '2020-02-18', '2020-02-17'],
        'province': ['A', 'A','A','B','B','B'],
        'city': ['a','b','a','a','c','a']}
dataframe = pd.DataFrame (data, columns = ['y','x1', 'x2', 't', 'province', 'city'])

dataframe=dataframe.set_index(['t','province','city'], append=True)
mod = PanelOLS(dataframe.y, dataframe[['x1','x2']], entity_effects=True)

Но я получил ошибку, которая говорит: «Ввод данных в фрейме должен иметь MultiIndex с 2 уровнями.»

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-33-eb5264bfefc9> in <module>
      1 dataframe=dataframe.set_index(['t','province','city'], append=True)
----> 2 mod = PanelOLS(dataframe.y, dataframe[['x1','x2']], entity_effects=True)

C:\ProgramData\Anaconda3\lib\site-packages\linearmodels\panel\model.py in __init__(self, dependent, exog, weights, entity_effects, time_effects, other_effects, singletons, drop_absorbed)
   1038         drop_absorbed: bool = False,
   1039     ) -> None:
-> 1040         super(PanelOLS, self).__init__(dependent, exog, weights=weights)
   1041 
   1042         self._entity_effects = entity_effects

C:\ProgramData\Anaconda3\lib\site-packages\linearmodels\panel\model.py in __init__(self, dependent, exog, weights)
    224         weights: Optional[PanelDataLike] = None,
    225     ) -> None:
--> 226         self.dependent = PanelData(dependent, "Dep")
    227         self.exog = PanelData(exog, "Exog")
    228         self._original_shape = self.dependent.shape

C:\ProgramData\Anaconda3\lib\site-packages\linearmodels\panel\data.py in __init__(self, x, var_name, convert_dummies, drop_first, copy)
    198                 if len(x.index.levels) != 2:
    199                     raise ValueError(
--> 200                         "DataFrame input must have a " "MultiIndex with 2 levels"
    201                     )
    202                 if isinstance(self._original, (DataFrame, PanelData, Series)):

ValueError: DataFrame input must have a MultiIndex with 2 levels

В качестве решения вместо того, чтобы делать

dataframe=dataframe.set_index(['t','province','city'], append=True)

Я делаю это

dataframe=dataframe.set_index(['t'], append=True)

Это позволит модели пройти go. Но я не знаю, почему. В этом случае я использую два столбца для идентификации группы. Что если мне понадобятся три столбца для идентификации моих групп ? Как python различает переменную ID и x ?

1 Ответ

1 голос
/ 22 февраля 2020

По словам автора linearmodels , мне нужно иметь одну сущность,

import numpy as np
import pandas as pd
from linearmodels import PanelOLS
data = {'y':[1,2,3,1,0,3],
        'x1': [0,1,2,3,0,2],
        'x2':[1,1,3,2,1,0],
        't': pd.to_datetime(['2020-02-18', '2020-02-18', '2020-02-17', '2020-02-18', '2020-02-18', '2020-02-17']),
        'province': ['A', 'A','A','B','B','B'],
        'city': ['a','b','a','a','c','a']}
dataframe = pd.DataFrame (data, columns = ['y','x1', 'x2', 't', 'province', 'city'])
dataframe["city-provence"] = [(c,p) for c,p in zip(dataframe.city, dataframe.province)]
dataframe = dataframe.set_index(["city-provence","t"])

                          y  x1  x2 province city
city-provence t                                  
(a, A)        2020-02-18  1   0   1        A    a
(b, A)        2020-02-18  2   1   1        A    b
(a, A)        2020-02-17  3   2   3        A    a
(a, B)        2020-02-18  1   3   2        B    a
(c, B)        2020-02-18  0   0   1        B    c
(a, B)        2020-02-17  3   2   0        B    a
...