线性回归中的假设检验及Python编程

  • 0 引言
  • 1 一元线性回归模型
  • 2 对于回归方程的检验
    • F检验
    • T检验
  • 一元线性回归的Python编程实现
  • 与 `statsmodels` 包的对比
  • 关于多元线性回归

0 引言

本文介绍一元线性回归的基本假设,推导方法和统计检验,然后介绍Python编程实现,最后结合Pythonstatsmodels包对比计算结果。

1 一元线性回归模型

对于n个自变量, ( x 1 , x 2 , x 3 , … , x n ) (x^1, x^2, x^3, \dots , x^n) (x1,x2,x3,…,xn),因变量 y i = a ∗ x i + b + ϵ i , i = 1 , 2 , … n y^i =a * x^i + b + \epsilon^i, i=1,2,\dots n yi=a∗xi+b+ϵi,i=1,2,…n,其中 ϵ i ∼ N ( 0 , σ 2 ) \epsilon^i \sim N(0, \sigma^2) ϵi∼N(0,σ2)是服从正态分布的随机变量,且彼此独立。一元线性回归的目标就是对模型参数a和b进行估计。这里需要注意 x i x^i xi不是随机变量。

利用最小二乘法对模型进行求解,首先定义代价函数:
J = ∑ i = 1 n ( y i − ( a ∗ x i + b ) ) 2 J = \sum_{i=1}^{n} (y^i - (a*x^i+b))^2 J=i=1∑n​(yi−(a∗xi+b))2
将代价函数分别对a和b进行求导,并令导数为0,得到:
∂ J ∂ a = − ∑ i = 1 n 2 ∗ ( y i − ( a ∗ x i + b ) ) ∗ x i = 0 ∂ J ∂ b = − ∑ i = 1 n 2 ∗ ( y i − ( a ∗ x i + b ) ) = 0 \begin{aligned} \frac{\partial J}{\partial a} &= -\sum_{i=1}^{n}2*(y^i - (a*x^i+b))*x^i =0\\ \frac{\partial J}{\partial b} &= -\sum_{i=1}^{n}2*(y^i - (a*x^i+b)) =0 \end{aligned} ∂a∂J​∂b∂J​​=−i=1∑n​2∗(yi−(a∗xi+b))∗xi=0=−i=1∑n​2∗(yi−(a∗xi+b))=0​
求解得到最小而成解
a ^ = ∑ i = 1 n ( x i − x ˉ ) ∗ y i ∑ i = 1 n ( x i − x ˉ ) 2 b ^ = y ˉ − a ^ ∗ x ˉ \begin{aligned} \hat{a} &= \frac{\sum_{i=1}^{n} (x^i - \bar{x})*y^i}{\sum_{i=1}^{n} (x^i - \bar{x})^2} \\ \hat{b} &= \bar{y} - \hat{a}*\bar{x} \end{aligned} a^b^​=∑i=1n​(xi−xˉ)2∑i=1n​(xi−xˉ)∗yi​=yˉ​−a^∗xˉ​
其中,
x ˉ = ∑ i = 1 n x i y ˉ = ∑ i = 1 n y i \begin{aligned} \bar{x} &= {\sum_{i=1}^{n} x^i } \\ \bar{y} &= {\sum_{i=1}^{n} y^i } \end{aligned} xˉyˉ​​=i=1∑n​xi=i=1∑n​yi​

2 对于回归方程的检验

在一元线性回归中(多元也一样),假设检验主要分为两类,F检验和T检验,这里分别进行介绍。

F检验

构建下面的统计量:
S S T = ∑ i = 1 n ( y i − y ˉ ) 2 S S R = ∑ i = 1 n ( y i ^ − y ˉ ) 2 S S E = ∑ i = 1 n ( y i ^ − y i ) 2 \begin{aligned} SST &= \sum_{i=1}^{n} (y^i - \bar{y})^2 \\ SSR &= \sum_{i=1}^{n} (\hat{y^i} - \bar{y})^2 \\ SSE & = \sum_{i=1}^{n} (\hat{y^i} - y^i)^2 \end{aligned} SSTSSRSSE​=i=1∑n​(yi−yˉ​)2=i=1∑n​(yi^​−yˉ​)2=i=1∑n​(yi^​−yi)2​

