Примените t-критерий ко многим столбцам в фрейме данных, разбитому на фактор
У меня есть датафрейм с одним столбцом фактора с двумя уровнями и многими числовыми столбцами. Я хочу разделить фрейм данных по столбцу коэффициентов и провести t-тест по парам столбцов.
Используя пример набора данных Puromycin, я хочу, чтобы результат выглядел примерно так:
Variable Treated Untreated p-value Test-statistic CI of difference****
Conc 0.3450 0.2763 XXX T XX - XX
Rate 141.58 110.7272 xxx T XX - XX
Я думаю, что я ищу решение, использующее PLYR, которое может вывести вышеупомянутые результаты в хороший фрейм данных.
(Puromycin содержит только две числовые переменные, но решение, которое я ищу, будет работать на кадре данных со многими числовыми переменными)
ОБНОВЛЕНИЕ - я постараюсь уточнить, что я имею в виду.
Я хотел бы перейти от данных, которые выглядят так:
Grouping variable var1 var2 var3 var4 var5
1 3 5 7 3 7
1 3 7 5 9 6
1 5 2 6 7 6
1 9 5 7 0 8
1 2 4 5 7 8
1 2 3 1 6 4
2 4 2 7 6 5
2 0 8 3 7 5
2 1 2 3 5 9
2 1 5 3 8 0
2 2 6 9 0 7
2 3 6 7 8 8
2 10 6 3 8 0
Для результирующего кадра данных, который выглядит следующим образом:
"Mean in group 1" "Mean in group 2" "P-value of difference" "N"
var1 ## ## ## ##
var2 ## ## ## ##
var3 ## ## ## ##
var4 ## ## ## ##
var5 ## ## ## ##
Возможно, это что-то с mapply, которое я ищу, потому что я хочу разделить мой dataframe на dataframe1 и dataframe2 с помощью двухуровневого фактора и применить функцию (t-test) к первым частям dataframe1 и dataframe2, а затем t-тест для вторых частей dataframe1 и dataframe2, а затем t-тест для третьих частей dataframe1 и dataframe2 и т. д. для всех пар столбцов, сгенерированных с помощью деления на коэффициент.
3 ответа
Может быть, это дает результат, который вы ищете:
df <- read.table(text="Group var1 var2 var3 var4 var5
1 3 5 7 3 7
1 3 7 5 9 6
1 5 2 6 7 6
1 9 5 7 0 8
1 2 4 5 7 8
1 2 3 1 6 4
2 4 2 7 6 5
2 0 8 3 7 5
2 1 2 3 5 9
2 1 5 3 8 0
2 2 6 9 0 7
2 3 6 7 8 8
2 10 6 3 8 0", header = TRUE)
t(sapply(df[-1], function(x)
unlist(t.test(x~df$Group)[c("estimate","p.value","statistic","conf.int")])))
Результат:
estimate.mean in group 1 estimate.mean in group 2 p.value statistic.t conf.int1 conf.int2
var1 4.000000 3.000000 0.5635410 0.5955919 -2.696975 4.696975
var2 4.333333 5.000000 0.5592911 -0.6022411 -3.104788 1.771454
var3 5.166667 5.000000 0.9028444 0.1249164 -2.770103 3.103436
var4 5.333333 6.000000 0.7067827 -0.3869530 -4.497927 3.164593
var5 6.500000 4.857143 0.3053172 1.0925986 -1.803808 5.089522
Может быть, вы можете найти это полезным
res <- sapply(split(Puromycin[,-3], Puromycin$state), t.test)[c(1:3,5),]
conf.level <- sapply(sapply(split(Puromycin[,-3], Puromycin$state), t.test)[4, ], '[', 1:2)
res <- rbind(res, conf.level.lower=conf.level[1,], conf.level.upper=conf.level[2,])
res
treated untreated
statistic 4.297025 4.206221
parameter 23 21
p.value 0.00026856 0.0003968191
estimate 70.96417 55.50182
conf.level.lower 36.80086 28.06095
conf.level.upper 105.1275 82.94268
Вы также можете использовать заказной пакет matrixTests
за это. Пример использования data.frame, подготовленного @Sven ниже:
df <- read.table(text="Group var1 var2 var3 var4 var5
1 3 5 7 3 7
1 3 7 5 9 6
1 5 2 6 7 6
1 9 5 7 0 8
1 2 4 5 7 8
1 2 3 1 6 4
2 4 2 7 6 5
2 0 8 3 7 5
2 1 2 3 5 9
2 1 5 3 8 0
2 2 6 9 0 7
2 3 6 7 8 8
2 10 6 3 8 0", header = TRUE)
library(matrixTests)
col_t_welch(df[df$Group==1,-1], df[df$Group==2,-1])
obs.x obs.y obs.tot mean.x mean.y mean.diff var.x var.y stderr df statistic pvalue conf.low conf.high alternative mean.null conf.level
var1 6 7 13 4.000000 3.000000 1.0000000 7.200000 11.333333 1.679002 10.963146 0.5955919 0.5635410 -2.696975 4.696975 two.sided 0 0.95
var2 6 7 13 4.333333 5.000000 -0.6666667 3.066667 5.000000 1.106976 10.938135 -0.6022411 0.5592911 -3.104788 1.771454 two.sided 0 0.95
var3 6 7 13 5.166667 5.000000 0.1666667 4.966667 6.666667 1.334226 10.995151 0.1249164 0.9028444 -2.770103 3.103436 two.sided 0 0.95
var4 6 7 13 5.333333 6.000000 -0.6666667 10.666667 8.333333 1.722862 10.146824 -0.3869530 0.7067827 -4.497927 3.164593 two.sided 0 0.95
var5 6 7 13 6.500000 4.857143 1.6428571 2.300000 13.142857 1.503624 8.285649 1.0925986 0.3053172 -1.803808 5.089522 two.sided 0 0.95