线性回归中的假设检验

article/2025/6/17 10:50:19

线性回归中的假设检验及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=axi+b+ϵi,i=1,2,n,其中 ϵ i ∼ N ( 0 , σ 2 ) \epsilon^i \sim N(0, \sigma^2) ϵiN(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=1n(yi(axi+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} aJbJ=i=1n2(yi(axi+b))xi=0=i=1n2(yi(axi+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(xixˉ)2i=1n(xixˉ)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=1nxi=i=1nyi

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=1n(yiyˉ)2=i=1n(yi^yˉ)2=i=1n(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 n1 的卡方分布,这一点在一般的概率统计中都会有介绍,不再赘述。而对于 S S E / σ 2 SSE/\sigma^2 SSE/σ2的自由度为 n − 2 n-2 n2的证明比较复杂,可以根据经验,如果模型中需要估计p个参数,那么 S S E / σ 2 SSE/\sigma^2 SSE/σ2的自由度就为 n − p n-p np,这里因为要估计a和b两个参数,因而自由度为n-2。因为 S S R = S S T − S S E SSR = SST-SSE SSR=SSTSSE,从而 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/(n2)SSR/1F(1,n2)
构成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(xixˉ)2i=1n(xixˉ)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(xixˉ)2i=1n(xixˉ)E(yi)=i=1n(xixˉ)2i=1n(xixˉ)E(axi+b+ϵi)=i=1n(xixˉ)2i=1n(xixˉ)(axi+b)=i=1n(xixˉ)2i=1na(xixˉ)(xixˉ)=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μ=[x1xˉ,x2barx,,xnxˉ],则:
a ^ = x μ T y / x μ T x μ \hat{a} = x_\mu ^Ty/x_\mu^Tx_\mu a^=xμTy/xμTxμ
则估计参数的方差为:
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μTy/xμTxμ,xμTy/xμTxμ)=Cov(xμTy,xμTy)/(xμTxμ)2=xμTCov(y,y)xμ/(xμTxμ)2=xμTσ2Inxμ/(xμTxμ)2=σ2/(xμTxμ)
因而, a ^ ∼ N ( a , σ 2 / ( x μ T x μ ) ) \hat{a} \sim N(a, \sigma^2/(x_\mu^Tx_\mu) ) a^N(a,σ2/(xμTxμ)) 。又根 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μTxμ a^a/(SSE/σ2/(n2)) t(n2)
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)

关于多元线性回归

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


http://chatgpt.dhexx.cn/article/eACSQK0A.shtml

相关文章

概率论:假设检验

http://blog.csdn.net/pipisorry/article/details/51182843 假设检验 假设检验问题分为两类,一类是参数的假设检验,一类是分布的假设检验! 设总体X的分布未知,或 X的某个分布参数 theta未知,对总体分布或分布参数 theta 提出一个假设 "H0" ,然后根据样本所提供的信息…

假设检验之几种检验方法的比较

之前学习概率论与数理统计的时候就不扎实,导致后来面试官在问我什么时候该用什么检验的时候稀里糊涂,最近工作中又遇到了假设检验的问题,所以就想把假设检验这块好好总结一下。 一.什么是假设检验? 假设检验是用来判断样本与样本…

相关系数及假设检验

一.假设检验 1.假设检验步骤 (1)提出假设:原假设和备择假设 (2)在原假设成立的条件下,构造一个检验统计量,该统计量有一个分布 (3)在给定置信水平下,求出…

假设检验流程

假设检验相关知识 原假设 原假也称为零假设,一般用H0表示。原假设一般是统计者想要拒绝的假设。 备选假设 备选假设用H1表示。备则假设是统计者想要接受的假设,而且备选假设和原假设一般为互斥假设。 例子:H0: H1: 显著…

概论_第8章_假设检验的基本步骤__假设检验的类型

一. 假设检验的基本步骤 如下: 第1步 根据实际问题提出原假设 及备择假设 , 要求 与 有且仅有一个为真; 第2步 选取适当的检验统计量, 并在原假设 成立的条件下确定该检验统计量的分布; 第3步 按问题的具体要求, 选取…

统计学知识梳理(三)假设检验

1、假设检验的步骤: 第1步:确定零假设和备选假设 零假设( H 0 H_{0} H0​): 备选假设( H 1 H_{1} H1​): 第2步:证据是什么?(计算p值) 在零假设成立的前提下&…

re2-2020-11-01(Google regrex)库编译

google的正规表达式库,也应该是非常好用的。 PCRE尽量用静态库的。 看一下测试例子: 。。。 通过。 多谢,亲爱的美美。

Windows 下正则表达式库 re2 在 C++ 和 Python 中的编译和使用

相信平时在工作或学习中需要处理大量正则表达式的同志们对 google 大名鼎鼎的 re2 模块一定不陌生,但之前在网上进行搜索时,很多人说无法在 windows 系统使用该模块。本文简述了 windows 系统下 re2 模块在 C++ 和 Python 中的使用。现以 64bit 为例,将其编译过程介绍如下,…

[SWPUCTF 2021 新生赛]re2

题目链接:下载链接 查壳后发现无壳,用IDA打开,按f5看伪代码。 首先给了str2字符串数组,然后‘printf(&Format)‘,点击Format可以知道是让你输入flag,所以str即flag。v7为str长度,for循环对str进行遍历…

攻防世界逆向高手题之re2-cpp-is-awesome

攻防世界逆向高手题之re2-cpp-is-awesome 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的re2-cpp-is-awesome 下载附件,照例扔入exeinfope中查看信息: 64位ELF文件,无壳,运行一下查看主要显示字符串: …

ISCC之Re2

硬核rust逆向 首先去学了一天rust。。。我TMD IDA打开,跟踪主函数 看一下伪代码,发现有一串密文 跟进去发现一串数据,猜测有可能是flag的加密数据,于是回头去分析算法 发现一个关键点 if ( v16 v24 ) break; v2 ((*(_DWORD *)(v…

xctf攻防世界 REVERSE 高手进阶区 re2-cpp-is-awesome

0x01. 进入环境,下载附件 题目给出的是一个无后缀文件,我们将其下载。先看看是否有套壳,发现没有套壳。那么接下来就老套路了 0x02. 问题分析 我们使用IDA Pro打开文件,找到main函数,反编译文件,得到代码…

【比赛writeup】2023省赛-Reverse-Re2

2023省赛-Reverse-Re2 一、概要 1、标题:Re2 2、关键字:换表BASE64 3、比赛:2023省赛 4、工具:IDAx64、python 二、开始 1、题目分析 逆向的题目,找到关键字符串,找到关键函数,分析函数逻辑…

RE2:Simple and Effective Text Matching with Richer Alignment Features

原文链接:https://aclanthology.org/P19-1465.pdf 2019 ACL 介绍 问题 作者认为之前文本匹配模型中序列对齐部分,过于复杂。只有单个inter-sequence alignment层的模型,常会引入外部信息(例如语法特征)作为额外输入&am…

【NLP】文本匹配——Simple and Effective Text Matching with Richer Alignment Features阅读与总结(RE2)

背景 前文已经介绍了【NLP】文本匹配——Enhanced LSTM for Natural Language Inference,其实2017年发表的,文中使用了两个LSTM进行特征提取,总的来说参数多,速度慢,还不能并行处理。今天我们再来看看阿里巴巴和南京大…

Re2:读论文 CS-GNN Measuring and Improving the Use of Graph Information in Graph Neural Networks

诸神缄默不语-个人CSDN博文目录 论文下载地址:https://openreview.net/attachment?idrkeIIkHKvS&nameoriginal_pdf 代码:yifan-h/CS-GNN: Measuring and Improving the Use of Graph Information in Graph Neural Networks 论文引用方式&#xf…

ctfshow re2

打开附件如下 勒索病毒我去上网查了一下,发现是通过加密数据,所以这个题可能和加密有关,除了勒索病毒还有一个enflag.txt打开如下 先不管这个 第一步查壳这个exe程序 无壳。 第二步用ida32位打开这个 shiftf12查看字符 有个充值成功&#xf…

CTFShow re2 (RC4

参考:CTFSHOW re2 本文:跟着大佬的博客一步一步做CTFShow re2的记录 IDA分析 有个比较函数 re一下 s "DH~mqqvqxB^||zllJq~jkwpmvez{" s1 for i in s:s1 chr(ord(i) ^ 0x1f) print(s1)得到 再四处看看 跟进sub_401028 四个sub点进去看看…

2023年天津市逆向re2.exe解析-比较难(超详细)

2023年天津市逆向re2.exe解析(较难) 1.拖进IDA里进行分析2.动态调试3.编写EXP脚本获取FLAG4.获得FLAG1.拖进IDA里进行分析 进入主程序查看伪代码 发现一个循环,根据行为初步判定为遍历输入的字符并对其ascii^7进行加密 初步判断sub_1400ab4ec为比较输入和flag的函数 跟进u…

RE2..

RE2 Simple and Effective Text Matching with Richer Alignment Features Simple and Effective Text Matching with Richer Alignment Features 论文提出了一种快速且高效的文本匹配模型,建议保留三个可用于序列间对齐的关键特征:原始点对齐特征、先前…