微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VBA中的加权标准差

如何解决VBA中的加权标准差

我正在尝试在VBA中编写加权标准差函数。假定有2个远程输入输出一个值。但是,它返回一个#value错误

编辑:添加了worksheet.function

Public Function StDevWeighted(data As Range,weight As Range) As Double

    'https://stats.stackexchange.com/questions/6534/how-do-i-calculate-a-weighted-standard-deviation-in-excel
    
    Dim mean,top,bottom
    
    mean = WorksheetFunction.SumProduct(data,weight) / WorksheetFunction.Length(data)
    
    top = WorksheetFunction.SumProduct(weight,(data - mean) ^ 2)
    bottom = ((WorksheetFunction.Length(data) - 1) / WorksheetFunction.Length(data)) * WorksheetFunction.Sum(weight)
    
    StDevWeighted = WorksheetFunction.SQRT(top / bottom)
End Function

解决方法

因此,不幸的是,您必须自己计算每个项目的平方差,并将答案存储在临时数组中(有关原因,请参见注释)。我还没有检查过数学……高于薪水等级!

Public Function StDevWeighted(rngData As Range,rngWeight As Range) As Double
    Dim dMean As Double
    Dim dTop As Double
    Dim dBottom As Double

    Dim vData As Variant
    vData = rngData
   
    dMean = WorksheetFunction.SumProduct(rngData,rngWeight) / rngData.Count

    Dim vSqDiff() As Variant
    ReDim vSqDiff(1 To UBound(vData,1),1 To UBound(vData,2))

    For r = 1 To UBound(vData,1)
        For c = 1 To UBound(vData,2)
            vSqDiff(r,c) = (vData(r,c) - dMean) ^ 2
        Next c
    Next r

    dTop = WorksheetFunction.SumProduct(rngWeight,vSqDiff)
    dBottom = ((rngData.Count - 1) / rngData.Count) * WorksheetFunction.Sum(rngWeight)

    StDevWeighted = Sqr(dTop / dBottom)
End Function

PS。我直接使用调试器从电子表格中对此进行了测试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。