用Python底层编写进行计量经济分析(一):多元线性回归(参数估计、T检验、拟合优度、F检验)
之前上学时计量经济学的模型实现总是用Eviews等软件实现。但是对于点击鼠标得到结果的方式,总是让自己感觉没有参与模型建立的过程。所以准备利用python写代码从底层,进行编写进行计量经济分析,让自己更了解预算过程。暂时准备写以下几篇,后面再慢慢补充;
- 多元线性回归和显著性检验(参数估计、T检验、F检验、拟合优度)
- 多重共线性(导致结果、检验——方差膨胀因子、补救措施——岭回归)
- 异方差(导致结果、检验——White、补救措施——广义线性回归)
- 自相关(导致结果、检验——D-W、补救措施——广义线性回归)
写的比较仓促,代码中如有错误欢迎指正!
一、计量经济分析
个人理解计量经济学可以认为是统计学的一个应用或分支。我们知道在统计层面上,因素的关系大概可以分两种:因果关系和相关关系。
现在十分流行的机器学习、深度学习中关注的事物间的相关关系(比如身高和体重),事物间不一定需要是一个导致另一个关系,只要需要再生产环境相关关系是有效的就可以拿来用。
而计量经济分析则主要侧重的是因果关系,因为我们的主要目的是分析然后进行预测。既然是分析,我们就需要知道因素之间的具体关系,一个因素的变化是怎样导致另一个因素的变化。这也是计量与机器学习的最明显差异。
既然计量经济分析侧重的是因果关系,因此我们对模型的检验就会更加深入。具体的,比如在机器学习中,我们得到一个模型,模型再训练集、测试集、时间外样本集等AUC等指标均表现良好,并且线上可以稳定运行。我们就可以拿来使用。而在计量经济学中,我们需要对模型进行多种检验,确保模型中的参数意义明确和有效。
计量经济分析的方法步骤可以总结如下:1.模型设定(设定一个合理模型)——>2.参数估计(最小二乘等)——>3.模型检验(参数显著性、是否有多重共线、异方差,自相关和参数符号是否符合经济意义等)——>4.模型应用(利用模型进行因素间内在结构分析或预测)
本系列只对原理和形式进行简单介绍,然后利用python进行实现。如果想要入门,可以看看国内本科的一些计量经济学教材。想要深入一些,可以看看伍德里奇的《计量经济学导论》。若想要深究,可以拜读格林的《计量经济分析》。
二、多元线性回归
2.1.多元线性回归形式
一个因素的变化通常是由多个因素共同决定的,比如经典的生产函数认为,产出是由资本和劳动力决定的。如果我们研究多个因素对另一个变量的作用,我们设置如下多元线性回归模型:
Y i = β 0 + β 1 ∗ x 1 i + β 2 ∗ x 2 i + . . . + β k ∗ x k i + ε i Y_i=β_0+β_1*x_{1i}+β_2*x_{2i}+...+β_k*x_{ki}+ε_i Yi=β0+β1∗x1i+β2∗x2i+...+βk∗xki+εi
其矩阵形式为:
Y = β ∗ x + ε Y=β*x+ε Y=β∗x+ε
Y Y Y被称为应变量或被解释变量, x k x_{k} xk是解释变量, ε ε ε扰动项, β k β_k βk是 x k x_{k} xk前的参数,表示 x k x_{k} xk一单位变动引起的 Y i Y_i Yi变动程度,如果 x k x_{k} xk和 Y i Y_i Yi都是对数形式: l n ( x k ) ln(x_{k}) ln(xk)和 l n ( Y i ) ln(Y_i) ln(Yi),则 β k β_k βk表示的经济学中弹性。
我们估计模型使用的最小二乘法,但是若保证估计是有效的,模型必须满足线性回归的六大假定(不细说了,每违反一种假定就会犯响应错误,就需要相应补救):
1.模型符合线性模式
2.X满秩(无多重共线)
3.零均值价值: E ( ε i ∣ X i ) = 0 E(ε_i|X_i)=0 E(εi∣Xi)=0(自变量外生)
4.同方差: V a r ( ε i ∣ X i ) = σ Var(ε_i|X_i)=σ Var(εi∣Xi)=σ
5.无自相关: c o v ( ε i , ε j ) = 0 cov(ε_i, ε_j)=0 cov(εi,εj)=0
6.球形扰动:ε_i是正态分布
2.2.多元线性回归参数估计
参数估计使用最小二乘法,得到参数估计为:
E ( β ∣ x ) = ( X ′ X ) − 1 X ′ y E(β|x)=(X'X)^{-1}X'y E(β∣x)=(X′X)−1X′y
V a r ( β ∣ x ) = σ 2 ( X ′ X ) − 1 Var(β|x) = σ^2(X'X)^{-1} Var(β∣x)=σ2(X′X)−1 (后面t检验会用到, σ 2 σ^2 σ2可用残差 s 2 s^2 s2估计得到)
2.3.多元线性回归检验
对于多元线性回归的检验,和统计的假设检验一样,就是构造符合几大分布的统计量(正态、T分布、F分布、卡方分布)的统计量,然后进行假设检验,其中零假设为参数等于0(或方程不显著),我们的目标是拒绝零假设,这样参数才是有意义,才可以进行下一步的分析。
2.3.1.单个参数检验:
构造统计量:T= E ( β ∣ x ) V a r ( β ∣ x ) \frac{E(β|x)}{Var(β|x)} Var(β∣x)E(β∣x)
T符合 t ( n − k ) t(n-k) t(n−k), n n n为样本量, k k k为参数个数,查表可知参数是否显著等于0
2.3.2.整体检验:
1.拟合优度 R 2 = S S R S S T R^2=\frac{SSR}{SST} R2=SSTSSR
其中 S S R SSR SSR是回归平方和, S S T SST SST是总平方和, S S T = S S R + S S E SST=SSR+SSE SST=SSR+SSE,即总平方和=回归平方和+误差平方和。 R 2 R^2 R2是一个0~1之间的数字, R 2 R^2 R2越大,代表方程拟合越好(实际上,随着变量增多, R 2 R^2 R2一定会增大,仅此还有加入了变量个数惩罚的调整拟合优度)。
2.F检验: F = R 2 / ( k − 1 ) 1 − R 2 / ( n − k ) F=\frac{R^2/(k-1)}{1-R^2/(n-k)} F=1−R2/(n−k)R2/(k−1)
因为 R 2 R^2 R2并没有自由度的概念,因此我们无法查表得知 R 2 R^2 R2多大算大,因此我们构造 F F F统计量, F F F统计量服从 F ( k − 1 , n − k ) F(k-1,n-k) F(k−1,n−k),于是我们可以查表得到拒绝域,从而判断方程整体是否显著。
多说一句,F分布是两个卡方分布除以各自自由度的比构成的。F检验的思想非常常用,比如方差分析等都是利用F检验的思想,将方差分为不同的类别,查看不同类别的方差(例如组内,组间)是否存在不同。
三、多元线性回归的python实现
我们使用python的sklearn中的房价数据集进行多元线性回归。
from sklearn.datasets import fetch_california_housing as fchdata=fch() #导入数据
house_data=pd.DataFrame(data.data) #将自变量转换成dataframe格式,便于查看
house_data.columns=data.feature_names #命名自变量
house_data['value'] = data.target
house_data = house_data[0:100]
house_data = house_data[['value', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population']]
print(house_data.head())
我们想用,房屋年龄,房间数量,洗漱间数量和人口来预测一个房子的房价。
接下来我们利用python,进行多元线性回归的参数估计和检验进行底层编写,我们将多元线性回归整体封装为一个类,将多元线性回归模型设计成一个对象:
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 3 15:40:38 2020@author: nbszg
"""import numpy as np
import pandas as pd
import scipy.stats as stclass mul_linear_model(object):#intercept定义是否有截距项,在计量经济分析中,基本都要有截距项,否则计算出的拟合优度是没有意义的def __init__(self, y, X, intercept=True):data_x = X.copy()data_y = y.copy()self.data_x = data_xself.y = np.array(data_y)self.intercept = interceptif intercept == False:self.columns = data_x.columnsself.X = np.mat(data_x)else:#插入截距项data_x.insert(0,'intercept',np.ones(len(data_x))) #每个变量名称self.columns = data_x.columns#转换为矩阵,方便后面运算self.X = np.mat(data_x)#X的转置,方便后面运算self.XT=np.mat(self.X).T self.N = self.X.shape[0] #样本量self.K = self.X.shape[1] #变量个数#拟合模型def fit(self, output=True):#使用最小二乘法(X'X)的逆成X'yself.b = np.array(np.dot(np.dot(np.linalg.inv(np.dot(self.XT,self.X)),self.XT),np.mat(self.y).T))if output:for i in range(self.K):print("variable {0}'s cofe estimate is : {1}".format(self.columns[i], self.b[i][0]))self.S = np.array(np.linalg.inv(np.dot(self.XT,self.X)))return self.b#预测函数def predict(self, X_p):#直接使用条件期望作y=Xb为预测值y_hat =np.array(np.dot(X_p,self.b))return y_hat#参数T检验def T_test(self, alpha):#计算预测值y_hat = np.array(np.dot(self.X,self.b).T)[0]#计算e'e,即残差平方和error_square = np.sum(np.square(y_hat-self.y))#计算扰动项的方差估计,即残差平方和sigma_hat = error_square/(self.N-self.K)#计算(X'X)的逆,用于估计参数b的方差#S = self.Sfor i in range(self.K):sk = self.S[i][i]#b的方差估计为sigma_hat * sk,构造t统计量,服从自由度为n-k的T分布Tk = self.b[i][0]/np.sqrt(sigma_hat * sk)#查表进行检验if abs(Tk) > abs(st.t.ppf(alpha/2, df = self.N-self.K)):print("T of variable {0} is: {1}, refuse H0".format(self.columns[i], Tk))else:print("T of variable {0} is: {1}, can't refuse H0".format(self.columns[i], Tk))#拟合优度计算def R_square(self):y_ba = np.mean(self.y)y_hat = np.array(np.dot(self.X,self.b).T)[0]#计算总平方和self.SST = np.sum(np.square(self.y-y_ba))#计算误差平方和self.SSE = np.sum(np.square(self.y-y_hat))#计算离差平方和self.SSR = self.SST - self.SSE#利用拟合优度公式计算拟合优度self.R_2 = self.SSR/self.SSTreturn self.R_2#整体F检验def F_test(self, alpha):#先求出拟合优度self.R_square()#利用公式求F统计量,附送自由优度为(K-1, N-K)的F分布F = (self.R_2/(self.K-1))/((1-self.R_2)/(self.N-self.K))#查表进行检验if abs(F) > abs(st.f.ppf(1-alpha, dfn = self.K-1, dfd = self.N-self.K)):print("F of function is: {0}, refuse H0".format(F))else:print("F of function is: {0}, can't refuse H0".format(F))
编写好了多元线性回归,我们使用刚才的房屋数据进行试验:
linear_model = mul_linear_model(house_data['value'],house_data[['HouseAge', 'AveRooms', 'AveBedrms', 'Population']])linear_model.fit()
linear_model.T_test(0.05)
print(linear_model.R_square())
linear_model.F_test(0.05)
得到的结果如下:
想知道编写的对不对,我们直接通statsmodels.formula.api
的ols
模块进行验证,两行代码就可以解决刚才编写的所有问题:
import statsmodels.api as sm #最小二乘
from statsmodels.formula.api import ols #加载ols模型lm=ols('value~ HouseAge + AveRooms + AveBedrms + Population',data=house_data).fit()
print(lm.summary())
检验结果如上图,其中红框的部分是我们的估计参数和检验结果,可以看到使用statsmodels包与我们从底层编写的计算结果是一致的。证明了我们代码的正确性。
用Python底层编写进行计量经济分析(一):多元线性回归(参数估计、T检验、拟合优度、F检验)相关推荐
- 用Python底层编写进行计量经济分析(四):自相关(原因、结果、检验:DW检验、补救:广义线性回归)
系列前面的文章: 多元线性回归和显著性检验(参数估计.T检验.F检验.拟合优度) 多重共线性(导致结果.检验--方差膨胀因子.补救措施--岭回归) 异方差(导致结果.检验--White.补救措施--广 ...
- Python金融系列第五篇:多元线性回归和残差分析
作者:chen_h 微信号 & QQ:862251340 微信公众号:coderpai 第一篇:计算股票回报率,均值和方差 第二篇:简单线性回归 第三篇:随机变量和分布 第四篇:置信区间和假设 ...
- Python机器学习:线型回归法007多元线性回归和正规方程的解
- python数据分析 - T检验与F检验:二组数据那个更好?(一)
T检验,F检验 1.导语 2.假设检验 2.1 原假设与备择假设 2.2 接受域与拒绝域 2.3 两类错误 3.单样本的假设检验 3.1 选择零假设和对立假设 3.2 选择显著水平α 3.3 决定检验 ...
- python数据分析----卡方检验,T检验,F检验,K-S检验
卡方检验 卡方检验是一种用途很广的计数资料的假设检验方法.它属于非参数检验的范畴,主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析.其根本思想就是在于比较理论频数和实际频数的吻合 ...
- 计量经济分析:计量经济学中的三大检验(LR, Wald, LM)
前面用Python底层编写进行计量经济分析(一):多元线性回归(参数估计.T检验.拟合优度.F检验)写过在多元线性回归时的参数检验方法t检验和方程整体的F检验.在分析中和实际情况中,我们可能会假定因素 ...
- Python 实战多元线性回归模型,附带原理+代码
作者 | 萝卜 来源 | 早起Python( ID:zaoqi-python ) 「多元线性回归模型」非常常见,是大多数人入门机器学习的第一个案例,尽管如此,里面还是有许多值得学习和注意的地方.其中多 ...
- python f检验 模型拟合度_多元线性回归模型检验和预测
一.概述 (F检验)显著性检验:检测自变量是否真正影响到因变量的波动. (t检验)回归系数检验:单个自变量在模型中是否有效. 二.回归模型检验 检验回归模型的好坏常用的是F检验和t检验.F检验验证的是 ...
- 推断统计python化(参数估计,假设检验与 t检验)
目录 1.参数估计 1.1 点估计 1.2 区间估计 1.2.1 区间估计概述 1.2.2 区间估计的方法 1.3 进行区间估计的Python函数 2. 案例分析 3. 假设检验 3.1 假设检验概述 ...
最新文章
- Q767 重构字符串
- AI:2020年6月北京智源大会演讲视频回放集合——分享博主体会与总结
- bundlefusion论文阅读笔记
- 项目学生:使用AOP简化代码
- leetcode1085. 最小元素各数位之和 py不止是字符串的神!
- 坦克游戏服务器未响应,《坦克世界》退出战斗 退出战斗卡死解决办法
- hdu 1398 Square Coins/hdu 1028 Ignatius and the Princess III
- MHA+keepalived实现Mysql高可用及读写分离
- 【Python笔记】pygame 游戏框架
- Julia: [1 +j] ==[1 + j] ?
- Kettle连接mysql数据库所需驱动包,出现报错情况(附驱动下载方法)
- 红linux系统,红帽子linux系统
- 7-5 统计素数并求和
- WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
- cad小插件文字刷_CAD实用小插件,这是一串让你效率提升相见恨晚的代码!
- 努力就有结果,我是如何30岁转行学习软件测试拿到13k的?
- 40个非常有创意的网页设计作品欣赏
- idea从零到精通目录导航
- 如何使用cygwin在windows下Linux编程
- validate.js 插件表单校验