【问题标题】:Calculate the standard deviation from a binned list计算分箱列表的标准差
【发布时间】:2015-12-27 12:40:58
【问题描述】:

假设我有一个整数值列表,从110。我没有实际的数据集,而是只有每个值的数量。例如:

1  | 73
2  | 121
3  | 155
4  | 149
5  | 187
6  | 180
7  | 166
8  | 148
9  | 120
10 | 81

如您所见,单独列出每个值会非常耗时(73 1s、121 2s 等等),但这是我知道如何使用 STDEV() 的唯一方法。

如何计算值的标准差?

【问题讨论】:

标签: excel math statistics


【解决方案1】:

可能的替代方案,假设 1 在 A1 中,在 C1 中:

=B1*(A1-SUMPRODUCT(A$1:A$10,B$1:B$10)/SUM(B$1:B$10))^2  

复制到 C10。在 B11 中,复制到 C11:

=SUM(B1:B10)  

在 D11:

=SQRT(C11/(B11-1))  
  • 如果2.520979是错误的答案,忘记上面的!

Excel 使用:

计算STDEV 以上只是将其分解为步骤以匹配可用的数据格式。

【讨论】:

    【解决方案2】:

    自定义的用户定义函数(又名 UDF)可能是最方便的途径。

          

    A 列中的值已分解为 B 列中的倍数到 D2:D1381(见下文)。

    E2:G2 中的 STDEVSTDEV.PSTDEV.S 公式是,

    =STDEV($D2:$D1381)
    =STDEV.P($D2:$D1381)
    =STDEV.S($D2:$D1381)
    

    E3:G3 中的 UDF 公式是,

    =udf_STDEV_Exploded($A2:$A11, 1)   ' or =udf_STDEV_Exploded($A2:$A11)
    =udf_STDEV_Exploded($A2:$A11, 2)
    =udf_STDEV_Exploded($A2:$A11, 3)
    

    UDF 公式基于以下模块代码。

    Function udf_STDEV_Exploded(rng As Range, Optional iTYP As Long = 1)
        Dim r As Long, v As Long, vVALs As Variant
    
        ReDim vVALs(0)
        For r = 1 To rng.Rows.Count
            For v = 1 To rng.Cells(r, 2).Value2
                vVALs(UBound(vVALs)) = rng.Cells(r, 1).Value2
                ReDim Preserve vVALs(0 To UBound(vVALs) + 1)
            Next v
        Next r
        ReDim Preserve vVALs(0 To UBound(vVALs) - 1)
    
        Select Case iTYP
            Case 1
                udf_STDEV_Exploded = WorksheetFunction.StDev(vVALs)
            Case 2
                udf_STDEV_Exploded = WorksheetFunction.StDev_P(vVALs)
            Case 3
                udf_STDEV_Exploded = WorksheetFunction.StDev_S(vVALs)
            Case Else
                'do nothing
        End Select
    End Function
    

    我添加了一个选项来使用STDEVSTDEV.PSTDEV.S 函数处理数组。 STDEV 函数是默认的。

    附录

    将 A2:B11 中的值分解为工作表上一长列值的代码是,

    Sub stdev_vals()
        Dim rw As Long, f As Long, n As Long
    
        With Worksheets("Sheet1")
            For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
                .Cells(Rows.Count, 4).End(xlUp).Offset(1, 0).Resize(.Cells(rw, 2).Value2, 1) = .Cells(rw, 1).Value2
            Next rw
        End With
    End Sub
    

    【讨论】:

      【解决方案3】:

      首先计算平均值(这里标记为 THE_AVG):

      =SUM(BIN_NUM*REPEATS)/SUM(REPEATS)
      

      作为数组公式输入 (CTRL-SHIFT-ENTER)。然后计算标准差:

      =SQRT(SUM((BIN_NUM-THE_AVG)^2*REPEATS)/(SUM(REPEATS)-1))
      

      再次作为数组公式输入。如果需要,可以将两个计算合并为一个公式:

      =SQRT(SUM((BIN_NUM-SUM(BIN_NUM*REPEATS)/SUM(REPEATS))^2*REPEATS)/(SUM(REPEATS)-1))
      

      在这些公式中,BIN_NUM 表示带有 bin 编号的单元格范围(例如 A1:A10),REPEATS 表示带有每个 bin 中计数的单元格范围(例如 B1:B10)。

      希望有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多