День недели как факторная переменная в модели линейной регрессии с использованием statsmodels - PullRequest
0 голосов
/ 03 мая 2018

Вопрос:

Как добавить факторную переменную в модель, используя sm.OLS()?

Подробности

Ниже приведен воспроизводимый кадр данных, который можно выбрать с помощью ctrl + C и затем запустить фрагмент ниже для воспроизводимого примера.

Входные данные:

Date    A   B   weekday
2013-05-04  25.03   88.51   Saturday
2013-05-05  52.98   67.99   Sunday
2013-05-06  39.93   75.19   Monday
2013-05-07  47.31   86.99   Tuesday
2013-05-08  19.61   87.94   Wednesday
2013-05-09  39.51   83.10   Thursday
2013-05-10  21.22   62.16   Friday
2013-05-11  19.04   58.79   Saturday
2013-05-12  18.53   75.27   Sunday
2013-05-13  11.90   75.43   Monday
2013-05-14  47.64   64.76   Tuesday
2013-05-15  27.47   91.65   Wednesday
2013-05-16  11.20   59.83   Thursday
2013-05-17  25.10   67.47   Friday
2013-05-18  19.89   64.70   Saturday
2013-05-19  38.91   76.68   Sunday
2013-05-20  42.11   94.36   Monday
2013-05-21  7.845   73.67   Tuesday
2013-05-22  35.45   76.67   Wednesday
2013-05-23  29.43   79.05   Thursday
2013-05-24  33.51   78.53   Friday
2013-05-25  13.58   59.26   Saturday
2013-05-26  37.38   68.59   Sunday
2013-05-27  37.09   67.79   Monday
2013-05-28  21.70   70.54   Tuesday
2013-05-29  11.85   60.00   Wednesday

Код для регрессионного анализа с использованием statsmodels:

Следующее создает модель линейной регрессии B на A с использованием sm.ols() (включая постоянный член с использованием sm.add_constant())

import pandas as pd
import statsmodels.api as sm

df = pd.read_clipboard(sep='\\s+')
df = df.set_index(['Date'])

df['weekday'] =  df['weekday'].astype(object)
independent = df['B'].to_frame()
x = sm.add_constant(independent)

model = sm.OLS(df['A'], x).fit()
model.summary()

Выход (укороченный):

                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const         -1.4328     17.355     -0.083      0.935       -37.252    34.386
B              0.4034      0.233      1.729      0.097        -0.078     0.885
==============================================================================

Теперь я хотел бы добавить день недели в качестве объясняющей фактор-переменной. Я надеялся, что это будет так же просто, как изменить тип данных в кадре данных, но, к сожалению, это не работает, хотя столбец был принят частью x = sm.add_constant(independent).

import pandas as pd
import statsmodels.api as sm

df = pd.read_clipboard(sep='\\s+')
df = df.set_index(['Date'])

df['weekday'] =  df['weekday'].astype(object)

independent = df[['B', 'weekday']]
x = sm.add_constant(independent)

model = sm.OLS(df['A'], x).fit()
model.summary()

Когда вы переходите к части model = sm.OLS(df['A'], x).fit(), возникает ошибка значения:

ValueError: Pandas data cast to numpy dtype of object. Check input data with np.asarray(data).

Есть еще предложения?

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете использовать pandas категорически для создания фиктивных переменных или, проще, использовать интерфейс формул, где patsy преобразует все нечисловые столбцы в фиктивные переменные или кодирует другой фактор.

Использование интерфейса формулы в этом случае (аналогично строчному регистру ols в statsmodels.formula.api) показывает результат ниже. Пэтси сортирует уровни категориальной переменной по алфавиту. «Пятница» отсутствует в списке переменных и выбрана в качестве справочной категории.

>>> res = sm.OLS.from_formula('A ~ B + weekday', df).fit()
>>> print(res.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      A   R-squared:                       0.301
Model:                            OLS   Adj. R-squared:                  0.029
Method:                 Least Squares   F-statistic:                     1.105
Date:                Thu, 03 May 2018   Prob (F-statistic):              0.401
Time:                        15:26:02   Log-Likelihood:                -97.898
No. Observations:                  26   AIC:                             211.8
Df Residuals:                      18   BIC:                             221.9
Df Model:                           7                                         
Covariance Type:            nonrobust                                         
========================================================================================
                           coef    std err          t      P>|t|      [0.025      0.975]
----------------------------------------------------------------------------------------
Intercept               -1.4717     19.343     -0.076      0.940     -42.110      39.167
weekday[T.Monday]        2.5837      9.857      0.262      0.796     -18.124      23.291
weekday[T.Saturday]     -6.5889      9.599     -0.686      0.501     -26.755      13.577
weekday[T.Sunday]        9.2287      9.616      0.960      0.350     -10.975      29.432
weekday[T.Thursday]     -1.7610     10.321     -0.171      0.866     -23.445      19.923
weekday[T.Tuesday]       2.6507      9.664      0.274      0.787     -17.652      22.953
weekday[T.Wendesday]    -6.9320      9.911     -0.699      0.493     -27.754      13.890
B                        0.4047      0.258      1.566      0.135      -0.138       0.948
==============================================================================
Omnibus:                        1.039   Durbin-Watson:                   2.313
Prob(Omnibus):                  0.595   Jarque-Bera (JB):                0.532
Skew:                          -0.350   Prob(JB):                        0.766
Kurtosis:                       3.007   Cond. No.                         638.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

См. Подробную документацию для вариантов категориальных кодировок http://patsy.readthedocs.io/en/latest/categorical-coding.html

Например, эталонное кодирование может быть указано явно, как в этой формуле

"A ~ B + C(weekday, Treatment('Sunday'))"

http://patsy.readthedocs.io/en/latest/API-reference.html#patsy.Treatment

...