加权趋势线

时间:2012-06-18 17:15:15

标签: excel graph excel-formula curve-fitting least-squares

Excel为对的值集生成散点图。它还提供了为趋势线生成最佳拟合趋势线和公式的选项。它还产生气泡图,其考虑了每个值提供的重量。但是,权重对趋势线或公式没有影响。以下是一组示例值及其映射和权重。

    Value Map     Weight
    0       1      10
    1       2      10
    2       5      10
    3       5      20
    4       6      20
    5       1      1

使用Excel的趋势线,值5的映射对公式有太大影响。有没有办法生成反映各自权重的公式?

作为帮助,我已经引入了连续五个值的加权平均值。但他们是更好的方式吗?

2 个答案:

答案 0 :(得分:12)

对于A2:C7中的数据,基于标准加权最小二乘公式,您可以尝试:

=LINEST(B2:B7*C2:C7^0.5,IF({1,0},1,A2:A7)*C2:C7^0.5,0)

在E2:F2或任何2x1范围内使用CTRL + SHIFT + ENTER输入。这也返回{1.1353,1.4412}。

对于Rsquared,您可以输入:

=INDEX(LINEST((B2:B7-SUM(B2:B7*C2:C7)/SUM(C2:C7))*C2:C7^0.5,IF({1,0},1,A2:A7)*C2:C7^0.5,0,1),3,1)

公式说明

首先考虑使用LINEST对X进行正态回归。如果const = TRUE,则回归矩阵是由一列1后跟回归列组成的增广矩阵,即X'=(1,X)。如果const = FALSE,则回归矩阵只是X,因此运行带有一列包含的回归的回归给出了与没有一列的运行并设置const = TRUE相同的估计值。

现在考虑加权最小二乘回归。回归现在是WX上的Wy'=(W1,WX),其中W是由权重的平方根组成的对角矩阵。由于没有列的列,我们必须设置const = FALSE并在回归矩阵中使用两列。

Rsquared Calculation

在我们在第三和第五行得到的第一个公式的LINEST输出中将stats设置为TRUE:

SSres = 59.76
SSreg(u) = 1461.24
SSTot(u) = 1521
Rsq(u) = 1 - 59.76/1521 = 0.9607 

注意这些值是未经验证的版本(u),因为const = FALSE(有关详细信息,请参阅LINEST上的MS帮助。)对于居中版本(c),我们需要减去加权平均值,如下所示:

SSTot(c) =SUMPRODUCT(C2:C7*(B2:B7-SUM(B2:B7*C2:C7)/SUM(C2:C7))^2) = 244.93
Rsq(c) = 1 - 59.76/244.93 = 0.756

答案 1 :(得分:1)

<强>更新
根据您有数万行的附加信息,这里有一个VBA UDF可以完成这项工作(包括r2)

根据下面的屏幕截图,它提供了我的扩展数据集在原始答案中所用的mxr2

enter image description here

Public Function LinestWeighted(xRng As Range, yRng As Range, wRng As Range, bInt As Boolean, bStat As Boolean) As Variant
    Dim x As Variant
    Dim y As Variant
    Dim W As Variant
    Dim TotX As Variant
    Dim TotY As Variant
    Dim lngRow As Long
    Dim strDelim As String
    Dim strX As String
    Dim strY As String
    Dim NewSeries As Variant

    x = Application.Transpose(xRng)
    y = Application.Transpose(yRng)
    W = Application.Transpose(wRng)
    strDelim = ","

    If (UBound(x, 1) = UBound(y, 1)) And (UBound(x, 1) = UBound(W, 1)) Then
        For lngRow = 1 To UBound(W)
            strX = strX & Application.WorksheetFunction.Rept(x(lngRow) & strDelim, W(lngRow))
            strY = strY & Application.WorksheetFunction.Rept(y(lngRow) & strDelim, W(lngRow))
        Next lngRow
        TotX = Split(Left$(strX, Len(strX) - 1), strDelim)
        TotY = Split(Left$(strY, Len(strY) - 1), strDelim)
        ReDim NewSeries(1 To UBound(TotX) + 1, 1 To 2)
        For lngRow = 0 To UBound(TotX)
            NewSeries(lngRow + 1, 1) = CDbl(TotX(lngRow))
            NewSeries(lngRow + 1, 2) = CDbl(TotY(lngRow))
        Next
        With Application
            LinestWeighted = .WorksheetFunction.LinEst(.Index(.Transpose(NewSeries), 2), .Index(.Transpose(NewSeries), 1), bInt, bStat)
        End With
    Else
        LinestWeighted = "input ranges must be equal in length"
        Exit Function
    End If
End Function

初步回答

只需按加权因子扩展数据系列

因此,不要尝试绘制6对,而是使用从最高到最低的比率来重复这些点

即。图

0       1     `10 times`  
1       2     `10 times`    
...
5       1     `once`    

enter image description here