使用numpy和R的标准差的不同结果

时间:2013-12-20 16:57:12

标签: python r numpy statistics

当我尝试使用numpy和R计算标准差时,得到两个不同的结果。 可能有些愚蠢的我想念但是什么?

R代码

x1=matrix(c(1,7,5,8,9,5,4,5,4,3,76,8),nrow=4)
std=sd(x1[,1])
mean=mean(x1[,1])
std=apply(X=x1,MARGIN=2,FUN=sd)
std



> x1=matrix(c(1,7,5,8,9,5,4,5,4,3,76,8),nrow=4)
> std=sd(x1[,1])
> std=apply(X=x1,MARGIN=2,FUN=sd)
> std
[1]  3.095696  2.217356 35.565667

Python代码

import numpy as np

x1=np.matrix([[1.,9.,4.],[7.,5.,3.],[5.,4.,76.],[8.,5.,8.]])
std=np.apply_along_axis(func1d=np.std,axis=0,arr=x1)


std
Out[9]: array([  2.68095132,   1.92028644,  30.80077109])

3 个答案:

答案 0 :(得分:5)

对于将来的搜索,R会将标准偏差设为N - 1作为分母,numpy设为N。要获得相同的结果,请尝试以下设置ddof"delta degrees of freedom"

x1.std(axis=0, ddof=1)

请注意,您可以使用不同的表示法来节省大量的内容:

In [33]: x1.std(axis=0)
Out[33]: matrix([[  2.68095132,   1.92028644,  30.80077109]])

In [34]: x1.std(axis=0, ddof=1)
Out[34]: matrix([[  3.09569594,   2.21735578,  35.56566697]])

答案 1 :(得分:3)

这将为你提供与numpy相同的答案。请参阅Standard Deviation in R Seems to be Returning the Wrong Answer - Am I Doing Something Wrong?http://en.wikipedia.org/wiki/Standard_deviation以供参考

  apply(x1, 2, function(x) sd(x) * sqrt((length(x) - 1) / length(x)) )

答案 2 :(得分:2)

默认情况下,由于标准差计算中的平均值计算,R减去了一个自由度。

R代码的NumPy等价物是:

np.std(x1, axis = 0, ddof = 1)