【问题标题】:R t.test() with data.frames as argumentsR t.test() 以 data.frames 作为参数
【发布时间】:2017-07-02 16:37:08
【问题描述】:

CrossValidated 上有一个问题,有人给t.test 函数提供了两个数据帧而不是两个向量:https://stats.stackexchange.com/questions/261830/t-test-or-wilcox-in-r-and-how-to-apply-to-dataframe-splitted-in-2-groups/

查看此代码以获得更短的示例

a <- data.frame(foo=1:5, bar=5:9)
b <- data.frame(foo=1:5, bar=5:9)
t.test(a,b)

t.test 函数的 help 页面明确指出 x 和 y 应该是

数据值的(非空)数值向量。

上面的代码仍然没有抛出错误但给出了结果。结果是什么意思?

【问题讨论】:

  • 我怀疑 ab 被强制转换为向量,这就是正在测试的内容。将您的结果与t.test(as.vector(as.matrix(a)), as.vector(as.matrix(b))) 进行比较。顺便说一句,我没有收到您的代码错误。
  • 是的,这会产生相同的结果。不过,奇怪的是,数据帧是这样被强制的。这种行为有什么用处?
  • 在我个人看来,这肯定会引发错误或至少是一个警告。

标签: r syntax t-test


【解决方案1】:

你可以看看里面的代码:

 stats:::t.test.default

我在这里展示了一些选定的代码

function (x, y = NULL, alternative = c("two.sided", "less", "greater"), 
    mu = 0, paired = FALSE, var.equal = FALSE, conf.level = 0.95, 
    ...) 
{
    alternative <- match.arg(alternative)
    if (!missing(mu) && (length(mu) != 1 || is.na(mu))) 
    ### snip
    if (!is.null(y)) {
    ### snip
       yok <- !is.na(y)
       xok <- !is.na(x)
    ### snip
      y <- y[yok]

所以我们确实有一个 y 参数,您会看到 yok 将导致一个选择,当在 y[yok] 中使用时,该选择将变成一个向量。最后,一切都会发生在 data.frame 上,强制转换为向量 (as.vector)。

绝对不是一个人打算做的事情,但也有来自用户的错误规格......

【讨论】:

  • 是的,如果他没有尝试做wilcox.test 的话,这种错误说明会被忽视。
【解决方案2】:

这是未记录的行为,但您在传递 data.frames 时违反了文档。

发生这种情况:

x <- a
y <- b
yok <- !is.na(y)
xok <- !is.na(x)
y <- y[yok]
#[1] 1 2 3 4 5 5 6 7 8 9
x <- x[yok]
#[1] 1 2 3 4 5 5 6 7 8 9

基本上,您得到的结果与您执行t.test(unlist(a), unlist(b)) 时的结果相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-04
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多