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

Posted

技术标签:

【中文标题】如何进行 F 检验以比较 Python 中的嵌套线性模型?【英文标题】:How do I do an F-test to compare nested linear models in Python? 【发布时间】:2017-12-27 20:49:58 【问题描述】:

我想比较两个嵌套线性模型,分别称为 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 中做类似的事情?

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

我认为这是我需要的:

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

但不确定传递此函数的具体内容。如果有人能提供或指出一个例子,那将非常有帮助。

【问题讨论】:

你可以试试 sklearn.model_selection scikit-learn.org/stable/modules/… from sklearn.feature_selection import f_regression 重复标记不正确。正如编辑中提到的,这是两个不同的 f 检验。 答案见 statsmodels anova_lm statsmodels.org/dev/anova.html 比较嵌套模型,OLS 结果还具有三种 compare_xxx_test 方法,用于直接测试嵌套受限模型和非受限模型。 statsmodels.org/dev/generated/… @user333700 谢谢。只需要熟悉这种风格的公式语法。看起来与 R 在表面上使用的相似。 @Mr_U4913 谢谢。我查看了该链接并没有排除它,但我只想像我在示例中展示的那样一次比较 2 个嵌套模型的集合。 model_selection 做得比我需要的要多。 【参考方案1】:

通过以下方式调整 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 notebook 中给了我以下结果:

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

有人知道是什么导致了这些错误吗?

【讨论】:

这作为一个新问题会更好。简短回答:您可以忽略这些警告。 F 值是并且应该是 nan,但最近 numpy 和 scipy 已经开始对分布中的 nan 发出警告。【参考方案2】:

我发现这个book 很有帮助(“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)

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

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

【讨论】:

+1 供参考。这是一种不同类型的方差分析,但我能够对这个示例进行一些小的调整以获得相同的结果。

以上是关于如何进行 F 检验以比较 Python 中的嵌套线性模型?的主要内容,如果未能解决你的问题,请参考以下文章

F检验通过说明啥?

R语言双因素方差分析

R语言多因素方差分析及评估假设检验

在回归分析中,F检验和t检验各有啥作用?

t检验如何进行

R语言Kruskal Wallis检验以及Friedman检验