我正在用 numpy 生成一堆 N 个正常的 rvs(平均 0 sd 1),然后用 ddof = 1 取样本的标准偏差,这大概会给我一个无偏估计。流程大致如下:

def genData(samples = 20, mean = 333.8, sd = 3.38):
    bl = scipy.stats.norm.rvs(loc = mean, scale = sd, size = samples)
    return [np.mean(bl), np.std(bl, ddof = 1)]

means = {}
sds = {}

n = 50000

for size in range(5,21):
    x = [genData(size, mean = 0, sd = 1) for x in range(n)]
    means[size] = map(lambda d: d[0], x)
    sds[size] = map(lambda d: d[1], x)

但是,我观察到以下 KDE:

ddof = 1

ddof = 2

由于样本量小,请原谅粗略的曲线。

ddof = 1 存在明显偏差,而 ddof = 2 则消除了偏差。我在这里做错了什么?

最佳答案

方差的无偏估计量的平方根不一定是方差平方根的无偏估计量。在数学方面, sum[(su)²]/(N-1) 是方差 V 的无偏估计量,即使 sqrt{sum[(xu)²]/(N-1)} 不是 sqrt 的无偏估计量(五)。

这实际上是在 scipy 的文档中:link(参见“注释”部分)。

关于python - numpy 标准差估计偏差,ddof = 1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12109908/

10-12 20:26