R t.test() с data.frames в качестве аргументов

Есть вопрос по CrossValidated, где кто-то дал два фрейма данных вместо двух векторов функции t.test: https://stats.stackexchange.com/questions/261830/t-test-or-wilcox-in-r-and-how-to-apply-to-dataframe-split-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)

На странице help для функции t.test четко указано, что x и y должны быть

(непустой) числовой вектор значений данных.

Тем не менее приведенный выше код не выдает ошибки, но дает результат. В чем смысл результата?


person Bernhard    schedule 14.02.2017    source источник
comment
Я подозреваю, что a и b принуждают к векторам, и это то, что проверяется. Сравните свой результат с t.test(as.vector(as.matrix(a)), as.vector(as.matrix(b))). Кстати, я не получаю никаких ошибок с вашим кодом.   -  person Roman Luštrik    schedule 14.02.2017
comment
Да, это дает идентичный результат. Странно, однако, что кадры данных принудительно обрабатываются таким образом. Чем может быть полезно такое поведение?   -  person CarlAH    schedule 14.02.2017
comment
По моему личному мнению, это определенно должно вызывать ошибку или, по крайней мере, предупреждение.   -  person Bernhard    schedule 14.02.2017


Ответы (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)).

person Roland    schedule 14.02.2017

Вы можете взглянуть на код внутри:

 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).

Определенно не то, что можно было бы сделать, а также пропущенные спецификации от пользователя...

person Eric Lecoutre    schedule 14.02.2017
comment
Да, эта неверная спецификация осталась бы незамеченной, если бы он(а) не попытался также сделать wilcox.test. - person Bernhard; 14.02.2017