Least Square¶
希望 Y 的预测值与测量值偏差越小越好 , 对于 n 个测量
$$ Q = \sum (Y_i - (b_0+b_1X_i))^2 $$
最小化 Q, 最小二乘法
将回归函数的表达式改写为
$$ Y = \beta_0 + \beta_1 (X-\bar{X}) $$
上式被称为模型的中心化
$$ Q = \sum [Y_i - (\beta_0+\beta_1(X_i-\bar{X}))]^2 $$
对 $\beta_0$ 和 $\beta_1$ 求偏导
$$ \frac{\partial Q}{\partial \beta_0} = -2 \sum [Y_i-\beta_0-\beta_1(X_i-\bar{X})] =0\\ \frac{\partial Q}{\partial \beta_1} = -2 \sum [Y_i-\beta_0-\beta_1(X_i-\bar{X})](X_i-\bar{X}) =0\\ $$
得到
$$ \hat{\beta_0} = \sum Y_i/n = \bar{Y}\\ \hat{\beta_1} = \frac{\sum (X_i -\bar{X})Y_i}{S^2_X}\\ $$
$\hat{\beta}_0, \hat{\beta}_1$ 均为 $Y_i$ 的线性函数
- $\hat{\beta}_0, \hat{\beta}_1$ 是 $\beta_0, \beta_1$ 的无偏估计
$$ \begin{aligned} \text{var}(\hat{\beta}_0) &= \text{var}(\bar{Y}) = \frac{\sigma^2}{n}\\ \text{var}(\hat{\beta}_1) &= \text{var}\left( \frac{\sum (X_i - \bar{X})Y_i}{S_X^2} \right)\\ &= \sum \left( \frac{(X_i - \bar{X})^2}{S_X^2} \right) \text{var}(Y_i)\\ &= \frac{\text{var}(Y_i)}{S_X^2} = \frac{\sigma^2}{S_X^2} \end{aligned} $$
- 截距 $\beta_0$ 的方差由测量数据的样本决定
- $\beta_1$ 的方差由 $S_X^2$ 决定,$X$ 的点取得越紧密,方差越大,应尽量取分散的点
- 可以证明,$\beta_0$ 和 $\beta_1$ 的协方差 $\text{cov}(\beta_0, \beta_1) = 0$
$$ \begin{aligned} Y &= \beta_0 + \beta_1 (X - \bar{X})\\ b_0 &= \beta_0 - \beta_1 \bar{X}\\ b_1 &= \beta_1\\ \text{var}(b_0) &= \text{var}(\beta_0) + \bar{X}^2 \text{var}(\beta_1)\\ \text{var}(b_1) &= \text{var}(\beta_1)\\ \end{aligned} $$
$\beta_0$ 和 $\beta_1$ 互相独立,而 $b_0$ 和 $b_1$ 不独立
残差估计 ¶
残差的定义 ¶
残差是参数估计的 $\hat{Y}$ 与测量值 $Y$ 的差,定义为:
$$ \delta_i = Y_i - \hat{Y}_i $$
显然,残差可以看作是不可观测误差 $\varepsilon_i$ 的估计。残差是诊断回归模型拟合是否良好的一种直观的工具,将在回归诊断一节中详细介绍。
残差的用途 ¶
- 检验回归函数与数据的符合程度:残差用于检验回归模型与数据的拟合程度,不随 $x$ 有特定趋势。
- 估计 $\sigma^2$:残差用于估计误差项 $e$ 的方差 $\sigma^2$。
残差的平方和估计 ¶
通常使用 $s^2$ 作为 $\sigma^2$ 的估计,定义为:
$$ s^2 = \frac{1}{n-2} \sum_{i=1}^{n} e_i^2 = \frac{1}{n-2} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $$
$s^2$ 是 $\sigma^2$ 的无偏估计,可以证明(证明参见定理 9.4.2
import scipy.stats as st
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
a=3
b=4
x=st.uniform(0,10).rvs(20)
y=[np.random.normal(a*i+b,5) for i in x]
sns.regplot(x=x, y=y, ci=95)
<Axes: >
sns.residplot(x=x, y=y)
<Axes: >
#检验趋势
sns.residplot(x=x, y=y,lowess=True)
<Axes: >