伍德里奇的《计量经济学导论》,是目前国内外最经典的计量经济学教材,非常适合新手入门学习。本文将围绕伍德里奇《计量经济学导论》的案例,探讨如何用python实现。
我们只安装woodridge
包,即可直接调用相关数据。
(一)安装
pip install wooldridge
(二)导入库
import wooldridge
(三)导入数据
以伍德里奇《计量经济学导论》例6.3为例,获取该案例的数据集attend,代码如下:
attend = woo.dataWoo('attend')
在Spyder中查看数据:
image-20220415180125530
statsmodels的线性模型有两种不同的接口:
1、基于数组:import statsmodels.api as sm
,需要配合 add_constant()来生成自变量矩阵。 2、基于公式:import statsmodels.formula.api as smf
,写公式直接拟合方程,公式中自变量可以变为平方项、交叉项等。 基于公式的方法较为方法,下面介绍该方法。
import statsmodels.formula.api as smf
在statsmodels.formula.api下调用ols方法。ols用法如下:
sml.ols(formula,data)
-formula是回归的公式
-data为使用的数据,必须是pandas.DataFrame格式
formula公式的形式为parm1~parm2+parm3+parm4
formula的常见符号和用途如下表所示:
符号 | 用途 |
---|---|
~ | 分隔符号,左边为因变量,右边为自变量 |
+ | 分隔自变量,自变量之间用+连接 |
: | 表示变量的交互项。 |
* | 表示所有可能交互项的间接形式。例如,x*z表示x+z+x:z |
0 | 当公式中加入0,意味着模型中没有常数项;如:y~x+w+v代表模型中有截距项,y~x+w+v+0代表模型中没有常数项 |
I( ) | 变量保护函数, I 内的表达式按照算术意义进行解释;如w+z 表示变量w和变量z都包含在公式中,I(w+z)表示 w+z 之和包含在公式中 |
function | 可以在表达式中用的数学函数。例如,np.log(y)~x+w+z表示log(y)对x、w、z和常数项做回归。 |
示例:
formula | 代表含义 |
---|---|
y~x+w+z | |
y~x+I(w+z) | |
y~x+I(w**2) | |
y~x+w:z | |
y~x+w*z | |
y~x+I(w*z) | |
y~(x+w)*z |
以上文获取的attend数据集为例,用出勤率百分数、读大学之前的GPA和ACT分数来解释期末考试标准化成绩的一个模型是
import statsmodels.formula.api as smf
reg = smf.ols(formula='stndfnl ~ atndrte*priGPA + ACT + I(priGPA**2) + I(ACT**2)',
data=attend)
results = reg.fit()
得到的results为 statsmodels.regression.linear_model.RegressionResultsWrapper
类,我们通过summary()方法获取模型回归结果。
print(results.summary())
#Out:
OLS Regression Results
==============================================================================
Dep. Variable: stndfnl R-squared: 0.229
Model: OLS Adj. R-squared: 0.222
Method: Least Squares F-statistic: 33.25
Date: Sun, 03 Apr 2022 Prob (F-statistic): 3.49e-35
Time: 13:36:16 Log-Likelihood: -868.90
No. Observations: 680 AIC: 1752.
Df Residuals: 673 BIC: 1783.
Df Model: 6
Covariance Type: nonrobust
==================================================================================
coef std err t P>|t| [0.025 0.975]
----------------------------------------------------------------------------------
Intercept 2.0503 1.360 1.507 0.132 -0.621 4.721
atndrte -0.0067 0.010 -0.656 0.512 -0.027 0.013
priGPA -1.6285 0.481 -3.386 0.001 -2.573 -0.684
atndrte:priGPA 0.0056 0.004 1.294 0.196 -0.003 0.014
ACT -0.1280 0.098 -1.300 0.194 -0.321 0.065
I(priGPA ** 2) 0.2959 0.101 2.928 0.004 0.097 0.494
I(ACT ** 2) 0.0045 0.002 2.083 0.038 0.000 0.009
==============================================================================
Omnibus: 2.581 Durbin-Watson: 2.279
Prob(Omnibus): 0.275 Jarque-Bera (JB): 2.474
Skew: -0.095 Prob(JB): 0.290
Kurtosis: 3.226 Cond. No. 2.43e+04
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 2.43e+04. This might indicate that there are
strong multicollinearity or other numerical problems.
回归结果表示估计出来的方程是:
接下来我们来解释一下上述表格的几个参数:
第一个表格 | 披露模型基本信息 |
---|---|
名称 | 说明 |
Dep. Variable | 因变量 |
Model | 采用的模型 |
Method | 模型系数计算方法 |
No. Observations | 样本数量 |
DF Residuals | 残差的自由度 |
DF Model | 模型的自由度 |
R-squared | 可决系数,表示所有自变量对因变量的联合的影响程度,用于度量回归方程拟合度的好坏,越接近于 1说明拟合程度越好。 |
Adj. R-squared | 调整的可决系数 |
F-statistic | F统计量,用于对整体回归方程进行显著性检验,检验所有自变量在整体上对因变量的影响是否显著。 |
Prob (F-statistic) | F统计量的p值 |
Log-likelihood | 对数似然 |
AIC | AIC信息准则 |
BIC | BIC信息准则 |
第二个表格 | 披露系数相关信息 |
名称 | 说明 |
coef | 回归系数 |
std err | 标准差,也称标准偏差,是方差的算术平方根,反映样本数据值与回归模型估计值之间的平均差异程度。 |
t | t统计量,等于回归系数除以标准差,用于对每个回归系数分别进行检验,检验每个自变量对因变量的影响是否显著。如果某个自变量的影响不显著,意味着可以从模型中剔除这个自变量。 |
P > |t| | t检验的p值,反映每个自变量与因变量的相关性假设的显著性。 |
[0.025,0.975] | 估计参数的 95%置信区间的下限和上限 |
第三个表格 | |
名称 | 说明 |
Skewness | 偏度,反映数据分布的非对称程度 |
Kurtosis | 峰度,反映数据分布陡峭或平滑程度 |
Omnibus | Omnibus检验统计量,基于峰度和偏度进行数据正态性的检验 |
Prob(Omnibus) | Omnibus检验统计量的p值 |
Jarque-Bera | JB统计量,基于峰度和偏度对数据正态性的检验 |
Prob (JB) | JB统计量的p值 |
Durbin-Watson | DW统计量,检验残差中是否存在自相关 |
Cond. No | 多重共线性检验 |
statsmodels.regression.linear_model.RegressionResultsWrapper
类的常见方法和属性如下表所示:
方法/属性 | 说明 |
---|---|
.summary() | 获取回归结果 |
.t_test() | 进行t检验 |
.F_test() | 进行F检验 |
.params | 获取回归系数 |
.bse | 获取回归系数标准差 |
.pvalues | 获取回归系数p值 |
.tvalues | 获取回归系数t值 |
.conf_int() | 获取回归系数置信区,括号中可填具体数字,比如0.05,0.1,代表显著性水平,默认5% |
.fittedvalues | 获取模型预测值 |
.resid | 获取残差 |
.df_model | 模型自由度(系数自由度) |
.df_resid | 获取残差自由度(样本自由度) |
.nobs | 获取模型样本数量 |
.rsquared | 获取R方 |
.rsquared_adj | 获取调整R方 |
.aic | 获取AIC |
.bic | 获取BIC |
.fvalue | 获取F-statistic |
.f_pvalue | 获取F-statistic的pvalue |
.mse_ | 获取模型mse |
.mse_resid | 获取残差mse |
.mse_total | 获取总体mse |
示例:
(1)获取回归系数:
print(results.params)
#Out:
Intercept 2.050293
atndrte -0.006713
priGPA -1.628540
atndrte:priGPA 0.005586
ACT -0.128039
I(priGPA ** 2) 0.295905
I(ACT ** 2) 0.004533
dtype: float64`
(2)对线性假设的t检验
例1:检验atndrte和priGPA的系数是否相等,即检验
可输入代码:
hypotheses = 'atndrte =priGPA'
t_test = results.t_test(hypotheses)
print(t_test)
#Out:
Test for Constraints
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
c0 1.6218 0.479 3.384 0.001 0.681 2.563
==============================================================================
由结果可知,t检验的p值为0.001,说明在1%的显著性水平下,可以拒绝原假设,即atndrte和priGPA的系数不相等。
例2:检验ACT的系数否等于1,即检验
可输入代码:
hypotheses = 'ACT=1'
t_test = results.t_test(hypotheses)
print(t_test)
#Out:
Test for Constraints
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
c0 -0.1280 0.098 -11.453 0.000 -0.321 0.065
==============================================================================
由结果可知,t检验的p值分别为0.000,说明在1%的显著性水平下,可以拒绝原假设,即ACT的系数不等于1。
例3:分别检验atndrte和priGPA的系数是否相等,和检验ACT的系数否等于1,即分别检验
可输入代码:
hypotheses = 'atndrte=priGPA, ACT=1'
t_test = results.t_test(hypotheses)
print(t_test)
#Out:
Test for Constraints
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
c0 1.6218 0.479 3.384 0.001 0.681 2.563
c1 -0.1280 0.098 -11.453 0.000 -0.321 0.065
==============================================================================
由结果可知,两个t检验的p值分别为0.001和0.000,说明在1%的显著性水平下,可以分别拒绝原假设,即tndrte和priGPA的系数不相等,ACT的系数不等于1。
(2)对线性假设的F检验
例1:考虑检验atndrte和priGPA的系数是否相等,同时ACT的系数是否等于1,即对2个约束条件进行联合检验。则原假设为
可输入代码:
hypotheses = 'atndrte =priGPA,ACT=1'
f_test = results.f_test(hypotheses)
print(f_test)
#Out:
由结果可知,F检验的p值<1%,说明在1%的显著性水平下,可以拒绝原假设。
欢迎关注:
公众号Python for Finance