Мне интересно, действительно ли вы хотите провести непарный t-тест. Причина, по которой я говорю это, заключается в том, что вы описали первый столбец как ИСТИНА или ЛОЖЬ, а затем сказали, что ваша цель состояла в том, чтобы увидеть, насколько хорошо другие столбцы могут предсказать значение ИСТИНА. Или, другими словами, значительно ли отличаются значения 19 других столбцов между группами ИСТИНА и ЛОЖЬ. Если вы действительно хотели сделать парный t-тест, то ваши данные, как описано, не совсем в правильном формате. Если вы не хотите сравнить x2 и x3 или x3 и x4 et c. Затем вы будете использовать следующее:
t.test(df$x2, df$x3, paired=TRUE)
Выполнение t-тестов непарный для второго столбца с первым столбцом, поскольку групповая переменная достигается с помощью метода формулы. Например, чтобы сравнить средние значения второй переменной между группами ИСТИНА и ЛОЖЬ, вы можете выполнить:
t.test(x1 ~ group, data=df)
И это непарный t-тест из двух выборок. Это также может быть сделано немного по-разному по причинам, которые станут очевидны позже.
t.test(df$x1 ~ df$group)
t.test(df[,2] ~ df[,1])
Последняя версия позволяет затем выполнять повторные тесты с использованием функции lapply
, как упомянуто.
tests <- lapply(2:20, function(x) t.test(df[,x] ~ df[,1]))
Возвращает список без имени, который может быть назван с использованием имен фрейма данных.
names(tests) <- names(df)[2:20]
tests[1]
$x1
Welch Two Sample t-test
data: df[, x] by df[, 1]
t = -0.83536, df = 94.695, p-value = 0.4056
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-5.339658 2.176944
sample estimates:
mean in group FALSE mean in group TRUE
48.46547 50.04683
Вы также можете убрать его, используя пакет broom .
lapply(tests, broom::tidy)
$x1
# A tibble: 1 x 10
estimate estimate1 estimate2 statistic p.value parameter conf.low conf.high method alternative
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr>
1 -1.58 48.5 50.0 -0.835 0.406 94.7 -5.34 2.18 Welch Two ~ two.sided
Версия dplyr будет использовать функцию do
вместо lapply
, но сначала кадр данных необходимо привести в длинный формат.
library(dplyr)
library(tidyr)
df %>% pivot_longer(cols=starts_with("x")) %>%
group_by(name) %>%
do(tidy(t.test(.$value ~ .$group)))
# A tibble: 19 x 11
# Groups: name [19]
name estimate estimate1 estimate2 statistic p.value parameter conf.low conf.high
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 x1 -1.58 48.5 50.0 -0.835 0.406 94.7 -5.34 2.18
2 x10 -0.377 49.3 49.6 -0.194 0.847 95.1 -4.24 3.49
3 x11 4.49 53.1 48.6 2.08 0.0400 97.8 0.209 8.77
4 x12 -1.05 51.1 52.2 -0.450 0.654 88.9 -5.70 3.59
5 x13 -0.743 49.4 50.1 -0.360 0.720 96.8 -4.84 3.35
6 x14 0.908 51.5 50.6 0.487 0.627 93.3 -2.79 4.61
Данные :
set.seed(123)
n <- 100; m=19 # number of subjects (rows) and number of "x" columns
X <- data.frame(matrix(rnorm(n*m, mean=50, sd=10), byrow=TRUE, nc=m))
colnames(X) <- paste0("x", 1:19)
df <- data.frame(group=sample(c(TRUE, FALSE), size=n, replace=TRUE), X)
str(df)
'data.frame': 100 obs. of 20 variables:
$ group: logi FALSE FALSE FALSE FALSE TRUE FALSE ...
$ x1 : num 44.4 45.3 46.9 55.8 47.2 ...
$ x2 : num 47.7 39.3 46.2 51.2 37.8 ...
$ x3 : num 65.6 47.8 43.1 52.2 51.8 ...
$ x4 : num 50.7 39.7 47.9 53.8 48.6 ...
$ x5 : num 51.3 42.7 37.3 45 50.1 ...
$ x6 : num 67.2 43.7 71.7 46.7 53.9 ...