如何进行F测试以比较Python中的嵌套线性模型?

时间:2017-07-21 17:48:43

标签: python scikit-learn linear-regression statsmodels

我想比较两个嵌套的线性模型,称之为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)

给我以下输出:

enter image description here

这告诉我添加 am:wt 交互项可以显着改善模型。有没有办法在Python / sklearn / statsmodels中做类似的事情?

修改:在发布此内容之前,我查看了this question,但无法弄清楚它们是如何相同的。另一个问题是对两个向量进行F检验。这个问题是关于比较2个嵌套线性模型。

我认为这就是我的需要:

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

但我不确定究竟要通过这个功能。如果有人可以提供或指出一个例子,那将非常有帮助。

2 个答案:

答案 0 :(得分:2)

以下列方式调整Jeremy的答案让我得到了我在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笔记本中给了我以下结果:

enter image description here

我也遇到了这些相当神秘的错误:

enter image description here

任何人都知道产生这些错误的原因是什么?

答案 1 :(得分:1)

我发现这个book很有帮助(“使用python进行统计学介绍”/ Thomas Haslwanter)

以下是相关的代码示例:

import createHistory from 'history/createBrowserHistory';
import { createStore, combineReducers, compose, applyMiddleware } from 'redux';
import { routerMiddleware, routerReducer } from 'react-router-redux';
import thunk from 'redux-thunk';

import DevTools from '../components/DevTools';

import * as rootReducer from '../services/rootReducer';

const composeEnhancers = compose;

export const history = createHistory();

const middleware = routerMiddleware(history);

export function configureStore(initialState) {
  const reducers = { ...rootReducer, router: routerReducer };

  const store =  createStore(
    combineReducers(reducers),
    initialState,
    composeEnhancers(
      applyMiddleware(middleware, thunk),
      DevTools.instrument()
    )
  );

  if (module.hot) {
    module.hot.accept('../services/rootReducer', () => {
      const nextRootReducer = require('../services/rootReducer').default;
      const finalReducer = {...nextRootReducer, router: routerReducer };
      store.replaceReducer(finalReducer);
    })
  }

  return store;
}

查看上面的图书链接,了解打印结果。

注意:anova_lm有时与参数'typ'一起使用,尝试使用不同的可能值来查看适合您的值。