【问题标题】:is seaborn confidence interval computed correctly?seaborn 置信区间计算是否正确?
【发布时间】:2019-05-05 23:47:43
【问题描述】:

首先,我必须承认我的统计知识充其量是生疏的:即使它是新的,它也不是我特别喜欢的学科,这意味着我很难理解它。

尽管如此,我查看了barplot 图表如何计算误差线,并惊讶地发现使用“置信区间”(CI) 而不是(更常见的)标准偏差。研究更多 CI 使我找到了这个 wikipedia article,这似乎是说,基本上,一个 CI 被计算为:

或者,在伪代码中:

def ci_wp(a):
    """calculate confidence interval using Wikipedia's formula"""
    m = np.mean(a)
    s = 1.96*np.std(a)/np.sqrt(len(a))
    return m - s, m + s

但我们在seaborn/utils.py 中发现的是:

def ci(a, which=95, axis=None):
    """Return a percentile range from an array of values."""
    p = 50 - which / 2, 50 + which / 2
    return percentiles(a, p, axis)

现在也许我完全错过了这一点,但这似乎与维基百科提出的计算完全不同。谁能解释这种差异?

再举一个例子,来自 cmets,为什么我们会得到如此不同的结果:

 >>> sb.utils.ci(np.arange(100))
 array([ 2.475, 96.525])

 >>> ci_wp(np.arange(100))
 [43.842250270646467,55.157749729353533]

并与其他统计工具进行比较:

 def ci_std(a):
     """calculate margin of error using standard deviation"""
     m = np.mean(a)
     s = np.std(a)
     return m-s, m+s

 def ci_sem(a):
     """calculate margin of error using standard error of the mean"""
     m = np.mean(a)
     s = sp.stats.sem(a)
     return m-s, m+s

这给了我们:

>>> ci_sem(np.arange(100))
(46.598850802411796, 52.401149197588204)

>>> ci_std(np.arange(100))
(20.633929952277882, 78.366070047722118)

或者随机抽样:

rng = np.random.RandomState(10)
a = rng.normal(size=100)
print sb.utils.ci(a)
print ci_wp(a)
print ci_sem(a)
print ci_std(a)

...产生:

[-1.9667006   2.19502303]
(-0.1101230745774124, 0.26895640045116026)
(-0.017774461397903049, 0.17660778727165088)
(-0.88762281417683186, 1.0464561400505796)

为什么 Seaborn 的数字与其他结果有如此大的不同?

【问题讨论】:

  • 我确认:sb.ci(np.arange(100))给array([ 2.475, 96.525]),直接计算np.mean(np.arange(100))-np.arange(100).std()*1.96/10给[43.842250270646467,55.157749729353533]。
  • 谢谢!这听起来是对的,尽管我必须说:seaborn 的结果在这里似乎更有意义......为了比较,使用普通的mean +/- std 给出:(20.633929952277882, 78.366070047722118)

标签: python matplotlib seaborn boxplot confidence-interval


【解决方案1】:

您使用这个维基百科公式的计算是完全正确的。 Seaborn 只是使用了另一种方法:https://en.wikipedia.org/wiki/Bootstrapping_(statistics)。 Dragicevic [1] 很好地描述了这一点:

[它] 包括通过随机抽取带有替换的观察结果,从实验数据中生成许多替代数据集。假设这些数据集的可变性近似于抽样误差,并用于计算所谓的引导置信区间。 [...] 它用途广泛,适用于多种发行版。

在 Seaborn 的源代码中,barplot 使用 estimate_statistic 引导数据然后计算其置信区间:

>>> sb.utils.ci(sb.algorithms.bootstrap(np.arange(100)))
array([43.91, 55.21025])

结果与你的计算一致。

[1] Dragicevic, P. (2016)。 HCI 中的公平统计通信。在 HCI 的现代统计方法中(第 291-330 页)。查姆·斯普林格。

【讨论】:

    【解决方案2】:

    您需要检查百分位数的代码。您发布的 seaborn ci 代码仅计算 percentile 限制。此区间的定义平均值为 50(中位数),默认范围为 95% 置信区间。 percentiles 例程中会出现实际平均值、标准差等。

    【讨论】:

    • percentiles 最终调用scipy.stats.scoreatpercentile - 这看起来仍然与维基百科的计算不同......
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2013-12-23
    • 2016-08-27
    • 2022-01-22
    • 2017-11-05
    相关资源
    最近更新 更多