计算分箱列表中的标准偏差

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

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

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

我如何计算值的标准差?

自定义的用户定义函数(aka UDF)可能是最合适的路线。

用于在STDEV中爆炸数组的UDF

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

E2:G2中的STDEV , STDEV.P和STDEV.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 

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

附录

将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 

可能的替代scheme,假设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使用:

SO32854049的例子

来计算STDEV ,上面的内容将其分解成几个步骤来匹配可用的数据格式。

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

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

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

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

再次作为数组公式input。 如果需要,这两个计算可以折叠成一个公式:

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

在这些公式中,BIN_NUM表示带有二进制数的单元格的范围(比如A1:A10),REPEATS表示每个单元格中的单元格的范围(比如B1:B10)。

希望有所帮助