statsmodels Patsy проверяет гипотезу категориальной переменной в ограничении 'C()'

Привет я бегу следующую модель со statsmodel, и она работает нормально.

from statsmodels.formula.api import ols
from statsmodels.iolib.summary2 import summary_col #for summary stats of large tables
time_FE_str = ' + C(hour_of_day) + C(day_of_week) + C(week_of_year)'
weather_2_str = ' +  C(weather_index) + rain + extreme_temperature + wind_speed'
model = ols("activity_count ~ C(city_id)"+weather_2_str+time_FE_str, data=df)
results = model.fit()
print summary_col(results).tables

print 'F-TEST:'
hypotheses = '(C(weather_index) = 0), (rain=0), (extreme_temperature=0), (wind_speed=0)'
f_test = results.f_test(hypotheses)

Тем не менее, я не знаю, как сформулировать гипоз для F-теста, если я хочу включить категориальную переменную C(weather_index), Я перепробовал все для себя мыслимые версии, но всегда получаю ошибку.

Кто-то сталкивался с этой проблемой раньше?

Есть идеи?

F-TEST:
Traceback (most recent call last):
  File "C:/VK/scripts_python/predict_activity.py", line 95, in <module>
    f_test = results.f_test(hypotheses)
  File "C:\Users\Niko\Anaconda2\envs\gl-env\lib\site-packages\statsmodels\base\model.py", line 1375, in f_test
    invcov=invcov, use_f=True)
  File "C:\Users\Niko\Anaconda2\envs\gl-env\lib\site-packages\statsmodels\base\model.py", line 1437, in wald_test
    LC = DesignInfo(names).linear_constraint(r_matrix)
  File "C:\Users\Niko\Anaconda2\envs\gl-env\lib\site-packages\patsy\design_info.py", line 536, in linear_constraint
    return linear_constraint(constraint_likes, self.column_names)
  File "C:\Users\Niko\Anaconda2\envs\gl-env\lib\site-packages\patsy\constraint.py", line 391, in linear_constraint
    tree = parse_constraint(code, variable_names)
  File "C:\Users\Niko\Anaconda2\envs\gl-env\lib\site-packages\patsy\constraint.py", line 225, in parse_constraint
    return infix_parse(_tokenize_constraint(string, variable_names),
  File "C:\Users\Niko\Anaconda2\envs\gl-env\lib\site-packages\patsy\constraint.py", line 184, in _tokenize_constraint
    Origin(string, offset, offset + 1))
patsy.PatsyError: unrecognized token in constraint
   (C(weather_index) = 0), (rain=0), (extreme_temperature=0), (wind_speed=0)
    ^

2 ответа

Решение

Методы t_test, wald_test и f_test предназначены для проверки гипотезы непосредственно по параметрам, а не для полного категориального или составного эффекта.

Results.summary () показывает имена параметров, которые patsy создал для категориальных переменных. Они могут быть использованы для создания контраста или ограничения для категориальных эффектов.

В качестве альтернативы anova_lm напрямую вычисляет проверку гипотезы о том, что термин, например, категориальная переменная, не оказывает влияния.

Оставьте C()!

Я попытался сделать анализ этих данных.

Area    Clover_yield    Yarrow_stems
A   19.0    220
A   76.7    20
A   11.4    510
A   25.1    40
A   32.2    120
A   19.5    300
A   89.9    60
A   38.8    10
A   45.3    70
A   39.7    290
B   16.5    460
B   1.8 320
B   82.4    0
B   54.2    80
B   27.4    0
B   25.8    450
B   69.3    30
B   28.7    250
B   52.6    20
B   34.5    100
C   49.7    0
C   23.3    220
C   38.9    160
C   79.4    0
C   53.2    120
C   30.1    150
C   4.0 450
C   20.7    240
C   29.8    250
C   68.5    0

Когда я использовал линейную модель в первом вызове ols как показано в коде, я столкнулся с трудностью, с которой вы столкнулись. Однако, когда я не упомянул о факте, что Area принимает дискретные уровни, я смог рассчитать F-тесты на контрастах.

import pandas as pd
from statsmodels.formula.api import ols

df = pd.read_csv('clover.csv', sep='\s+')
model = ols('Clover_yield ~ C(Area) + Yarrow_stems', data=df)
model = ols('Clover_yield ~ Area + Yarrow_stems', data=df)

results = model.fit()
print (results.summary())

print (results.f_test(['Area[T.B] = Area[T.C], Yarrow_stems=150']))

Вот выход.

Обратите внимание, что в сводке указаны имена, которые можно использовать при формулировании контрастов для факторов, в нашем случае Area[T.B] а также Area[T.C],

                            OLS Regression Results                            
==============================================================================
Dep. Variable:           Clover_yield   R-squared:                       0.529
Model:                            OLS   Adj. R-squared:                  0.474
Method:                 Least Squares   F-statistic:                     9.726
Date:                Thu, 04 Jan 2018   Prob (F-statistic):           0.000177
Time:                        17:26:03   Log-Likelihood:                -125.61
No. Observations:                  30   AIC:                             259.2
Df Residuals:                      26   BIC:                             264.8
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
================================================================================
                   coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------
Intercept       57.5772      6.337      9.086      0.000      44.551      70.603
Area[T.B]        0.3205      7.653      0.042      0.967     -15.411      16.052
Area[T.C]       -0.5432      7.653     -0.071      0.944     -16.274      15.187
Yarrow_stems    -0.1086      0.020     -5.401      0.000      -0.150      -0.067
==============================================================================
Omnibus:                        0.459   Durbin-Watson:                   2.312
Prob(Omnibus):                  0.795   Jarque-Bera (JB):                0.449
Skew:                           0.260   Prob(JB):                        0.799
Kurtosis:                       2.702   Cond. No.                         766.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
<F test: F=array([[ 27873807.59795523]]), p=4.939796675253845e-83, df_denom=26, df_num=2>

Как уже упоминалось в моем комментарии, я не понимаю, что вы намеревались проверить.

Изменить: В ответ на комментарий пользователя 333700, я попытался запустить этот код еще раз, с двумя слегка различными утверждениями, model = ols('Clover_yield ~ C(Area) + Yarrow_stems', data=df) а также print (results.f_test(['C(Area)[T.B] = C(Area)[T.C], Yarrow_stems=150'])), 'C(Area)[TB]' и 'C(Area)[TC]' пришли из резюме с измененной моделью. Таким образом, для этого типа анализа не имеет значения, объявляете ли вы с помощью C() или нет. Вы должны просто не забыть использовать соответствующую форму для фиктивных переменных, как указано в сводке.

Другие вопросы по тегам