其中 y i ^ = a ^ ∗ x i + b ^ \hat{y^i} = \hat{a}*x^i + \hat{b} yi^​=a^∗xi+b^,为模型的估计值。易证 S S T = S S R + S S E SST=SSR+SSE SST=SSR+SSE(证明过程比较繁琐,但是思路比较简单,这里不再赘述)。对于空假设:
H 0 : a = 0 H 1 : a ≠ 0 H_0: a=0 \\ H_1: a \neq 0 H0​:a=0H1​:a​=0
在空假设 H 0 H_0 H0​成立的情况下, S S T / σ 2 SST/\sigma^2 SST/σ2服从自由度为 n − 1 n-1 n−1 的卡方分布,这一点在一般的概率统计中都会有介绍,不再赘述。而对于 S S E / σ 2 SSE/\sigma^2 SSE/σ2的自由度为 n − 2 n-2 n−2的证明比较复杂,可以根据经验,如果模型中需要估计p个参数,那么 S S E / σ 2 SSE/\sigma^2 SSE/σ2的自由度就为 n − p n-p n−p,这里因为要估计a和b两个参数,因而自由度为n-2。因为 S S R = S S T − S S E SSR = SST-SSE SSR=SST−SSE,从而 S S R SSR SSR服从自由度为 1 1 1的卡方分布。且SSR和SSE相互独立,从而有
F = S S R / 1 S S E / ( n − 2 ) ∼ F ( 1 , n − 2 ) F= \frac{SSR/1}{SSE/(n-2)} \sim F(1, n-2) F=SSE/(n−2)SSR/1​∼F(1,n−2)
构成F统计量。在空假设成立的情况下,估计误差SSE为比较大,因而统计量F会比较小。当F取得较大值 F > F 1 − α F>F_{1-\alpha} F>F1−α​是,拒绝原假设。

T检验

