Панельная регрессия в Python

Я пытаюсь запустить регрессию панели на pandas Dataframes:

В настоящее время у меня есть два кадра данных, каждый из которых содержит 52 строки (даты) * 99 столбцов (99 запасов): Markdown файл с представлением данных

Во время работы:

est=sm.OLS(Stockslist,averages).fit()
est.summary()

Я получаю ValueError: формы (52,99) и (52,99) не выровнены: 99 (тусклый 1)! = 52 (тусклый 0)

Может ли кто-нибудь указать мне, что я делаю неправильно? Модель просто y (i, t) = x (i, t) + ошибка, поэтому нет перехвата. Однако я хотел бы добавить временные эффекты в будущем.

С уважением, Jeroen


person jerreyz    schedule 17.04.2016    source источник
comment
statsmodels OLS предназначен для одномерной зависимой переменной. Вам нужно сложить или np.ravel или изменить отдельные временные ряды. Вы хотите использовать единый параметр наклона для всех акций?   -  person Josef    schedule 18.04.2016
comment
У меня есть дважды 52 отдельных временных ряда. Вместо запуска 52 отдельных регрессий ols я хочу панельную регрессию, которая охватывает все акции в одной регрессии. Так что да, я хочу один наклон вместо 52 разных.   -  person jerreyz    schedule 18.04.2016
comment
Этот случай просто эквивалентен одной регрессии МНК в длинной форме. Так что просто измените оба DataFrames на 52 * 99 строк. Фиктивная переменная для фиксированных эффектов может быть создана, например, из фирменных наименований или индексов.   -  person Josef    schedule 18.04.2016
comment
что вы подразумеваете под «длинной формой» (мудрый код)   -  person jerreyz    schedule 18.04.2016
comment
stack может сделать это pandas.pydata. org/pandas-docs/stable/ В numpy я бы просто использовал ravel или изменил форму с помощью order='F' для укладки по столбцам.   -  person Josef    schedule 18.04.2016
comment
Эй, я думал, что это поможет, однако я знаю, что получаю другую ошибку значения ValueError: индексы для endog и exog не выровнены. Однако я показываю, что индексы точно такие же и имеют ту же структуру: ссылка   -  person jerreyz    schedule 19.04.2016


Ответы (2)


Попробуйте следующее: я скопировал биржевые данные из приведенной выше ссылки и добавил случайные данные для столбца x. Для регрессии панели вам нужен «MultiIndex», как указано в комментариях.

df = pd.DataFrame(df.set_index('dates').stack())
df.columns = ['y']
df['x'] = np.random.random(size=len(df.index))
df.info()

MultiIndex: 100 entries, (2015-04-03 00:00:00, AB INBEV) to (2015-05-01 00:00:00, ZC.PA)
Data columns (total 2 columns):
y    100 non-null float64
x    100 non-null float64
dtypes: float64(2)
memory usage: 2.3+ KB

regression = PanelOLS(y=df['y'], x=df[['x']])

regression

-------------------------Summary of Regression Analysis-------------------------

Formula: Y ~ <x> + <intercept>

Number of Observations:         100
Number of Degrees of Freedom:   2

R-squared:         0.0042
Adj R-squared:    -0.0060

Rmse:              0.2259

F-stat (1, 98):     0.4086, p-value:     0.5242

Degrees of Freedom: model 1, resid 98

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
             x    -0.0507     0.0794      -0.64     0.5242    -0.2063     0.1048
     intercept     2.1952     0.0448      49.05     0.0000     2.1075     2.2829
---------------------------------End of Summary---------------------------------
person Stefan    schedule 18.04.2016

как вы упомянули выше, я изменил свой код следующим образом:

  1. Я преобразовал стеки в два фрейма данных
  2. Я объединил их в один мультииндексный фрейм данных.
  3. запустил регрессию и добавил временные эффекты

    <class 'pandas.core.frame.DataFrame'>
    MultiIndex: 5096 entries, (2015-04-03 00:00:00, AB INBEV) to (25/03/16, ZC.PA)
    Data columns (total 2 columns):
    indvalues    5096 non-null float64
    avgvalues    5096 non-null float64
    dtypes: float64(2)
    memory usage: 119.4+ KB
    
    from pandas.stats.plm import PanelOLS
    regression=PanelOLS(y=df["indvalues"], x=df[["avgvalues"]], time_effects=True)
    

регресс теперь работает очень хорошо! Спасибо, Стефан Янсен.

person jerreyz    schedule 19.04.2016
comment
Мне все еще было интересно, не предлагает ли statsmodels какие-либо параметры регрессии панели - person jerreyz; 20.04.2016
comment
Боюсь, для более серьезной эконометрики лучше использовать R или любой из коммерческих пакетов. Вот попытка реализовать что-то, но я не уверен, что это продвинулось дальше основного этапа: /5053686 - person Stefan; 20.04.2016