之前上学时计量经济学的模型实现总是用Eviews等软件实现。但是对于点击鼠标得到结果的方式,总是让自己感觉没有参与模型建立的过程。所以准备利用python写代码从底层,进行编写进行计量经济分析,让自己更了解预算过程。暂时准备写以下几篇,后面再慢慢补充;

  1. 多元线性回归和显著性检验(参数估计、T检验、F检验、拟合优度)
  2. 多重共线性(导致结果、检验——方差膨胀因子、补救措施——岭回归)
  3. 异方差(导致结果、检验——White、补救措施——广义线性回归)
  4. 自相关(导致结果、检验——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.apiols模块进行验证,两行代码就可以解决刚才编写的所有问题:

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检验)相关推荐

  1. 用Python底层编写进行计量经济分析(四):自相关(原因、结果、检验:DW检验、补救:广义线性回归)

    系列前面的文章: 多元线性回归和显著性检验(参数估计.T检验.F检验.拟合优度) 多重共线性(导致结果.检验--方差膨胀因子.补救措施--岭回归) 异方差(导致结果.检验--White.补救措施--广 ...

  2. Python金融系列第五篇:多元线性回归和残差分析

    作者:chen_h 微信号 & QQ:862251340 微信公众号:coderpai 第一篇:计算股票回报率,均值和方差 第二篇:简单线性回归 第三篇:随机变量和分布 第四篇:置信区间和假设 ...

  3. Python机器学习:线型回归法007多元线性回归和正规方程的解

  4. python数据分析 - T检验与F检验:二组数据那个更好?(一)

    T检验,F检验 1.导语 2.假设检验 2.1 原假设与备择假设 2.2 接受域与拒绝域 2.3 两类错误 3.单样本的假设检验 3.1 选择零假设和对立假设 3.2 选择显著水平α 3.3 决定检验 ...

  5. python数据分析----卡方检验,T检验,F检验,K-S检验

    卡方检验 卡方检验是一种用途很广的计数资料的假设检验方法.它属于非参数检验的范畴,主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析.其根本思想就是在于比较理论频数和实际频数的吻合 ...

  6. 计量经济分析:计量经济学中的三大检验(LR, Wald, LM)

    前面用Python底层编写进行计量经济分析(一):多元线性回归(参数估计.T检验.拟合优度.F检验)写过在多元线性回归时的参数检验方法t检验和方程整体的F检验.在分析中和实际情况中,我们可能会假定因素 ...

  7. Python 实战多元线性回归模型,附带原理+代码

    作者 | 萝卜 来源 | 早起Python( ID:zaoqi-python ) 「多元线性回归模型」非常常见,是大多数人入门机器学习的第一个案例,尽管如此,里面还是有许多值得学习和注意的地方.其中多 ...

  8. python f检验 模型拟合度_多元线性回归模型检验和预测

    一.概述 (F检验)显著性检验:检测自变量是否真正影响到因变量的波动. (t检验)回归系数检验:单个自变量在模型中是否有效. 二.回归模型检验 检验回归模型的好坏常用的是F检验和t检验.F检验验证的是 ...

  9. 推断统计python化(参数估计,假设检验与 t检验)

    目录 1.参数估计 1.1 点估计 1.2 区间估计 1.2.1 区间估计概述 1.2.2 区间估计的方法 1.3 进行区间估计的Python函数 2. 案例分析 3. 假设检验 3.1 假设检验概述 ...

最新文章

  1. Q767 重构字符串
  2. AI:2020年6月北京智源大会演讲视频回放集合——分享博主体会与总结
  3. bundlefusion论文阅读笔记
  4. 项目学生:使用AOP简化代码
  5. leetcode1085. 最小元素各数位之和 py不止是字符串的神!
  6. 坦克游戏服务器未响应,《坦克世界》退出战斗 退出战斗卡死解决办法
  7. hdu 1398 Square Coins/hdu 1028 Ignatius and the Princess III
  8. MHA+keepalived实现Mysql高可用及读写分离
  9. 【Python笔记】pygame 游戏框架
  10. Julia: [1 +j] ==[1 + j] ?
  11. Kettle连接mysql数据库所需驱动包,出现报错情况(附驱动下载方法)
  12. 红linux系统,红帽子linux系统
  13. 7-5 统计素数并求和
  14. WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
  15. cad小插件文字刷_CAD实用小插件,这是一串让你效率提升相见恨晚的代码!
  16. 努力就有结果,我是如何30岁转行学习软件测试拿到13k的?
  17. 40个非常有创意的网页设计作品欣赏
  18. idea从零到精通目录导航
  19. 如何使用cygwin在windows下Linux编程
  20. validate.js 插件表单校验

热门文章

  1. 《深入理解 Java 虚拟机》转载周志明
  2. 计算机能力挑战2021,2021WER能力挑战赛——“人工智能”竞赛规则.docx
  3. 如何用hadoop自带的包计算pi值
  4. 使用Linux挂载NAS硬盘的RAID分区
  5. MATLAB画曲线图
  6. u-boot中的usb命令
  7. matlab 计算连杆长度,matlab机器人运动学计算
  8. STM32-RCC的功能和使用
  9. PID 控制保姆级培训教程下-全国大学生电子设计大赛赛前必备
  10. Linux|操作系统