Python Scipy置信区间返回与手动计算不同的界限

Python Scipy置信区间返回与手动计算不同的界限,python,scipy,confidence-interval,scipy.stats,Python,Scipy,Confidence Interval,Scipy.stats,我从10个不同的人那里得到了以下数据 df=pd.DataFrame({'id':范围(1,11), ‘x’:[7,-1.6,-.2,-.2,-.1,3.4,3.7,8,0,2]}) 打印(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%置信区间 由于观测数量较少,样本

我从10个不同的人那里得到了以下数据

df=pd.DataFrame({'id':范围(1,11),
‘x’:[7,-1.6,-.2,-.2,-.1,3.4,3.7,8,0,2]})
打印(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%置信区间

由于观测数量较少,样本平均值应遵循10-1个自由度的t分布。为了使用
scipy
计算95%的C.I.,我尝试了以下方法:

#库
将numpy作为np导入
从scipy导入统计信息
#观察次数
n_obs=10
#观测平均值
m_obs=df['x'].平均值()
#观测方差(无偏)
v_obs=df['x'].var(ddof=1)/n_obs
#声明带有观测参数的随机变量
t=stats.t(df=n_obs-1,loc=m_obs,scale=np.sqrt(v_obs))
#计算95%置信区间
t、 间隔(α=0.95)
>(-0.5297804134938646,2.0297804134938646)###正确间隔
这个置信区间是正确的。但是,当我手动计算时间间隔时,得到了完全不同的结果。这是什么原因造成的

# 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
使P(T(-0.3983168630668432,1.8983168630668432)###间隔不正确
我已经两周没有在评论中发布答案了,但没有人因此而受到赞扬,所以这里是:

两个置信区间不同的原因是,值
T
累积了
T
概率分布下面积的97.5%,并且
T
具有均值
m_obs
和方差
v_obs
。也就是说,它不是标准的t分布

只需将标准T分布概率的0.975累积为
T
值,即可正确计算正确的间隔:

#观察次数(不变)
n_obs=10
#观测平均值(不变)
m_obs=df['x'].平均值()
#观测方差(无偏)(不变)
v_obs=df['x'].var(ddof=1)/n_obs
#声明*STANDARD*t分发(已更改!!!)
t=stats.t(df=n_obs-1,loc=0,scale=1)
#T使得P(x (-0.5297804134938646, 2.0297804134938646)

这就得到了正确的答案。

Easy StackOverflow points:之所以会出现这种差异,是因为
t
没有标准化,我用它来得到一些
t
,它的左边有97.5%的分布。如果有人想把这个作为答案,我很乐意接受。