【发布时间】: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