利用python实现逐步回归


Posted in Python onFebruary 24, 2020

逐步回归的基本思想是将变量逐个引入模型,每引入一个解释变量后都要进行F检验,并对已经选入的解释变量逐个进行t检验,当原来引入的解释变量由于后面解释变量的引入变得不再显著时,则将其删除。以确保每次引入新的变量之前回归方程中只包含显著性变量。这是一个反复的过程,直到既没有显著的解释变量选入回归方程,也没有不显著的解释变量从回归方程中剔除为止。以保证最后所得到的解释变量集是最优的。

本例的逐步回归则有所变化,没有对已经引入的变量进行t检验,只判断变量是否引入和变量是否剔除,“双重检验”逐步回归,简称逐步回归。例子的链接:(原链接已经失效),4项自变量,1项因变量。下文不再进行数学推理,进对计算过程进行说明,对数学理论不明白的可以参考《现代中长期水文预报方法及其应用》汤成友,官学文,张世明著;论文《逐步回归模型在大坝预测中的应用》王晓蕾等;

逐步回归的计算步骤:

1.计算第零步增广矩阵。第零步增广矩阵是由预测因子和预测对象两两之间的相关系数构成的。

2.引进因子。在增广矩阵的基础上,计算每个因子的方差贡献,挑选出没有进入方程的因子中方差贡献最大者对应的因子,计算该因子的方差比,查F分布表确定该因子是否引入方程。

3.剔除因子。计算此时方程中已经引入的因子的方差贡献,挑选出方差贡献最小的因子,计算该因子的方差比,查F分布表确定该因子是否从方程中剔除。

4.矩阵变换。将第零步矩阵按照引入方程的因子序号进行矩阵变换,变换后的矩阵再次进行引进因子和剔除因子的步骤,直到无因子可以引进,也无因子可以剔除为止,终止逐步回归分析计算。

a.以下代码实现了数据的读取,相关系数的计算子程序和生成第零步增广矩阵的子程序。

注意:pandas库读取csv的数据结构为DataFrame结构,此处转化为numpy中的(n-dimension array,ndarray)数组进行计算

import numpy as np
import pandas as pd
#数据读取
#利用pandas读取csv,读取的数据为DataFrame对象
data = pd.read_csv('sn.csv')
# 将DataFrame对象转化为数组,数组的最后一列为预报对象
data= data.values.copy()
# print(data)
 
# 计算回归系数,参数
def get_regre_coef(X,Y):
  S_xy=0
  S_xx=0
  S_yy=0
  # 计算预报因子和预报对象的均值
  X_mean = np.mean(X)
  Y_mean = np.mean(Y)
  for i in range(len(X)):
    S_xy += (X[i] - X_mean) * (Y[i] - Y_mean)
    S_xx += pow(X[i] - X_mean, 2)
    S_yy += pow(Y[i] - Y_mean, 2)
  return S_xy/pow(S_xx*S_yy,0.5)
#构建原始增广矩阵
def get_original_matrix():
  # 创建一个数组存储相关系数,data.shape几行(维)几列,结果用一个tuple表示
  # print(data.shape[1])
  col=data.shape[1]
  # print(col)
  r=np.ones((col,col))#np.ones参数为一个元组(tuple)
  # print(np.ones((col,col)))
  # for row in data.T:#运用数组的迭代,只能迭代行,迭代转置后的数组,结果再进行转置就相当于迭代了每一列
    # print(row.T)
  for i in range(col):
    for j in range(col):
      r[i,j]=get_regre_coef(data[:,i],data[:,j])
  return r

b.第二部分主要是计算公差贡献和方差比。

def get_vari_contri(r):
  col = data.shape[1]
   #创建一个矩阵来存储方差贡献值
  v=np.ones((1,col-1))
  # print(v)
  for i in range(col-1):
    # v[0,i]=pow(r[i,col-1],2)/r[i,i]
    v[0, i] = pow(r[i, col - 1], 2) / r[i, i]
  return v
#选择因子是否进入方程,
#参数说明:r为增广矩阵,v为方差贡献值,k为方差贡献值最大的因子下标,p为当前进入方程的因子数
def select_factor(r,v,k,p):
  row=data.shape[0]#样本容量
  col=data.shape[1]-1#预报因子数
  #计算方差比
  f=(row-p-2)*v[0,k-1]/(r[col,col]-v[0,k-1])
  # print(calc_vari_contri(r))
  return f

c.第三部分调用定义的函数计算方差贡献值

#计算第零步增广矩阵
r=get_original_matrix()
# print(r)
#计算方差贡献值
v=get_vari_contri(r)
print(v)
#计算方差比

计算结果: 利用python实现逐步回归

此处没有编写判断方差贡献最大的子程序,因为在其他计算中我还需要变量的具体物理含义所以不能单纯的由计算决定对变量的取舍,此处看出第四个变量的方查贡献最大

# #计算方差比
# print(data.shape[0])
f=select_factor(r,v,4,0)
print(f)
#######输出##########
22.79852020138227

计算第四个预测因子的方差比(粘贴在了代码中),并查F分布表3.280进行比对,22.8>3.28,引入第四个预报因子。(前三次不进行剔除椅子的计算)

d.第四部分进行矩阵的变换。

