在 R 中重现 t 检验给出的结果与内置函数不同

机器算法验证 r t检验
2022-04-12 09:58:09

我正在尝试使用 Raj Jain 的计算机系统性能分析艺术中第 211 页中的示例来重现 t 检验的工作原理。

计算如下:

# system A sample and statistics
a <- c(5.36, 16.57, 0.62, 1.41, 0.64, 7.26)
x_a <- mean(a)
s2_a <- var(a)
n_a <- length(a)

# system B sample and statistics
b <- c(19.12, 3.52, 3.38, 2.5, 3.6, 1.74)
x_b <- mean(b)
s2_b <- var(b)
n_b <- length(b)

# computation of t-test
s <- (s2_a/n_a + s2_b/n_b)^(1/2)
v <- ((s2_a/n_a + s2_b/n_b)^2)/((1/(n_a - 1))*((s2_a/n_a)^2) + (1/(n_b - 1))*((s2_b/n_b)^2)) - 2

# 90% confidence interval
(x_a - x_b) + c(1, -1) * qt(c(0.95), v) * s

最后一次计算的输出是 (6.55, -7.22),它与书中给出的结果相匹配(请参阅此处的勘误表:https ://www.cse.wustl.edu/~jain/books/ftp/errors_all.pdf )。

但是,内置的 t 检验给出了不同的结果:

> t.test(a, b, conf.level = 0.9)

    Welch Two Sample t-test

data:  a and b
t = -0.09015, df = 9.9434, p-value = 0.93
alternative hypothesis: true difference in means is not equal to 0
90 percent confidence interval:
 -7.038828  6.372161
sample estimates:
mean of x mean of y 
 5.310000  5.643333 

内置函数给出的置信区间为 (-7.04, 6.37)。我无法重现此间隔。造成差异的原因是什么?我的计算错了吗?

更新:不同的结果是由于的值不同,表示自由度。正如 Ben Bolker 指出的那样,R 使用 9.94,而书中的手动计算使用这本书没有说明为什么要减去 2。它只是假设观察结果是独立且不成对的,但对方差保持沉默。v9.942=7.94

Neeraj 的答案重现了维基百科文章中对Welch 的 t 检验给出的自由度计算

1个回答

您在计算自由度时犯了错误。

这是代码,它准确地重现了 R t.test 结果。

a <- c(5.36, 16.57, 0.62, 1.41, 0.64, 7.26)
b <- c(19.12, 3.52, 3.38, 2.5, 3.6, 1.74)

v1 <- var(a)
v2 <- var(b)

n1 <- length(a)
n2 <- length(b)

se <- sqrt(v1/n1 + v2/n2)

nu <- se^4 / ((v1^2 /(n1^2*(n1 -1))) + (v2^2/(n2^2*(n2-1)))) #degree of freedom

#Confidence Interval
mean(a) - mean(b) + c(1, -1)* qt(.95, nu)*se

> 6.372161 -7.038828

它与 t.test 结果完全匹配

t.test(a, b, conf.level = 0.9)