Python中的简单t检验,带有差异的置信区间。

3

在Python中执行t检验并包含差异的置信区间最简单的方法是什么?我看过各种帖子,但每个帖子都不同,当我试图自己计算置信区间时,似乎有点错误...这里:

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)

返回值:

[-30.12845447] [-0.57070077]

然而,当我在SPSS运行相同的测试时,虽然我有相同的t和p值,但置信区间为-31.87286,1.17371,并且在R中也是如此。我似乎找不到正确的方法来解决这个问题,希望能得到一些帮助。

1个回答

3

当你计算自由度(dof)时,需要减去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]

话虽如此,但我不会手动实现,我可能会使用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是代表性的,那么假设方差相等可能不是一个好选择。


谢谢你的回答。当我导入statsmodels.stats.api as sms时,我会得到以下警告:FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead. from pandas.core import datetools这个问题有什么解决办法吗? - fffrost
不幸的是,实际上并没有解决这个问题 - 这是 statsmodels 方面的问题,他们还没有更新。同时,如果你只想要消除警告,你可以在导入 statsmodels 之前添加 import warningswarnings.simplefilter(action='ignore', category=FutureWarning)(注意:未经测试,所以我可能语法有误,但“python suppress futurewarning”或类似的搜索应该能找到正确的方法)。 - DSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接