如何将 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 统计量完全相同。
我正在尝试对数据中的三个实验组进行系数相等性的 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 统计量完全相同。