先序和中序确定二叉树算法
⽤Python 底层编写进⾏计量经济分析(⼀):多元线性回归(参数估计、T 检
验、拟合优度、F 检验)
之前上学时计量经济学的模型实现总是⽤Eviews等软件实现。但是对于点击⿏标得到结果的⽅式,总是让⾃⼰感觉没有参与模型建⽴的过程。所以准备利⽤python写代码从底层,进⾏编写进⾏计量经济分析,让⾃⼰更了解预算过程。暂时准备写以下⼏篇,后⾯再慢慢补充;1.
2.
3.
4.
写的⽐较仓促,代码中如有错误欢迎指正!
⼀、计量经济分析
个⼈理解计量经济学可以认为是统计学的⼀个应⽤或分⽀。我们知道在统计层⾯上,因素的关系⼤概可以分两种:因果关系和相关关系。现在⼗分流⾏的机器学习、深度学习中关注的事物间的相关关系(⽐
如⾝⾼和体重),事物间不⼀定需要是⼀个导致另⼀个关系,只要需要再⽣产环境相关关系是有效的就可以拿来⽤。
⽽计量经济分析则主要侧重的是因果关系,因为我们的主要⽬的是分析然后进⾏预测。既然是分析,我们就需要知道因素之间的具体关系,⼀个因素的变化是怎样导致另⼀个因素的变化。这也是计量与机器学习的最明显差异。
既然计量经济分析侧重的是因果关系,因此我们对模型的检验就会更加深⼊。具体的,⽐如在机器学习中,我们得到⼀个模型,模型再训练集、测试集、时间外样本集等AUC等指标均表现良好,并且线上可以稳定运⾏。我们就可以拿来使⽤。⽽在计量经济学中,我们需要对模型进⾏多种检验,确保模型中的参数意义明确和有效。
计量经济分析的⽅法步骤可以总结如下:1.模型设定(设定⼀个合理模型)——>2.参数估计(最⼩⼆乘等)——>3.模型检验(参数显著性、是否有多重共线、异⽅差,⾃相关和参数符号是否符合经济意义等)——>4.模型应⽤(利⽤模型进⾏因素间内在结构分析或预测)本系列只对原理和形式进⾏简单介绍,然后利⽤python进⾏实现。如果想要⼊门,可以看看国内本科的⼀些计量经济学教材。想要深⼊⼀些,可以看看伍德⾥奇的《计量经济学导论》。若想要深究,可以拜读格林的《计量经济分析》。
⼆、多元线性回归
2.1.多元线性回归形式
⼀个因素的变化通常是由多个因素共同决定的,⽐如经典的⽣产函数认为,产出是由资本和劳动⼒决定的。如果我们研究多个因素对另⼀个变量的作⽤,我们设置如下多元线性回归模型:
其矩阵形式为:
被称为应变量或被解释变量,是解释变量,扰动项,是前的参数,表⽰⼀单位变动引起的变动程度,如果和都是对数形式:和,则表⽰的经济学中弹性。
我们估计模型使⽤的最⼩⼆乘法,但是若保证估计是有效的,模型必须满⾜线性回归的六⼤假定(不细说了,每违反⼀种假定就会犯响应错误,就需要相应补救):
1.模型符合线性模式
2.X满秩(⽆多重共线)
3.零均值价值:(⾃变量外⽣)
4.同⽅差:
5.⽆⾃相关:
6.球形扰动:ε_i是正态分布
2.2.多元线性回归参数估计
Y =i β+0β∗1x +1i β∗2x +2i ...+β∗k x +ki εi
Y =β∗x +ε
Y x k εβk x k x k Y i x k Y i ln (x )k ln (Y )i βk E (ε∣X )=i i 0V ar (ε∣X )=i i σ
cov (ε,ε)=i j 0
参数估计使⽤最⼩⼆乘法,得到参数估计为:
(后⾯t检验会⽤到,可⽤残差估计得到)
2.3.多元线性回归检验
对于多元线性回归的检验,和统计的假设检验⼀样,就是构造符合⼏⼤分布的统计量(正态、T分布、
F分布、卡⽅分布)的统计量,然后进⾏假设检验,其中零假设为参数等于0(或⽅程不显著),我们的⽬标是拒绝零假设,这样参数才是有意义,才可以进⾏下⼀步的分析。
2.3.1.单个参数检验:
构造统计量:T=T符合,为样本量,为参数个数,查表可知参数是否显著等于0
2.3.2.整体检验:
1.拟合优度其中是回归平⽅和,是总平⽅和,,即总平⽅和=回归平⽅和+误差平⽅和。是⼀个0~1之间的数字,越⼤,代表⽅程拟合越好(实际上,随着变量增多,⼀定会增⼤,仅此还有加⼊了变量个数惩罚的调整拟合优度)。
2.F检验:因为并没有⾃由度的概念,因此我们⽆法查表得知多⼤算⼤,因此我们构造统计量,统计量服从,于是我们可以查表得到拒绝域,从⽽判断⽅程整体是否显著。
多说⼀句,F分布是两个卡⽅分布除以各⾃⾃由度的⽐构成的。F检验的思想⾮常常⽤,⽐如⽅差分析等都是利⽤F检验的思想,将⽅差分为不同的类别,查看不同类别的⽅差(例如组内,组间)是否存在不同。
三、多元线性回归的python 实现
我们使⽤python的sklearn中的房价数据集进⾏多元线性回归。
from  sklearn .datasets import  fetch_california_housing as  fch
data =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 -*-
"""
手机github没有下载的按钮
Created on Fri Apr  3 15:40:38 2020
@author: nbszg
"""
import  numpy as  np
import  pandas as  pd
import  scipy .stats as  st
class  mul_linear_model (object ):
#intercept 定义是否有截距项,在计量经济分析中,基本都要有截距项,否则计算出的拟合优度是没有意义的
def  __init__(self , y , X , intercept =True ):
E (β∣x )=(X X )X y
′−1′V ar (β∣x )=σ(X X )2′−1σ2s 2V ar (β∣x )
E (β∣x )
t (n −k )n k R =2SST SSR
SSR SST SST =SSR +SSE R 2R 2R 2F =1−R /(n −k )
2R /(k −1)
2R 2R 2F F F (k −1,n −k )
def__init__(self, y, X, intercept=True):
data_x = X.copy()
data_y = y.copy()
self.data_x = data_x
self.y = np.array(data_y)
self.intercept = intercept
if intercept ==False:
self.X = np.mat(data_x)
else:
#插⼊截距项
最好的python入门教材data_x.insert(0,'intercept',np.ones(len(data_x)))
#每个变量名称
#转换为矩阵,⽅便后⾯运算
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'y
self.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}".lumns[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
简述tcp ip的体系结构
#参数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.S
for 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)>ppf(alpha/2, df = self.N-self.K)):
print("T of variable {0} is: {1}, refuse H0".lumns[i], Tk))
else:
print("T of variable {0} is: {1}, can't refuse H0".lumns[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.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
#利⽤拟合优度公式计算拟合优度web网页认证
self.R_2 = self.SSR/self.SST
return 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 #最⼩⼆乘设置input的value值
from statsmodels.formula.api import ols #加载ols模型
lm=ols('value~ HouseAge + AveRooms + AveBedrms + Population',data=house_data).fit()
print(lm.summary())
检验结果如上图,其中红框的部分是我们的估计参数和检验结果,可以看到使⽤statsmodels包与我们从底层编写的计算结果是⼀致的。证明了我们代码的正确性。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。