python 中具有差异 CI 的简单 t 检验

simple t-test in python with CIs of difference

在 python 中执行 t 检验并包含差异的置信区间的最直接方法是什么?我看过各种帖子,但一切都不一样,当我尝试自己计算 CI 时,它似乎有点不对...这里:

import numpy as np
from scipy import stats

g1 = np.array([48.7107107,
36.8587287,
67.7129929,
39.5538852,
35.8622661])
g2 = np.array([62.4993857,
49.7434833,
67.7516511,
54.3585559,
71.0933957])

m1, m2 = np.mean(g1), np.mean(g2)
dof = (len(g1)-1) + (len(g2)-1)

MSE = (np.var(g1) + np.var(g2)) / 2

stderr_diffs = np.sqrt((2 * MSE)/len(g1))

tcl = stats.t.ppf([.975], dof)

lower_limit = (m1-m2) - (tcl) * (stderr_diffs)
upper_limit = (m1-m2) + (tcl) * (stderr_diffs)

print(lower_limit, upper_limit)

returns:

[-30.12845447] [-0.57070077]

但是我运行在SPSS中做同样的测试,虽然t和p值一样,CI是-31.87286,1.17371,在R里也是这样,我可以'似乎找不到正确的方法,希望得到一些帮助。

计算自由度时减去 1,但计算方差时没有使用样本方差:

MSE = (np.var(g1) + np.var(g2)) / 2

应该是

MSE = (np.var(g1, ddof=1) + np.var(g2, ddof=1)) / 2

这给了我

[-31.87286426] [ 1.17370902]

也就是说,我可能会使用 statsmodels' CompareMeans:

而不是手动实施
In [105]: import statsmodels.stats.api as sms

In [106]: r = sms.CompareMeans(sms.DescrStatsW(g1), sms.DescrStatsW(g2))

In [107]: r.tconfint_diff()
Out[107]: (-31.872864255548553, 1.1737090155485568)

(我们真的应该在这里使用 DataFrame,而不是 ndarray,但我很懒)。

请记住,尽管您要考虑要对方差做出什么假设:

In [110]: r.tconfint_diff(usevar='pooled')
Out[110]: (-31.872864255548553, 1.1737090155485568)

In [111]: r.tconfint_diff(usevar='unequal')
Out[111]: (-32.28794665832114, 1.5887914183211436)

如果你的 g1 和 g2 具有代表性,等方差假设可能不太好。