T检验是直接对回归系数的检验。已知
a ^ = ∑ i = 1 n ( x i − x ˉ ) ∗ y i ∑ i = 1 n ( x i − x ˉ ) 2 \hat{a} = \frac{\sum_{i=1}^{n} (x^i - \bar{x})*y^i}{\sum_{i=1}^{n} (x^i - \bar{x})^2} a^=∑i=1n​(xi−xˉ)2∑i=1n​(xi−xˉ)∗yi​
a ^ \hat{a} a^是 y = [ y 1 , y 2 , … , y i ] T y=[y^1, y^2, \dots, y^i]^T y=[y1,y2,…,yi]T的线性组合,因而 a ^ \hat{a} a^也服从高斯分布。又因为:
E ( a ^ ) = ∑ i = 1 n ( x i − x ˉ ) ∗ E ( y i ) ∑ i = 1 n ( x i − x ˉ ) 2 = ∑ i = 1 n ( x i − x ˉ ) ∗ E ( a ∗ x i + b + ϵ i ) ∑ i = 1 n ( x i − x ˉ ) 2 = ∑ i = 1 n ( x i − x ˉ ) ∗ ( a ∗ x i + b ) ∑ i = 1 n ( x i − x ˉ ) 2 = ∑ i = 1 n a ( x i − x ˉ ) ∗ ( x i − x ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 = a \begin{aligned} E(\hat{a}) &= \frac{\sum_{i=1}^{n} (x^i - \bar{x})*E(y^i)}{\sum_{i=1}^{n} (x^i - \bar{x})^2} \\ &=\frac{\sum_{i=1}^{n} (x^i - \bar{x})*E(a*x^i+b+\epsilon^i)}{\sum_{i=1}^{n} (x^i - \bar{x})^2} \\ &=\frac{\sum_{i=1}^{n} (x^i - \bar{x})*(a*x^i+b)}{\sum_{i=1}^{n} (x^i - \bar{x})^2} \\ &=\frac{\sum_{i=1}^{n} a(x^i - \bar{x})*(x^i-\bar{x})} {\sum_{i=1}^{n} (x^i - \bar{x})^2} \\ &=a \\ \end{aligned} E(a^)​=∑i=1n​(xi−xˉ)2∑i=1n​(xi−xˉ)∗E(yi)​=∑i=1n​(xi−xˉ)2∑i=1n​(xi−xˉ)∗E(a∗xi+b+ϵi)​=∑i=1n​(xi−xˉ)2∑i=1n​(xi−xˉ)∗(a∗xi+b)​=∑i=1n​(xi−xˉ)2∑i=1n​a(xi−xˉ)∗(xi−xˉ)​=a​
为了计算方差,我们将上述表达式定义为向量形式,首先定义向量 x μ = [ x 1 − x ˉ , x 2 − b a r x , … , x n − x ˉ ] x_{\mu} = [x^1-\bar{x}, x^2-bar{x}, \dots, x^n - \bar{x}] xμ​=[x1−xˉ,x2−barx,…,xn−xˉ],则:
a ^ = x μ T y / x μ T x μ \hat{a} = x_\mu ^Ty/x_\mu^Tx_\mu a^=xμT​y/xμT​xμ​
则估计参数的方差为:
V a r ( a ^ ) = C o v ( x μ T y / x μ T x μ , x μ T y / x μ T x μ ) = C o v ( x μ T y , x μ T y ) / ( x μ T x μ ) 2 = x μ T C o v ( y , y ) x μ / ( x μ T x μ ) 2 = x μ T σ 2 I n x μ / ( x μ T x μ ) 2 = σ 2 / ( x μ T x μ ) \begin{aligned} Var(\hat{a}) &= Cov(x_\mu ^Ty/x_\mu^Tx_\mu, x_\mu ^Ty/x_\mu^Tx_\mu) \\ &= Cov(x_\mu ^Ty, x_\mu ^Ty)/(x_\mu^Tx_\mu)^2\\ &= x_\mu^TCov(y, y)x_\mu / (x_\mu^Tx_\mu)^2\\ &= x_\mu^T\sigma^2I_nx_\mu / (x_\mu^Tx_\mu)^2\\ &=\sigma^2/(x_\mu^Tx_\mu) \\ \end{aligned} Var(a^)​=Cov(xμT​y/xμT​xμ​,xμT​y/xμT​xμ​)=Cov(xμT​y,xμT​y)/(xμT​xμ​)2=xμT​Cov(y,y)xμ​/(xμT​xμ​)2=xμT​σ2In​xμ​/(xμT​xμ​)2=σ2/(xμT​xμ​)​
因而, a ^ ∼ N ( a , σ 2 / ( x μ T x μ ) ) \hat{a} \sim N(a, \sigma^2/(x_\mu^Tx_\mu) ) a^∼N(a,σ2/(xμT​xμ​)) 。又根 S S E / σ 2 SSE/\sigma^2 SSE/σ2服从自由度n-2的卡方分布,且这两个变量相互独立(这里没给出证明),可以得到统计量T:
T = a ^ − a σ / x μ T x μ / ( S S E / σ 2 / ( n − 2 ) ) ∼ t ( n − 2 ) \begin{aligned} T &= \frac{\hat{a}-a}{\sigma/\sqrt{x_\mu^Tx_\mu}} / \sqrt{ (SSE/\sigma^2/(n-2))} \\ &\sim t(n-2) \end{aligned} T​=σ/xμT​xμ​ ​a^−a​/(SSE/σ2/(n−2)) ​∼t(n−2)​
H 0 : a = 0 H 1 : a ≠ 0 H_0: a=0 \\ H_1: a \neq 0 H0​:a=0H1​:a​=0
在空假设 H 0 H_0 H0​成立时,T应该接近于0。在 ∣ a ^ ∣ > t 1 − α / 2 |\hat{a}|>t_{1-\alpha/2} ∣a^∣>t1−α/2​时拒绝原假设。

一元线性回归的Python编程实现

import numpy as np
import matplotlib.pyplot as plt
from scipy import statsdef linear_ols(x, y):'''实现一元线性回归返回参数: a, b, F检验统计量及p值, T检验统计量及p值'''mu = np.mean(x)xmu = x - mua = xmu.dot(y)/xmu.dot(xmu)b = np.mean(y) - a*np.mean(x)SST = np.sum((y-np.mean(y))**2)y_pred = a*x + bSSE = np.sum((y-y_pred)**2)SSR = SST - SSEN = len(x)F = SSR/1 / (SSE/(N-2)) #F统计量pF = 1-stats.f.cdf(F, dfn = 1, dfd = N-2)T =np.sqrt(xmu.dot(xmu)) * a/np.sqrt(SSE/(N-2)) #T统计量if(a>0):pT = 2*(1-stats.t.cdf(T, df = N-2))else:pT = 2*stats.t.cdf(T, df=N-2)return a, b, F, pF, T, pT

生成仿真数据,输出结果。

N = 300
x = np.linspace(-2, 2, N)
y = 3*x + 2*np.random.randn(N)plt.plot(x, y, 'o')
a, b, F, pF, T, pT = linear_ols(x, y)
y_pred = a*x + b
plt.plot(x, y_pred)
plt.xlabel('x')
plt.ylabel('y')print('a=%.3f, b=%.3f' %(a, b))
print('F statistics = %.2f, p=%.3f'%( F, pF))
print('T statistics =%.2f, p =%.3f'%( T, pT))

得到的结果如下:

a=3.003, b=-0.100
F statistics = 983.34, p=0.000
T statistics =31.36, p =0.000

由于生成随机数的原因,不同机器运行结果可能略有差异。

statsmodels 包的对比

statsmodels提供了线性回归的一般解法,我们将其输出的结果与自己编写的函数进行对比。

from statsmodels import api as sm
X = sm.add_constant(x)#添加常数项
model = sm.OLS(y,X)
result = model.fit()
print(result.summary())

程序输出结果为:

OLS Regression Results
==============================================================================
Dep. Variable:                      y   R-squared:                       0.767
Model:                            OLS   Adj. R-squared:                  0.767
Method:                 Least Squares   F-statistic:                     983.3
Date:                Sun, 18 Apr 2021   Prob (F-statistic):           2.18e-96
Time:                        20:39:24   Log-Likelihood:                -620.69
No. Observations:                 300   AIC:                             1245.
Df Residuals:                     298   BIC:                             1253.
Df Model:                           1
Covariance Type:            nonrobust
==============================================================================coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         -0.0999      0.111     -0.901      0.369      -0.318       0.118
x1             3.0035      0.096     31.358      0.000       2.815       3.192
==============================================================================
Omnibus:                        3.843   Durbin-Watson:                   1.807
Prob(Omnibus):                  0.146   Jarque-Bera (JB):                3.162
Skew:                          -0.147   Prob(JB):                        0.206
Kurtosis:                       2.592   Cond. No.                         1.16
==============================================================================Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

从上述结果中可以看出,const也就是我们估计结果中的b值,x1也就是我们估计结果中的a值,两者一致。F-statistics和t-statistics983.3和31.358,也和我们代码的运行结果一致。

关于statsmodels结果的解读,可以参考statsmodels中的summary解读(使用OLS)

关于多元线性回归

推导方法类似,原理类似,个人认为能够通过一元线性回归加深对问题的理解就足够了,多元线性回归在使用时直接使用工具包就行,参数的解读也是相似的。

线性回归中的假设检验相关推荐

  1. statsmodels线性回归中的Jarque-Bera指标检验残差是否服从正态分布

    数据准备:dataM 数据字段:y,x1,x2,x3 python中统计学的回归模型: import statsmodels.formula.api as smf formula='y~x1+x2+x ...

  2. 单变量线性回归中的梯度下降法求解代价函数的最小值

    1. 什么是代价函数 在线性回归中我们有一个像这样的训练集,m代表了训练样本的数量,比如 m = 47.而我们的假设函数, 也就是用来进行预测的函数,是这样的线性函数形式, 则代价函数可以表示为: 我 ...

  3. 线性回归中的前提假设

    在谈线性回归模型的时候被问到,在线性回归中,有三个假设,是哪三个? 当时回答出来自变量x和因变量y之间是线性变化关系,也就是说,如果x进行线性变化的话,y也会有相应的线性变化. 提到数据样本的时候也答 ...

  4. 多元线性回归中多重共线性_多重共线性如何在线性回归中成为问题。

    多元线性回归中多重共线性 Linear Regression is one of the simplest and most widely used algorithms for Supervised ...

  5. python 回归去掉共线性_线性回归中的多重共线性与岭回归

    上篇文章<简单而强大的线性回归详解>(点击跳转)详细介绍了线性回归分析方程.损失方程及求解.模型评估指标等内容,其中在推导多元线性回归使用最小二乘法的求解原理时,对损失函数求导得到参数向量 ...

  6. 一元线性回归中loss值的变化分析

    1 致谢 感谢陈助教的帮助和解答! 2 前言 线性回归是我们在机器学习算法中学习到的第一个回归算法,所以我们一定要学习并且掌握清楚,为后续的学习奠定良好的基础. 3 问题描述 这几天在做一元线性回归的 ...

  7. 多元线性模型分类变量方差_第三十一讲 R多元线性回归中的多重共线性和方差膨胀因子...

    在前两讲中,我们介绍了多元线性回归的概念以及多元线性回归中的交互作用.今天学习的主要内容是多元线性回归中的多重共线性和方差膨胀因子. 1. 共线性的概念 1 共线性 在多元回归中,两个或多个预测变量可 ...

  8. 多元线性回归中的公式推导

    这次接着一元线性回归继续介绍多元线性回归,同样还是参靠周志华老师的<机器学习>,把其中我一开始学习时花了较大精力弄通的推导环节详细叙述一下. 本文用到的部分关于向量求导的知识可以参看博文标 ...

  9. 线性回归中的L1与L2正则化

    在这篇文章中,我将介绍一个与回归相关的常见技术面试问题,我自己也经常会提到这个问题: 描述回归建模中的L1和L2正则化方法. 在处理复杂数据时,我们往往会创建复杂的模型.太复杂并不总是好的.过于复杂的 ...

最新文章

  1. 快手数据中台建设实践
  2. 费曼:所有的科学知识都是不确定的
  3. java编程笔记18 文件压缩与解压缩
  4. IUnknown接口QueryInterface函数介绍
  5. online游戏服务器架构--网络架构
  6. 打造Linux回收站
  7. 无人驾驶的规划与控制(一)——路由寻径
  8. 支持向量机的前世与今生
  9. Spring Framework 4.0相关计划公布---包括对于Java SE 8 和Groovy2的支持
  10. 中国剩余定理----51nod1079
  11. discuz 门户diy实现翻页功能的修改记录
  12. java map详解
  13. 光纤收发器A,B端含义解释
  14. 2022-08-04 Brighthouse: An Analytic DataWarehouse for Ad-hoc Queries
  15. 兰芝女王 的炒股心得-转载编辑
  16. 用python画路飞代码_80行代码!用Python做一个哆来A梦分身
  17. 云端创建MySQL数据库
  18. 雒怎么读「知识普及」
  19. 康泰克采样器完整版-Native Instruments Kontakt v6.3.1 WIN/MAC
  20. Arcgis操作系列16-使用Arc Map创建渔网(fishnet)

热门文章

  1. AWS - Amazon Simple Email(ASE) 邮件服务
  2. QComboBox 设置下拉列表颜色
  3. cups共享linux打印机_使用CUPS服务器共享打印机
  4. 给陌生的你听-G.G张思源
  5. 为什么苹果蓝牙耳机连上还是公放_高版本AirPods无线蓝牙耳机二代、三代开团啦!...
  6. 跑步适合戴哪种耳机不掉?专业跑步耳机推荐
  7. WiFi密码忘记?电脑密码忘记?
  8. 网络安全和黑客技能:15本必读书籍推荐
  9. iOS日常开发之常用单词、名词注释
  10. NOIP2022.11.23模拟赛