矩阵形式预警中的多因素线性回归

Multiple factors linear regression in matrix form warning

我在 MATLAB 中以矩阵形式执行多因素线性回归,我遇到了以下警告:

Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = smth.

我怀疑这是因为我执行线性回归的方式,我遵循的是系数向量为 ((X'X)^(-1))*(X'Y) 的标准方法。我的矩阵 X 具有以下格式:第一列只是全部 1 以便可以找到截距,在其他列中我使用 [=13= 的幂(因此是多项式基础模型) ]-坐标,所以 x 然后是 x^2x^3 等(列向量)。我认为错误的产生是由于较高的基值非常小,并且以某种方式将它们变成 NaN,因此出现警告。

我正在考虑使用另一种变量类型,但 double 已经达到极限了吗?有没有办法强制 MATLAB 不将那些极小的值分配给 NaN?如果那当然是 MATLAB 所做的。

MATLAB 不会仅仅因为数字很小(甚至非常小)就引入 NaN。如果您的输入 x 向量中没有 NaN,则 MATLAB 不会将它们放入 x^2 或 x^3 或 x^n。

但是,如果您的 X 矩阵的一列或多列接近于零,那么您的病态矩阵并不真正适合此回归。您需要重新考虑您尝试使用的模型(即多项式的次数)。

顺便说一句,对于这个特定的问题,除非您需要编写自己的函数,否则您可以使用 polyfit,或者统计工具箱中的众多回归函数之一。

如果您需要编写自己的函数,请确保您使用的是反斜杠运算符而不是 inv 函数,即使用 (X'*X)\(X'*Y) 而不是 inv(X'*X)*(X'*Y).

几条评论。 (如果对符号感到困惑,请检查最后的定义。)

怎么了?

  1. 线性回归背后的假设之一是 E[x_i * x_i'] 是满秩的。当您用样本均值 X'*X / n 近似总体均值 E[x_i * x_i'] 时,您希望 X'*X 为满秩! 错误告诉您,根据机器精度,此假设不成立!

    我猜你的一列总是接近于 0,或者当你提高到高次幂时,两列在数值上变得相似(例如,同一行中的 0 或 HUGE)想象一下线性方程:

                              y = b1 * x1 + b2 * x2 + e
    

    如果 x2 始终为零,您将永远无法正确估计 b2,它可能是 10,也可能是 10^10。如果 x2 始终非常接近于零,或者某些列的线性组合在数值上接近另一列,则基本相同:那么数据中微小的微小变化将导致估计值的巨大波动。用数学术语来说,发生的事情是 E[x_i * x_i'] 实际上小于满秩。

    尝试一下,检查 cond(X'*X) 以提高 x 的 1 到 3 次方,检查 cond(X'*X) 以提高 x 的 1 到 4、1 到 5 次方等...在某个时候,您的条件数正在上升,因为 X'*X 在数值上接近排名不足。

  2. 在你得到这个错误之前,你的估计已经完全是废话了。这个错误 ("matrix badly scaled etc...") 告诉你什么时候你的 X'X 有如此高的条件数,e^-16 的机器精度与这个病态矩阵相结合将使你的估计不可靠。 但是您的数据中的误差几乎肯定比 e^-16 大得多出于估计的目的,您的数据实际上是多共线的。

你应该做什么?

  1. 您无法估计如此高的 x 次方的系数。您的数据不足以做到这一点。你需要往回拨,直到 X'*X 的条件数是合理的。

    也许您最多只能估计二阶多项式的系数!不要贪心,不要试图估计什么是不可能的。

  2. b = X \ y 计算你的估计值。

    对于任何线性方程,用 x = inv(A)*c 求解 Ax = c 不是最优的。形成逆是不必要的。可以直接用A\c求解线性系统。在这个问题中,您可以用 b = (X'*X) \ (X' * y); 求解系数 b 而且因为 \ 运算符的工作方式(它在最小二乘意义上求解超定系统),最简单的代码是:

    b = X \ y;   % USE THIS! (you can treat as a magical incantation to solve b = inv(X'*X) * X'y
    

    最后一点不是您问题的根源,但无论如何您都应该修复它。

定义:

  1. 对于每个观测值 i,x_i 是一个 k x 1 向量。
  2. n 是观察次数。
  3. 数据矩阵X是由[x_1'组成的n×k矩阵; x_2'; x_3'; ...; x_n'];
  4. y 是 n x 1 向量。
  5. 我们正在尝试通过线性方程 y_i = x_i' * b + e_i 中的 1 个向量 b 来估计 k。