【教男朋友用python做计量】03.利用python进行假设检验(1)

第三节 利用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^β0t(nK)
其中, 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=(00100101)(00100101)β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值,自由度

这节就到这里啦,之后再写写别的检验方法。如果有笔误的话纯属是我手残了,好啦好啦,宝贝学会了吗~溜溜球ヾ(´ _ ` )ง⁽‘-’⁾

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值