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() или нет. Вы должны просто не забыть использовать соответствующую форму для фиктивных переменных, как указано в сводке.