第三节 利用python进行T检验、F检验
文章目录
前言
FBI WARNING:
之前讲了怎么用statsmodels进行简单的OLS回归,以及如何输出回归的参数(例如:系数,标准差,P值等等),可以发现其实这个库还挺强大,用来做计量也蛮方便的。所以就继续往下学习,那么就来到了如何利用statsmodels做t检验和F检验。这篇文章比较详细基础,甚至废话有点多,可以说是手把手教你用statsmodels做假设检验了,如果宝贝你还不会的话,我就先倒立洗个头(ノへ ̄、)。**注意:**如果有基础不想看废话的直接跳到最后的总结!!!
一、数据准备
先生成数据,进行初步的OLS回归,这一个步骤你已经很熟悉啦~无非就是import 一下,然后ols() 再fit(),忘记的话看我之前的文章哦。
import pandas as pd
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
#准备需要的包
#生成数据
df=pd.DataFrame(np.random.randint(1,10,(30,4)),columns=["Y","X1","X2","X3"])
df.head(5)
Y X1 X2 X3
0 5 1 8 1
1 2 1 8 5
2 1 8 7 8
3 2 6 8 9
4 6 6 3 6
数据准备好之后就可以进行OLS回归了:
#OLS回归
regression=smf.ols(formula="Y~X1+X2+X3",data=df)
model=regression.fit()
二、t检验
1. t检验回顾
t检验是对单个变量进行的显著性检验,首先要计算t,然后和临界值比较,看t值是落在拒绝域还是接受域。原假设:
H
0
:
β
k
^
=
β
0
H_0:\hat{\beta_k}=\beta_0
H0:βk^=β0的t统计量为:
t
k
=
β
k
^
−
β
0
S
e
(
β
k
)
^
~
t
(
n
−
K
)
t_k=\frac{\hat{\beta_k}-\beta_0}{Se(\hat{\beta_k)}}~t(n-K)
tk=Se(βk)^βk^−β0~t(n−K)
其中,
S
e
(
β
k
^
)
Se(\hat{\beta_k})
Se(βk^)为估计值
β
k
^
\hat{\beta_k}
βk^的标准误。
t检验的原假设示例:
- H 0 : β 1 = 0 H_0:\beta_1=0 H0:β1=0
- H 0 : β 1 = β 2 H_0:\beta_1=\beta_2 H0:β1=β2
- H 0 : β 2 = 1 H_0:\beta_2=1 H0:β2=1
2. 利用statsmodels进行t检验
接下来,我们直接用fit()下面的t_test()方法进行t检验,官方的t_test()方法说明如下:
在传参这里,可以用传入关于原假设的array,也可以传入原假设的字符串,或者是元组。总而言之就是咱们要把咱们的原假设告诉这个方法,那么怎么表达原假设呢~
2.1 R矩阵的方式传参
基本思想就是构造原假设 H 0 : R β = 0 H_0:R\beta=0 H0:Rβ=0,其中 β \beta β为系数向量,然后把 R R R作为参数输入给t_test()函数。
-
举个例子说明,假设我们这里有四个解释变量(包含了常数项),系数分别是: β 0 , β 1 , β 2 , β 3 \beta_0,\beta_1,\beta_2,\beta_3 β0,β1,β2,β3
如果我们的原假设是: H 0 : β 1 = 0 H_0:\beta_1=0 H0:β1=0,那么 R = [ 0 , 1 , 0 , 0 ] R=[0,1,0,0] R=[0,1,0,0],这样 R R R乘以 β \beta β向量之后刚好就是:
[ 0 , 1 , 0 , 0 ] [ β 0 β 1 β 2 β 3 ] = β 1 = 0 [0,1,0,0]\begin{bmatrix} \beta_0\\ \beta_1\\ \beta_2\\ \beta_3\\ \end{bmatrix}=\beta_1=0 [0,1,0,0]⎣⎢⎢⎡β0β1β2β3⎦⎥⎥⎤=β1=0
这样的话 R R R矩阵就可以包含我们任意的原假设,如果原假设 H 0 : β 1 = β 2 H_0:\beta_1=\beta_2 H0:β1=β2,那么 R = [ 0 , 1 , − 1 , 0 ] R=[0,1,-1,0] R=[0,1,−1,0],因为:
[ 0 , 1 , − 1 , 0 ] [ β 0 β 1 β 2 β 3 ] = β 1 − β 2 = 0 [0,1,-1,0]\begin{bmatrix} \beta_0\\ \beta_1\\ \beta_2\\ \beta_3\\ \end{bmatrix}=\beta_1-\beta_2=0 [0,1,−1,0]⎣⎢⎢⎡β0β1β2β3⎦⎥⎥⎤=β1−β2=0 -
还可以一次性弄多个原假设,一次性分别进行t检验,比如原假设分别是:
H 0 : β 1 = 0 H 0 : β 2 = β 3 H_0:\beta_1=0\\H_0:\beta_2=\beta_3 H0:β1=0H0:β2=β3要满足 R β = [ 0 ; 0 ] R\beta=[0;0] Rβ=[0;0],则:
R = ( 0 1 0 0 0 0 1 − 1 ) ⇒ ( 0 1 0 0 0 0 1 − 1 ) ( β 0 β 1 β 2 β 3 ) = ( β 1 β 2 − β 3 ) = ( 0 0 ) R=\begin{pmatrix} 0& 1 & 0 &0 \\ 0& 0&1 &-1 \\ \end{pmatrix}\Rightarrow \begin{pmatrix} 0& 1 & 0 &0 \\ 0& 0&1 &-1 \\ \end{pmatrix}\begin{pmatrix} \beta_0\\ \beta_1\\ \beta_2\\ \beta_3\\ \end{pmatrix}=\begin{pmatrix} \beta_1\\ \beta_2-\beta_3\\ \end{pmatrix}=\begin{pmatrix} 0\\ 0\\ \end{pmatrix} R=(0010010−1)⇒(0010010−1)⎝⎜⎜⎛β0β1β2β3⎠⎟⎟⎞=(β1β2−β3)=(00)
其实这部分的知识你也知道,书上也有,但我还是忍不住废话一下了哈哈哈哈。接下来就可以代码实现了: -
如果 H 0 : β 1 = 0 H_0:\beta_1=0 H0:β1=0
#构造R R1=np.zeros(4) #包含了常数项 R1[1]=1 #[0,1,0,0] #t检验,model是刚刚我们已经进行OLS回归得到的结果 model.t_test(R1)
输出结果:
-
如果 H 0 : β 2 = β 3 H_0:\beta_2=\beta_3 H0:β2=β3
#H0:X2=X3 R2=np.array([0,0,1,-1]) model.t_test(R2)
输出结果:
-
如果一次性进行多个t检验, H 0 : β 1 = 0 ; H 0 : β 2 = β 3 H_0:\beta_1=0;\space \space \space H_0:\beta_2=\beta_3 H0:β1=0; H0:β2=β3
R3=np.array(([0,1,0,0],[0,0,1,-1])) model.t_test(R3)
输出结果:
可以看到这里一次性进行了两个t检验,输出两个结果,和上面单独检验输出的结果相对应。值得注意的是,statsmodels给的方法用array的方式原假设默认都是等于0的,如果想要构造 H 0 : β 1 = 1 H_0:\beta_1=1 H0:β1=1这种就不能用array的方式了(我翻译官方文档理解出来是这样的,如果不对的话当我没说)。
那想要构造非0的原假设,应该怎么办呢?statsmodels还给出了另一种简便的方法,就是直接把原假设输入进去就行了,也就是利用字符串传参。
2.2 利用字符串传参
这是一个简单粗暴的方法,不想构造R矩阵的话,直接看这里:
-
如果 H 0 : β 1 = 0 H_0:\beta_1=0 H0:β1=0
#H0:X1=0 model.t_test("X1=0") #我这里数据集变量名给的是X1,X2,具体输入什么要看你自己数据集的变量名是啥
输出结果:
可以发现和用array的方法一样,那这样的话直接用字符串就好了,想做什么原假设都可以,等于0或者等于其他数直接输入就是:#H0: X1=0; X2=X3 model.t_test("X1=0,X2=X3") #model.t_test("X1=1,X2=1")
输出结果,和输入R矩阵的结果其实一样:
这个方法是不是还蛮简单?现在再来看整个流程可能更直观一点:#导入包 import pandas as pd import numpy as np import statsmodels.formula.api as smf #生成数据 df=pd.DataFrame(np.random.randint(1,10,(30,4)),columns=["Y","X1","X2","X3"]) #OLS regression=smf.ols(formula="Y~X1+X2+X3",data=df) model=regression.fit() #t检验 H0:X1=0,X2=X3 ttest=model.t_test("X1=0,X2=X3") print(ttest) # 使用R矩阵的方法 R=np.array([[0,1,0,0],[0,0,1,-1]]) ttest2=model.t_test(R) print(ttest2)
输出结果:
三、F检验
F检验可以知道回归系数联合的线性假设是否同时成立,即:
H
0
:
R
β
=
r
H_0:R\beta=r
H0:Rβ=r
如果用statsmodels进行F检验的话,和上面的t检验步骤差不多,只不过方法是f_test(),所以这里直接代码演示了:
-
如果 H 0 : β 1 = β 2 = β 3 = 0 H_0:\beta_1=\beta_2=\beta_3=0 H0:β1=β2=β3=0
#F检验 ##传入字符串 ftest=model.f_test("X1=X2=X3=0") print(ftest) ##传入矩阵 R_f=np.eye(4) #np.identity(4) R_f=R_f[1:,:] ftest2=model.f_test(R_f) print(ftest2) #输出的分别是F值,P值,自由度
两个方法输出的值一样:
-
获取F检验的参数:
#获取f值 print(ftest.fvalue) #获取p值 print(ftest.pvalue) #获取两个自由度 print(ftest.df_denom) print(ftest.df_num)
总结及全部代码
以上就是利用statsmodels进行t检验和F检验的内容,我甚至写得废话有点多了,官方文档这里很直观:
为了更好你运行代码,这里我把两个检验的全部的代码放在这里了,复制之后去运行一下吧~
t检验
#导入包
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
#生成数据
df=pd.DataFrame(np.random.randint(1,10,(30,4)),columns=["Y","X1","X2","X3"])
#OLS
regression=smf.ols(formula="Y~X1+X2+X3",data=df)
model=regression.fit()
#t检验 H0:X1=0,X2=X3
ttest=model.t_test("X1=0,X2=X3")
print(ttest)
# 使用R矩阵的方法
R=np.array([[0,1,0,0],[0,0,1,-1]])
ttest2=model.t_test(R)
print(ttest2)
F检验
#导入包
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
#生成数据
df=pd.DataFrame(np.random.randint(1,10,(30,4)),columns=["Y","X1","X2","X3"])
#OLS
regression=smf.ols(formula="Y~X1+X2+X3",data=df)
model=regression.fit()
#F检验
##传入字符串
ftest=model.f_test("X1=X2=X3=0")
print(ftest)
##传入矩阵
R_f=np.eye(4) #np.identity(4)
R_f=R_f[1:,:]
ftest2=model.f_test(R_f)
print(ftest2)
#输出的分别是F值,P值,自由度
这节就到这里啦,之后再写写别的检验方法。如果有笔误的话纯属是我手残了,好啦好啦,宝贝学会了吗~溜溜球ヾ(´ _ ` )ง⁽‘-’⁾