如何解决Scipy 置信区间返回与手动计算不同的界限
我有来自 10 个不同人的以下数据。
df = pd.DataFrame({'id':range(1,11),'x':[.7,-1.6,-.2,-1.2,-.1,3.4,3.7,.8,2]})
print(df)
id x
0 1 0.7
1 2 -1.6
2 3 -0.2
3 4 -1.2
4 5 -0.1
5 6 3.4
6 7 3.7
7 8 0.8
8 9 0.0
9 10 2.0
我想计算 df[x]
的总体均值的 95% 置信区间。
由于观察次数很少,样本均值应遵循 t 分布,自由度为 10 - 1。我尝试了以下方法来计算 95% 的 C.I.使用 scipy
:
# Libraries
import numpy as np
from scipy import stats
# Number of observations
n_obs = 10
# Observed mean
m_obs = df['x'].mean()
# Observed variance (unbiased)
v_obs = df['x'].var(ddof=1) / n_obs
# Declare random variable with observed parameters
t = stats.t(df=n_obs - 1,loc=m_obs,scale=np.sqrt(v_obs))
# Calculate 95% CI
t.interval(alpha=0.95)
> (-0.5297804134938646,2.0297804134938646) ### Correct interval
这个置信区间是正确的。但是,当我手动计算间隔时,我得到了完全不同的结果。这是什么原因造成的?
# T such that P(t < T) = 0.975
T = t.ppf(0.975)
# Manually compute interval
(m_obs - (T * np.sqrt(v_obs)),m_obs + (T * np.sqrt(v_obs)))
> (-0.3983168630668432,1.8983168630668432) ### Incorrect interval
解决方法
自从我在评论中发布答案以来已经两周了,但没有人对此表示赞赏,所以它是这样的:
两个置信区间不同的原因是值T
累积了t
概率分布下面积的97.5%,而t
的均值m_obs
和方差v_obs
。也就是说,它不是一个标准的t分布。
只需将 T
设为标准 t 分布概率的 0.975 的累加值,即可正确计算出正确的区间:
# Number of observations (UNCHANGED)
n_obs = 10
# Observed mean (UNCHANGED)
m_obs = df['x'].mean()
# Observed variance (unbiased) (UNCHANGED)
v_obs = df['x'].var(ddof=1) / n_obs
# Declare *STANDARD* t distribution (CHANGED!!!)
t = stats.t(df=n_obs - 1,loc=0,scale=1)
# T such that P(x < T) = 0.975 (CHANGED!!!)
T = t.ppf(0.975)
# Manually compute interval (CORRECT ANSWER)
(m_obs - (T * np.sqrt(v_obs)),m_obs + (T * np.sqrt(v_obs)))
> (-0.5297804134938646,2.0297804134938646)
这会产生正确的答案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。