在R中复现t检验时结果不符的问题排查
问题描述
我用R代码执行Welch t检验:
t.test(gktlists ~ small, data=star, var.equal=FALSE)
得到的t值为-3.5985,但手动计算得到的t值是-3.746202,手动步骤如下:
mean_small <- mean(star$gktlists[star$small == 1], na.rm = TRUE) mean_large <- mean(star$gktlists[star$small == 0], na.rm = TRUE) print(mean_small - mean_large) var_small <- var(star$gktlists[star$small == 1], na.rm=TRUE) var_large <- var(star$gktlists[star$small == 0], na.rm=TRUE) len_small <- length(star$gktlists[star$small == 1]) len_large <- length(star$gktlists[star$small == 0]) (mean_large - mean_small) / sqrt(var_small / len_small + var_large / len_large)
想知道差异是舍入误差还是t.test()有未预期的处理逻辑,哪里出错了?
问题原因
核心错误是样本量计算未排除NA值:
- 计算
len_small和len_large时用了length(),该函数会把gktlists中对应small==1/0的NA值也计入样本量,但mean()和var()用了na.rm=TRUE,实际用的是去除NA后的有效样本量。 t.test()会自动处理NA值,使用每组中非NA观测的数量,而非原始子集的长度。
修正后的手动计算代码
把样本量的计算改成去除NA后的计数:
mean_small <- mean(star$gktlists[star$small == 1], na.rm = TRUE) mean_large <- mean(star$gktlists[star$small == 0], na.rm = TRUE) var_small <- var(star$gktlists[star$small == 1], na.rm=TRUE) var_large <- var(star$gktlists[star$small == 0], na.rm=TRUE) # 获取去除NA后的有效样本量 len_small <- sum(!is.na(star$gktlists[star$small == 1])) len_large <- sum(!is.na(star$gktlists[star$small == 0])) # 注:t.test中gktlists~small的t值计算逻辑是(mean_small - mean_large)/标准误,和你原代码分子符号相反,但绝对值会与函数结果一致 (mean_small - mean_large) / sqrt(var_small / len_small + var_large / len_large)
修正后计算出的t值会和t.test()的结果完全匹配。
额外说明:Welch t检验的t值计算公式本身和你手动使用的公式一致,差异完全来自样本量的错误计算,与舍入误差或函数额外处理无关。
内容的提问来源于stack exchange,提问作者Marlon Brando
相关产品推荐
相关产品推荐

