【教男朋友用python做计量】03.利用python进行假设检验(1)
第三節 利用python進行T檢驗、F檢驗
文章目錄
- 第三節 利用python進行T檢驗、F檢驗
- 前言
- 一、數據準備
- 二、t檢驗
- 1. t檢驗回顧
- 2. 利用statsmodels進行t檢驗
- 2.1 R矩陣的方式傳參
- 2.2 利用字符串傳參
- 三、F檢驗
- 總結及全部代碼
- 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值是落在拒絕域還是接受域。原假設:H0:βk^=β0H_0:\hat{\beta_k}=\beta_0H0?:βk?^?=β0?的t統計量為:
tk=βk^?β0Se(β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)
其中,Se(βk^)Se(\hat{\beta_k})Se(βk?^?)為估計值βk^\hat{\beta_k}βk?^?的標準誤。
t檢驗的原假設示例:
- H0:β1=0H_0:\beta_1=0H0?:β1?=0
- H0:β1=β2H_0:\beta_1=\beta_2H0?:β1?=β2?
- H0:β2=1H_0:\beta_2=1H0?:β2?=1
2. 利用statsmodels進行t檢驗
接下來,我們直接用fit()下面的t_test()方法進行t檢驗,官方的t_test()方法說明如下:
在傳參這里,可以用傳入關于原假設的array,也可以傳入原假設的字符串,或者是元組。總而言之就是咱們要把咱們的原假設告訴這個方法,那么怎么表達原假設呢~
2.1 R矩陣的方式傳參
基本思想就是構造原假設 H0:Rβ=0H_0:R\beta=0H0?:Rβ=0,其中β\betaβ為系數向量,然后把RRR作為參數輸入給t_test()函數。
-
舉個例子說明,假設我們這里有四個解釋變量(包含了常數項),系數分別是:β0,β1,β2,β3\beta_0,\beta_1,\beta_2,\beta_3β0?,β1?,β2?,β3?
如果我們的原假設是:H0:β1=0H_0:\beta_1=0H0?:β1?=0,那么R=[0,1,0,0]R=[0,1,0,0]R=[0,1,0,0],這樣RRR乘以β\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
這樣的話RRR矩陣就可以包含我們任意的原假設,如果原假設H0:β1=β2H_0:\beta_1=\beta_2H0?:β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檢驗,比如原假設分別是:
H0:β1=0H0:β2=β3H_0:\beta_1=0\\H_0:\beta_2=\beta_3H0?:β1?=0H0?:β2?=β3?要滿足Rβ=[0;0]R\beta=[0;0]Rβ=[0;0],則:
R=(0100001?1)?(0100001?1)(β0β1β2β3)=(β1β2?β3)=(00)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=(00?10?01?0?1?)?(00?10?01?0?1?)?????β0?β1?β2?β3???????=(β1?β2??β3??)=(00?)
其實這部分的知識你也知道,書上也有,但我還是忍不住廢話一下了哈哈哈哈。接下來就可以代碼實現了: -
如果H0:β1=0H_0:\beta_1=0H0?:β1?=0
#構造R R1=np.zeros(4) #包含了常數項 R1[1]=1 #[0,1,0,0] #t檢驗,model是剛剛我們已經進行OLS回歸得到的結果 model.t_test(R1)輸出結果:
-
如果H0:β2=β3H_0:\beta_2=\beta_3H0?:β2?=β3?
#H0:X2=X3 R2=np.array([0,0,1,-1]) model.t_test(R2)輸出結果:
-
如果一次性進行多個t檢驗,H0:β1=0;H0:β2=β3H_0:\beta_1=0;\space \space \space H_0:\beta_2=\beta_3H0?:β1?=0;???H0?:β2?=β3?
R3=np.array(([0,1,0,0],[0,0,1,-1])) model.t_test(R3)輸出結果:
可以看到這里一次性進行了兩個t檢驗,輸出兩個結果,和上面單獨檢驗輸出的結果相對應。值得注意的是,statsmodels給的方法用array的方式原假設默認都是等于0的,如果想要構造H0:β1=1H_0:\beta_1=1H0?:β1?=1這種就不能用array的方式了(我翻譯官方文檔理解出來是這樣的,如果不對的話當我沒說)。
那想要構造非0的原假設,應該怎么辦呢?statsmodels還給出了另一種簡便的方法,就是直接把原假設輸入進去就行了,也就是利用字符串傳參。
2.2 利用字符串傳參
這是一個簡單粗暴的方法,不想構造R矩陣的話,直接看這里:
-
如果 H0:β1=0H_0:\beta_1=0H0?:β1?=0
#H0:X1=0 model.t_test("X1=0") #我這里數據集變量名給的是X1,X2,具體輸入什么要看你自己數據集的變量名是啥輸出結果:
#H0: X1=0; X2=X3 model.t_test("X1=0,X2=X3") #model.t_test("X1=1,X2=1")
可以發現和用array的方法一樣,那這樣的話直接用字符串就好了,想做什么原假設都可以,等于0或者等于其他數直接輸入就是:輸出結果,和輸入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檢驗可以知道回歸系數聯合的線性假設是否同時成立,即:
H0:Rβ=rH_0:R\beta=rH0?:Rβ=r
如果用statsmodels進行F檢驗的話,和上面的t檢驗步驟差不多,只不過方法是f_test(),所以這里直接代碼演示了:
-
如果H0:β1=β2=β3=0H_0:\beta_1=\beta_2=\beta_3=0H0?:β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檢驗的內容,我甚至寫得廢話有點多了,官方文檔這里很直觀:
- 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值,自由度這節就到這里啦,之后再寫寫別的檢驗方法。如果有筆誤的話純屬是我手殘了,好啦好啦,寶貝學會了嗎~溜溜球ヾ(′ _ ` )??‘-’?
總結
以上是生活随笔為你收集整理的【教男朋友用python做计量】03.利用python进行假设检验(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试题中的几道算法
- 下一篇: 个人设置微信公众号自定义菜单的初级经验