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

Mic*_*iak 3 python linear-regression scikit-learn 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)
Run Code Online (Sandbox Code Playgroud)

给我以下输出:

在此处输入图片说明

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

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

我认为这就是我需要的:

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

但我不确定传递这个函数到底是什么。如果有人可以提供或指出一个例子,那将非常有帮助。

Mic*_*iak 8

通过以下方式调整 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)
Run Code Online (Sandbox Code Playgroud)

这在我的 jupyter 笔记本中给了我以下结果:

在此处输入图片说明

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

在此处输入图片说明

任何人都知道是什么导致了这些错误?

  • 这作为一个新问题会更好。简短回答:您可以忽略这些警告。F 值是并且应该是 nan,但最近 numpy 和 scipy 已经开始对分布中的 nans 发出警告。 (4认同)

小智 5

我发现这本书很有帮助(“Python 统计简介”/Thomas Haslwanter)

这是相关的代码示例:

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)
Run Code Online (Sandbox Code Playgroud)

查看上面的书籍链接以获取打印结果。

注意:anova_lm有时与参数“typ”一起使用,尝试其不同的可能值,看看哪个适合您。