当我尝试 运行 t.test() 时出现错误

I get an error when I try to run t.test()

我正在尝试执行 t.test 如下:

t.test(data = a, score ~ group, paired = T)

但是,我得到这个错误:

Error in complete.cases(x, y) : not all arguments have the same length

我认为这是因为 group$target 有一些 NA。 我怎样才能告诉 t.test() 函数 运行 测试(因为 NA 应该在那里)?

这是关于我的数据的一些信息:

table(a$group)
target: 96
nontarget: 96   

str(a$score)
num [1:192] 3 4.5 5.75 6.25 6 7 5 5.5 NA 5.25 ...

str(a$group)
Factor w/ 2 levels "nontarget","target": 2 2 2 2 2 2 2 2 2 2 ...

部分数据样本:

ResponseId group score
R_XZz2leQjPyBF4OZ target 4.750000
R_yx5aiVCJfpz1Y9b target NA
R_z0RbO2yL1QT3jTX target 6.500000
R_3DnI1SqwhDrourD nontarget 3.250000
R_3e39IHkvt1yh0R8 nontarget 1.833333
R_3e5kUZaUet2HYTw nontarget 2.916667

回应评论,我很关心@JohnGarland 的问题(你确定 你真的有配对数据吗?),但前提是你有(以及不同的 ResponseID 值是一条红鲱鱼),我认为你必须丢弃所有 NA 值(你说“NAs 应该在那里”,但是由于没有办法在成对的 t-test 中包含一个带有缺失值的对 [*请参阅下面的反驳],您将不得不丢弃它们)。一种方法是将数据集转换为宽格式,然后使用 na.omit()(然后使用稍微奇怪的语法来对 t-test 和 wide-format 数据进行配对)。

读入样本数据(短但无所谓):

dd <- read.table(header=TRUE, text="
ResponseId  group   score
R_XZz2leQjPyBF4OZ   target  4.750000
R_yx5aiVCJfpz1Y9b   target  NA
R_z0RbO2yL1QT3jTX   target  6.500000
R_3DnI1SqwhDrourD   nontarget   3.250000
R_3e39IHkvt1yh0R8   nontarget   1.833333
R_3e5kUZaUet2HYTw   nontarget   2.916667
")

转换为宽格式:

d_wide <- with(dd,
               data.frame(target = score[group == "target"],
                          nontarget = score[group == "nontarget"]))

这是一个low-tech方法。您还可以使用基础 R 中的 reshape()unstack()(尽管我很难弄清楚这些); reshape2::reshape;或 tidyr::pivot_wider.

完成后:

t.test(Pair(target, nontarget) ~ 1, data = na.omit(d_wide))

counter-argument 是你实际上可以通过拟合线性 mixed-effect 模型 (LMM) 限制最大似然 (REML) 来更好地处理不平衡数据;这可以使用未配对的数据略微改善两组平均值的估计;当组平衡时,它应该 (??) 给出与经典 t-test 相同的答案。

dd$pair <- factor(rep(1:3, 2))
mm <- nlme::lme(score ~ group, 
          random = ~1|pair, data = dd, method = "REML", 
     na.action = na.omit)
summary(mm)

部分根据上下文工作,部分根据数据的设置方式工作。大多数人不会按照 OP 中给出的方式使用 2 个因素 设置配对样本 t 检验(目标组与非目标组是否相同?通常不会,但有时会发生在参加者)。另外,请注意

a <- data.frame(ResponseID = letters[1:6], 
     group = as.factor(c(rep("target",3),rep("nontarget",3))),
     score = c(4.75,NA,6.5,3.25,1.83,2.92))

t.test(data = a, score ~ group, paired = FALSE)

在给定的数据结构上工作得很好。