#逐步回归分析与计算
#通过矩阵转换公式来计算各部分增广矩阵的元素值
def convert_matrix(r,k):
  col=data.shape[1]
  k=k-1#从第零行开始计数
  #第k行的元素单不属于k列的元素
  r1 = np.ones((col, col)) # np.ones参数为一个元组(tuple)
  for i in range(col):
    for j in range(col):
      if (i==k and j!=k):
        r1[i,j]=r[k,j]/r[k,k]
      elif (i!=k and j!=k):
        r1[i,j]=r[i,j]-r[i,k]*r[k,j]/r[k,k]
      elif (i!= k and j== k):
        r1[i,j] = -r[i,k]/r[k,k]
      else:
        r1[i,j] = 1/r[k,k]
  return r1

e.进行完矩阵变换就循环上面步骤进行因子的引入和剔除

再次计算各因子的方差贡献 利用python实现逐步回归

前三个未引入方程的方差因子进行排序,得到第一个因子的方差贡献最大,计算第一个预报因子的F检验值,大于临界值引入第一个预报因子进入方程。

#矩阵转换,计算第一步矩阵
r=convert_matrix(r,4)
# print(r)
#计算第一步方差贡献值
v=get_vari_contri(r)
#print(v)
f=select_factor(r,v,1,1)
print(f)
#########输出#####
108.22390933074443

进行矩阵变换,计算方差贡献 利用python实现逐步回归

可以看出还没有引入方程的因子2和3,方差贡献较大的是因子2,计算因子2的f检验值5.026>3.28,故引入预报因子2

f=select_factor(r,v,2,2)
print(f)
##########输出#########
5.025864648951804

继续进行矩阵转换,计算方差贡献 利用python实现逐步回归

这一步需要考虑剔除因子了,有方差贡献可以知道,已引入方程的因子中方差贡献最小的是因子4,分别计算因子3的引进f检验值0.0183

和因子4的剔除f检验值1.863,均小于3.28(查F分布表)因子3不能引入,因子4需要剔除,此时方程中引入的因子数为2

#选择是否剔除因子,
#参数说明:r为增广矩阵,v为方差贡献值,k为方差贡献值最大的因子下标,t为当前进入方程的因子数
def delete_factor(r,v,k,t):
  row = data.shape[0] # 样本容量
  col = data.shape[1] - 1 # 预报因子数
  # 计算方差比
  f = (row - t - 1) * v[0, k - 1] / r[col, col]
  # print(calc_vari_contri(r))
  return f
#因子3的引进检验值0.018233473487350636
f=select_factor(r,v,3,3)
print(f)
#因子4的剔除检验值1.863262422188088
f=delete_factor(r,v,4,3)
print(f)

在此对矩阵进行变换,计算方差贡献利用python实现逐步回归 ,已引入因子(因子1和2)方差贡献最小的是因子1,为引入因子方差贡献最大的是因子4,计算这两者的引进f检验值和剔除f检验值

#因子4的引进检验值1.8632624221880876,小于3.28不能引进
f=select_factor(r,v,4,2)
print(f)
#因子1的剔除检验值146.52265486251397,大于3.28不能剔除
f=delete_factor(r,v,1,2)
print(f)

不能剔除也不能引进变量,此时停止逐步回归的计算。引进方程的因子为预报因子1和预报因子2,借助上一篇博客写的多元回归。对进入方程的预报因子和预报对象进行多元回归。输出多元回归的预测结果,一次为常数项,第一个因子的预测系数,第二个因子的预测系数。

#因子1和因子2进入方程
#对进入方程的预报因子进行多元回归
# regs=LinearRegression()
X=data[:,0:2]
Y=data[:,4]
X=np.mat(np.c_[np.ones(X.shape[0]),X])#为系数矩阵增加常数项系数
Y=np.mat(Y)#数组转化为矩阵
#print(X)
B=np.linalg.inv(X.T*X)*(X.T)*(Y.T)
print(B.T)#输出系数,第一项为常数项,其他为回归系数
###输出##
#[[52.57734888 1.46830574 0.66225049]]

以上这篇利用python实现逐步回归就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
python实现给微信指定好友定时发送消息
Apr 29 Python
Python之pymysql的使用小结
Jul 01 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
Python3 pandas 操作列表实例详解
Sep 23 Python
python flask中动态URL规则详解
Nov 22 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
python统计字符的个数代码实例
Feb 07 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
python中如何使用虚拟环境
Oct 14 Python
python数据分析:关键字提取方式
Feb 24 #Python
python数据预处理 :数据共线性处理详解
Feb 24 #Python
使用python实现多维数据降维操作
Feb 24 #Python
python数据预处理 :数据抽样解析
Feb 24 #Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 #Python
Python流程控制常用工具详解
Feb 24 #Python
深入浅析Python 函数注解与匿名函数
Feb 24 #Python
You might like
PHPShop存在多个安全漏洞
2006/10/09 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
PHP使用函数用法详解
2018/09/30 PHP
JS实现随机数生成算法示例代码
2013/08/08 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
介绍一下EJB的体系结构
2012/08/01 面试题
大学生蛋糕店创业计划书
2014/01/13 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
工作求职信
2014/07/04 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
保研专家推荐信范文
2015/03/25 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
导游词之铁岭象牙山
2019/12/06 职场文书
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL