11

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

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

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

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

4

2 回答 2

14

使用 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 上对 y 进行正态回归。如果 const = TRUE,则回归矩阵是由一列 1 和后面的回归列组成的增广矩阵,即 X'=(1,X)。如果 const = FALSE,则回归矩阵只是 X,因此在包含一列的情况下运行回归与在不包含一列并设置 const=TRUE 的情况下运行相同的估计值。

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

R平方计算

在第三行和第五行得到的第一个公式的 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
于 2012-06-19T07:37:52.000 回答
1

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

根据下面的屏幕截图,它提供了与我的扩展数据集在我的原始答案中所做的相同m和值xr2

在此处输入图像描述

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`    

在此处输入图像描述

于 2012-06-19T02:43:05.727 回答