如何将 OLSResults.f_test 与 python 中的实验组一起使用

How to use OLSResults.f_test with experimental groups in python

我正在尝试对数据中的三个实验组进行系数相等性的 F 检验。

我已经 运行 回归评估随机对照试验的结果,该试验包括四组 G1、G2、G3 和对照组。

现在我需要确定实验组(G1、G2、G3)是否相等。

我知道我可以使用 Statsmodel 的 OLSResults.f_test 来做到这一点。但是我不清楚如何配置它。该网站提供了示例,但我不确定如何翻译它:https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLSResults.f_test.html

那里给出的例子是:

from statsmodels.datasets import longley
from statsmodels.formula.api import ols
dta = longley.load_pandas().data
formula = 'TOTEMP ~ GNPDEFL + GNP + UNEMP + ARMED + POP + YEAR'
results = ols(formula, dta).fit()
hypotheses = '(GNPDEFL = GNP), (UNEMP = 2), (YEAR/1829 = 1)'
f_test = results.f_test(hypotheses)
print(f_test)

我如何从本质上写出以下假设,以便检查我的 3 个实验组是否不同?

hypotheses = '(G1=G2), (G1=G3), (G2=G3)'

我们可以用鸢尾花的例子:

from statsmodels.formula.api import ols
import pandas as pd

data = load_iris()
df = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data",
                 header=None,names=["s_wid","s_len","p_wid","p_len","species"])

df.species.unique()

array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object)

物种中有 3 个类别,我们可以像您一样拟合模型:

formula = 's_len ~ species'
results = ols(formula, df).fit()

如果我们看一下结果:

results.summary()

Dep. Variable:  s_len   R-squared:  0.392
Model:  OLS Adj. R-squared: 0.384
Method: Least Squares   F-statistic:    47.36
Date:   Sat, 23 May 2020    Prob (F-statistic): 1.33e-16
Time:   01:07:39    Log-Likelihood: -49.688
No. Observations:   150 AIC:    105.4
Df Residuals:   147 BIC:    114.4
Df Model:   2       
Covariance Type:    nonrobust

    coef    std err t   P>|t|   [0.025  0.975]
Intercept   3.4180  0.048   70.998  0.000   3.323   3.513
species[T.Iris-versicolor]  -0.6480 0.068   -9.518  0.000   -0.783  -0.513
species[T.Iris-virginica]   -0.4440 0.068   -6.521  0.000   -0.579  -0.309

如果您的模型仅由组组成,如上所示,那么 F 统计量 (47.36) 和 p.value (1.33e-16) 就是您所需要的。此 F 检验针对仅拦截模型测试此模型。

更详细的解释:模型以Iris-setosa作为参考,另外两个物种对萼片长度的影响,s_len,计算为相对于[=15=的系数].如果我们看均值,这就很清楚了:

df.groupby('species')['s_len'].mean()

Iris-setosa        3.418
Iris-versicolor    2.770
Iris-virginica     2.974

在这种情况下,假设 Iris-versicolor = 0 和 Iris-virginica=0,因此各组都相等:

hypotheses = '(species[T.Iris-versicolor] = 0), (species[T.Iris-virginica] = 0)'
results.f_test(hypotheses)

<class 'statsmodels.stats.contrast.ContrastResults'>
<F test: F=array([[47.3644614]]), p=1.327916518456957e-16, df_denom=147, df_num=2>

现在,您可以看到这与摘要中提供的 F 统计量完全相同。