Как выполнить F-тест для сравнения вложенных линейных моделей в Python?

Я хочу сравнить две вложенные линейные модели, назовем их m01 и m02, где m01 — сокращенная модель, а m02 — полная модель. Я хочу провести простой F-тест, чтобы увидеть, добавляет ли полная модель значительную полезность по сравнению с сокращенной моделью.

В R это очень просто. Например:

mtcars <- read.csv("https://raw.githubusercontent.com/focods/WonderfulML/master/data/mtcars.csv")
m01 <- lm(mpg ~ am + wt, mtcars)
m02 <- lm(mpg ~ am + am:wt, mtcars)
anova(m01, m02)

Дает мне следующий вывод:

введите здесь описание изображения

Это говорит мне о том, что добавление термина взаимодействия am: wt значительно улучшает модель. Есть ли способ сделать что-то подобное в Python/sklearn/statsmodels?

Изменить: я просмотрел этот вопрос перед публикацией этого и не могу понять, чем они совпадают. Другой вопрос заключается в выполнении F-теста на двух векторах. Этот вопрос касается сравнения двух вложенных линейных моделей.

Я думаю, это то, что мне нужно:

http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html#sklearn.feature_selection.f_regression

но не уверен, что именно передать эту функцию. Если бы кто-нибудь мог предоставить или указать пример, это было бы чрезвычайно полезно.


person Michael Szczepaniak    schedule 21.07.2017    source источник
comment
Вы можете попробовать sklearn.model_selection scikit-learn.org/stable/ модули/ из sklearn.feature_selection import f_regression   -  person Mr_U4913    schedule 21.07.2017
comment
дубликат знака неверен. Как упоминалось в редактировании, это два разных f-теста.   -  person Josef    schedule 21.07.2017
comment
для ответа см. statsmodels anova_lm statsmodels.org/dev/anova.html для сравнения вложенных моделей, результаты OLS также имеют три метода compare_xxx_test для прямого тестирования вложенной ограниченной модели по сравнению с неограниченной моделью. statsmodels.org/dev/generated/   -  person Josef    schedule 21.07.2017
comment
@ user333700 Спасибо. Просто нужно ознакомиться с этим стилем синтаксиса формулы. Похоже на то, что R использует на поверхности.   -  person Michael Szczepaniak    schedule 21.07.2017
comment
@ Mr_U4913 Спасибо. Я просмотрел эту ссылку и еще не исключил ее, но я просто хочу сравнить наборы из двух вложенных моделей одновременно, как показано в моем примере. Model_selection делает больше, чем мне нужно.   -  person Michael Szczepaniak    schedule 21.07.2017
comment
f_regression — это функция, которую вы хотите   -  person Mr_U4913    schedule 21.07.2017


Ответы (2)


Адаптация ответа Джереми следующим образом позволила мне получить тот же результат, что и в R:

import pandas as pd
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

cars_df = pd.read_csv("https://raw.githubusercontent.com/focods/WonderfulML/master/data/mtcars.csv")
m01 = ols('mpg ~ am + wt', data=cars_df).fit()
m02 = ols('mpg ~ am + wt + am:wt', data=cars_df).fit()
anovaResults = anova_lm(m01, m02)
print(anovaResults)

Это дало мне следующие результаты в моем блокноте Jupyter:

введите описание изображения здесь

Я также получил эти довольно загадочные ошибки:

введите описание изображения здесь

Кто-нибудь знает, что вызывает эти ошибки?

person Michael Szczepaniak    schedule 21.11.2017
comment
Это было бы лучше, как новый вопрос. краткий ответ: вы можете игнорировать эти предупреждения. Предполагается, что F-значение должно быть nan, но недавно numpy и scipy начали выдавать предупреждения для nan в дистрибутивах. - person Josef; 21.11.2017

I found this book полезно ("Введение в статистику с помощью python" / Томас Хаслвантер)

Вот соответствующий пример кода:

import pandas as pd
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

df = pd.DataFrame(data, columns=['value', 'treatment'])
model = ols('value ~ C(treatment)', data=df).fit()
anovaResults = anova_lm(model)
print(anovaResults)

Посмотрите ссылку на книгу выше, чтобы увидеть результат печати.

Примечание. anova_lm иногда используется с параметром 'typ ', попробуйте разные возможные значения, чтобы увидеть, какое из них подходит вам.

person Jeremy    schedule 17.11.2017
comment
+1 за ссылку. Это был другой вид дисперсионного анализа, но я смог внести небольшие коррективы в этот пример, чтобы получить те же результаты. - person Michael Szczepaniak; 21.11.2017