使用R语言t.test执行双样本t检验因因子变量报错求助
双样本t检验报错排查及结果解释
问题背景
我尝试用R语言的标准函数t.test对两个变量执行双样本t检验:FC01是1-5分的Likert量表(有序排名变量),joko是取值为TRUE/FALSE的二元分类变量。代码如下:
## Dummy data ds <- data.frame(FC01 = c(3, 3, 4, 2, 3, 1, 2, 4, 3, 3, 2), joko = c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE)) ds$FC01 = factor(ds$FC01, levels = c("1", "2", "3", "4", "5", "-9"), labels = c("1", "2", "3", "4", "5", "[NA] Not answered"), ordered = FALSE) ## t-test t.test(ds$FC01, ds$joko, var.equal = TRUE)
报错信息
运行后抛出如下错误:
> t.test(ds$FC01, ds$joko, var.equal = TRUE) Error in var(x) : Calling var(x) on a factor x is defunct. Use something like 'all(duplicated(x)[-1L])' to test for a constant vector. In addition: Warning message: In mean.default(x) : Argument ist weder numerisch noch boolesch: gebe NA zurück
补充操作及疑惑
我额外运行了以下代码:
all(duplicated(ds$FC01)[-1L]) all(duplicated(ds$joko)[-1L])
得到结果:
> all(duplicated(ds$FC01)[-1L]) [1] FALSE > all(duplicated(ds$joko)[-1L]) [1] FALSE
但我不理解这个结果的含义,希望得到问题解决方法及结果解释。
问题分析与解决
1. 报错核心原因
t.test是参数检验,要求输入的因变量必须是数值型或逻辑型,因为它需要计算均值、方差等统计量。但你将FC01转换为了无序因子(ordered = FALSE),因子属于分类变量,无法直接计算均值和方差,这就是报错的直接原因:
Error in var(x):因子无法计算方差,该操作已被废弃;mean.default警告:因子既不是数值也不是逻辑类型,无法计算均值,返回NA。
2. 补充代码结果解释
你运行的all(duplicated(x)[-1L])是用来检验向量是否为常量向量(所有元素完全相同):
duplicated(x)返回逻辑向量,标记每个元素是否与前面的元素重复;[-1L]去掉第一个元素,若剩下的元素全为TRUE,说明从第二个元素开始都和第一个元素一致,即整个向量是常量;- 你的两个结果都是
FALSE,说明FC01和joko都不是常量向量,这是t检验的正常前提(样本需要有变异),但这个结果和当前报错无关。
3. 解决方案
根据变量类型,有两种合理选择:
选项1:近似为数值型变量执行t检验
很多场景下会将Likert量表近似当作数值变量处理,此时需要先将FC01转换为数值型,再使用规范的公式语法执行t检验:
# 将因子转换为数值型(先转字符避免因子水平编码干扰) ds$FC01_num <- as.numeric(as.character(ds$FC01)) # 公式形式:因变量 ~ 分组变量,是t检验的标准写法 t.test(FC01_num ~ joko, data = ds, var.equal = TRUE)
选项2:使用非参数检验(更严谨的统计选择)
Likert量表本质是有序分类变量,t检验要求数据近似正态分布,更严谨的做法是使用曼-惠特尼U检验(适用于有序分类变量的组间比较),对应R中的wilcox.test:
# 有序因子可直接用于曼-惠特尼检验 wilcox.test(FC01 ~ joko, data = ds)
该检验不需要正态分布假设,更适配有序分类变量的统计特性。
内容的提问来源于stack exchange,提问作者user21297188
相关产品推荐
相关产品推荐

