多变量回归分析(MLR)是统计学中一种强大的工具,它可以帮助理解多个自变量与一个因变量之间的关系。在科学研究、金融分析、医疗诊断等领域,MLR都发挥着重要作用。本文将通过一个简单的示例,展示MLR的基本概念和实现方法。
几个月前,写了一篇关于Java中矩阵运算的文章。如果对MLR感兴趣,建议先阅读那篇文章,因为本文的代码实现将大量依赖于矩阵运算。
为了理解MLR,先来看一个表格:
饮食评分 | 性别 | 年龄>20 | BMI |
---|---|---|---|
4 | 0 | 1 | 27 |
7 | 1 | 1 | 29 |
6 | 1 | 0 | 23 |
2 | 0 | 0 | 20 |
3 | 0 | 1 | 21 |
表格中记录了五个人的BMI值,以及他们的饮食评分、性别和是否超过20岁。目标是找出BMI与这些变量之间的关系。如果知道了一个人的这些信息,能否预测他的BMI值呢?MLR可以帮助回答这个问题。
期望BMI与三个变量之间的关系可以用以下方程表示:
BMI = β0 + β1 * 饮食评分 + β2 * 性别 + β3 * 年龄>20
为了预测已知饮食评分、性别和年龄的人的BMI值,需要知道所有β的值。MLR的任务就是找到这些缺失的系数。称β0为偏差。在大多数实际应用中,偏差较大意味着预测变量的预测能力不足,而较小的偏差则是良好预测模型的标志。偏差较大可能意味着还有其他描述符可以解释观察结果,但尚未发现它们。
MLR只有在自变量的数量少于或等于观测值的数量时才有效。换句话说,描述符的数量不能超过观测值的数量。另一个限制是上述方程中的逆运算。并非所有矩阵都有逆矩阵,当无法得到X'X的逆矩阵时,b矩阵的计算就会失败,因此MLR也会失败。还有其他方法,如偏最小二乘法或支持向量机,在MLR失败时仍然有效。
只需要在之前描述的所有矩阵操作方法之上实现一个方法,就可以创建模型并找到b矩阵的值。
public Matrix calculate() throws NoSquareException {
if (bias) {
this.X = X.insertColumnWithValue1();
}
checkDiemnsion();
Matrix Xtr = MatrixMathematics.transpose(X);
Matrix XXtr = MatrixMathematics.multiply(Xtr, X);
Matrix inverse_of_XXtr = MatrixMathematics.inverse(XXtr);
if (inverse_of_XXtr == null) {
System.out.println("Matrix X'X does not have any inverse. So MLR failed to create the model for these data.");
return null;
}
Matrix XtrY = MatrixMathematics.multiply(Xtr, Y);
return MatrixMathematics.multiply(inverse_of_XXtr, XtrY);
}
上述代码按照以下步骤获取b矩阵:
Matrix X = new Matrix(new double[][]{{4, 0, 1}, {7, 1, 1}, {6, 1, 0}, {2, 0, 0}, {3, 0, 1}});
Matrix Y = new Matrix(new double[][]{{27}, {29}, {23}, {20}, {21}});
MultiLinear ml = new MultiLinear(X, Y);
Matrix beta = ml.calculate();
使用双参数构造函数时,默认偏差值是true。以下是结果:
这是一个预测MSI的模型,它包含了所有独立变量的值(即饮食评分、性别和年龄)。β值的大小及其符号显示了它们的重要性。在这个示例中,饮食评分和性别对BMI的贡献大于年龄,性别和饮食评分的影响是相反的;即饮食评分较高的人BMI较高,男性的BMI明显低于女性。有趣的是,MLR为提供了关于BMI观察结果的洞察。
可以使用模型(上述方程)预测BMI,然后将其与观察值进行比较:
实际BMI | 预测BMI |
---|---|
27 | 27 |
29 | 27.75 |
23 | 24.25 |
20 | 18.75 |
21 | 22.25 |
如所见,预测值与观察值相差不远。可以为每个案例找到误差(即预测值 - 观察值),并计算均方误差(MSE),这可以指示模型有多准确。MSE越低,模型越好。有许多复杂的统计测试可以用来检验模型的适用性,本文将忽略这些测试。可以在代码中找到一些更多的测试。其中一个测试示例是使用MLR进行分类分析。