【问题标题】:calculating weighted standard deviation error计算加权标准偏差误差
【发布时间】:2017-02-02 00:58:16
【问题描述】:

我想计算加权平均值和加权标准差。我能够计算平均值但不能计算标准偏差。我该怎么办?

     With Application.WorksheetFunction


        Range("AH" & 2) = .SumProduct(Columns(7), Columns(8)) / .Max(Columns(8))  'This code works very well. It calculates the mean


        Dim Nprime As Double

        Nprime = .CountIf(Range("H2:H" & lengthRows), "<>" & 0)  'This code works well


        Range("AM" & 2) = 2 * .SQRT(.SumProduct((Columns(7) - Columns(34)) ^ 2, Columns(8)) / ((Nprime - 1) * .Sum(Columns(8))) / Nprime) 'This line does not work. It should calculate the weighted standard deviation.

Range("AM" & 2) = Evaluate("2*SQRT(SumProduct((Columns(7) - weightedMean)^2), Columns(8)) / ((Nprime - 1) * .Sum(Columns(8))) / Nprime)") 'This line code evaluates with an answer of #VALUE! probably due to the titles in Row1, how do I fix the code to only evaluate the numerical values within the columns?

        End With

【问题讨论】:

  • 你想在Range("AL:AL") = Columns(7) 中做什么?
  • 我试图弄清楚为什么 std dev 计算不起作用。您可以忽略该行
  • 老实说,我不确定如何解决这个问题,您应该考虑将范围实例化为对象,因为Column(7) 不可读,您必须记住该范围内的内容,而第三方只是无法弄清楚这是什么。
  • 没关系。谢谢你的帮助。我最终会通过调用一个函数来以不同的方式执行此操作。

标签: excel vba


【解决方案1】:

对“加权”AV 或 SD 不放心,但也许您可以调整以下内容。代码加载数组中的数据,然后获取AV和SD。

Private Sub CommandButton1_Click()

    Dim MyArray() As Variant
    Dim lAV As Double
    Dim lSD As Double
    Dim i As Integer

    lLastRow = Worksheets("MyData").UsedRange.Rows.Count
    ReDim MyArray(1 To 1) As Variant

    For i = 1 To lLastRow
        MyArray(UBound(MyArray)) = Worksheets("MyData").Cells(i, 7).Value * Worksheets("MyData").Cells(i, 8).Value
        ReDim Preserve MyArray(1 To UBound(MyArray) + 1) As Variant 'now array is 1 element longer
    Next

    'Now MyArray contains desired data.
    'Get average and SD

    lAV = Application.WorksheetFunction.Average(MyArray)
    lSD = Application.WorksheetFunction.StDev(MyArray)

    'write results (be shure not to overwrite your data)
    Worksheets("MyData").Cells(1, 10) = "Average: "
    Worksheets("MyData").Cells(1, 11) = lAV
    Worksheets("MyData").Cells(2, 10) = "SD: "
    Worksheets("MyData").Cells(2, 11) = lSD
End Sub

【讨论】:

  • 其他人通过调用一个函数以与此类似的不同方式帮助我。问题解决了,谢谢:)