将Excel的LINEST函数转换为C#:斜率标准误差计算难题
实现Excel LINEST函数的斜率标准误差(C# + Math.Net Numerics)
单变量场景(对应Excel单自变量的LINEST)
如果你的known_xs是单个自变量,直接用Math.Net的SimpleRegression类,它自带的StandardErrorSlope属性正好对应Excel公式INDEX(LINEST(known_ys,known_xs,TRUE,TRUE),2,1)的结果:
using MathNet.Numerics.Statistics; // 示例数据 double[] knownYs = { 1.2, 2.1, 3.3, 4.0, 5.2 }; double[] knownXs = { 2, 4, 6, 8, 10 }; // 初始化回归模型并添加数据 var regression = new SimpleRegression(); for (int i = 0; i < knownYs.Length; i++) { regression.Add(knownXs[i], knownYs[i]); } // 获取斜率的标准误差,即Excel目标值 double slopeStdError = regression.StandardErrorSlope;
多变量场景(对应Excel多自变量的LINEST)
如果是多个自变量,需要通过计算回归的方差-协方差矩阵来提取对应斜率的标准误差:
using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.Statistics; // 示例多自变量数据 double[] knownYs = { 1.2, 2.1, 3.3, 4.0, 5.2 }; double[][] knownXs = { new double[] { 2, 4, 6, 8, 10 }, // 第一个自变量 new double[] { 0.5, 1.0, 1.5, 2.0, 2.5 } // 第二个自变量 }; // 构造设计矩阵X:第一列为截距项(全1),后续列对应各个自变量 var X = Matrix<double>.Build.Dense(knownYs.Length, knownXs.Length + 1); for (int row = 0; row < knownYs.Length; row++) { X[row, 0] = 1; // 截距项 for (int col = 0; col < knownXs.Length; col++) { X[row, col + 1] = knownXs[col][row]; } } var y = Vector<double>.Build.Dense(knownYs); // 计算回归结果 var (coefficients, residuals) = MultipleRegression.NormalEquations(X, y); // 计算均方误差(MSE) int sampleCount = X.RowCount; int parameterCount = X.ColumnCount; double mse = residuals.DotProduct(residuals) / (sampleCount - parameterCount); // 计算(X^T X)的逆矩阵,再乘以MSE得到方差-协方差矩阵 var xtxInverse = X.TransposeThisAndMultiply(X).Inverse(); var covarianceMatrix = xtxInverse.Multiply(mse); // 第一个自变量的斜率标准误差(对应Excel INDEX(LINEST(...),2,1)) // 注:系数数组索引0是截距,索引1对应第一个自变量,协方差矩阵[1,1]元素的平方根即为标准误差 double firstSlopeStdError = Math.Sqrt(covarianceMatrix[1, 1]);
内容的提问来源于stack exchange,提问作者Duffp
相关产品推荐
相关产品推荐

