Excel为对的值集生成散点图。它还提供了为趋势线生成最佳拟合趋势线和公式的选项。它还产生气泡图,其考虑了每个值提供的重量。但是,权重对趋势线或公式没有影响。以下是一组示例值及其映射和权重。
Value Map Weight
0 1 10
1 2 10
2 5 10
3 5 20
4 6 20
5 1 1
使用Excel的趋势线,值5的映射对公式有太大影响。有没有办法生成反映各自权重的公式?
作为帮助,我已经引入了连续五个值的加权平均值。但他们是更好的方式吗?
答案 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)
根据下面的屏幕截图,它提供了我的扩展数据集在原始答案中所用的m
,x
和r2
值
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`