You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 23:06:11