如何进行 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 中的嵌套线性模型?的主要内容,如果未能解决你的问题,请参考以下文章