#r #ggplot2
#r #ggplot2
Вопрос:
У меня есть фасетный график с 40 коробочными графиками в нем. Я хочу вычислить значение p (скорректированное) для диаграммы, отличной от нуля, для каждой диаграммы на графике. Итак, в основном простой ttest. Есть ли способ сделать это для всего набора данных?
Пример данных:
Pos Pair Fold_Change
1 Yes 0.36170477
1 Yes 0.63926759
1 No -0.26791834
1 No 0.06245854
2 Yes 0.95403940
2 Yes 0.45182453
2 No 0.95403940
2 No 0.45182453
....
ggplot(Pairing,aes(Pairing,Fold_Change,fill=Pairing)) geom_boxplot() facet_grid(~Position)
Комментарии:
1. Итак, вы хотите t-тесты для каждого
Pos
с n = 4 (две точки в группе «Да», две в группе «Нет»)?2. Да, поэтому для Pos = 1 и Pair = Yes я хочу один тест. Еще один тест для Pos = 1 и Pair = Нет. И так далее.
3. Но это означает, что у вас есть только 2 балла за тест? По одному в каждой группе?
4. Нет, это всего лишь пример матрицы. Моя матрица выглядит аналогично, только с большим количеством точек.
Ответ №1:
Вы можете split
создать свой набор данных в соответствии с Pos
и Pair
, а затем «пакетно» выполнить t.test
при Fold_Change
использовании lapply
.
С примером набора данных следующим образом:
> Pairings <- expand.grid(Pos=1:4, Pair=rep(c('Yes','No'),2))
> Pairings$Fold_Change <- runif(16)
> Pairings
Pos Pair Fold_Change
1 1 Yes 0.31076451
2 2 Yes 0.73035471
3 3 Yes 0.40153490
4 4 Yes 0.34368815
5 1 No 0.75398667
6 2 No 0.34578325
7 3 No 0.93771945
8 4 No 0.60309476
9 1 Yes 0.55861350
10 2 Yes 0.75467734
11 3 Yes 0.55299688
12 4 Yes 0.81453028
13 1 No 0.39110782
14 2 No 0.04561982
15 3 No 0.71373404
16 4 No 0.79267332
Это однострочник, который выполняет то, что вы ищете:
> lapply(split(Pairings,Pairings[,1:2]),function(x)t.test(x$Fold_Change)$p.value)
$`1.Yes`
[1] 0.1768022
$`2.Yes`
[1] 0.01042596
$`3.Yes`
[1] 0.1001815
$`4.Yes`
[1] 0.2458096
$`1.No`
[1] 0.1953704
$`2.No`
[1] 0.4164919
$`3.No`
[1] 0.08582059
$`4.No`
[1] 0.08594222
Чтобы объяснить, давайте сделаем это шаг за шагом.
Шаг 1: разделите свой набор данных в соответствии с позициями и парами:
> split(Pairings,Pairings[,1:2])
$`1.Yes`
Pos Pair Fold_Change
1 1 Yes 0.3107645
9 1 Yes 0.5586135
$`2.Yes`
Pos Pair Fold_Change
2 2 Yes 0.7303547
10 2 Yes 0.7546773
$`3.Yes`
Pos Pair Fold_Change
3 3 Yes 0.4015349
11 3 Yes 0.5529969
$`4.Yes`
Pos Pair Fold_Change
4 4 Yes 0.3436882
12 4 Yes 0.8145303
$`1.No`
Pos Pair Fold_Change
5 1 No 0.7539867
13 1 No 0.3911078
$`2.No`
Pos Pair Fold_Change
6 2 No 0.34578325
14 2 No 0.04561982
$`3.No`
Pos Pair Fold_Change
7 3 No 0.9377195
15 3 No 0.7137340
$`4.No`
Pos Pair Fold_Change
8 4 No 0.6030948
16 4 No 0.7926733
Шаг 2: Выполняет t.test в списке:
> lapply(split(Pairings,Pairings[,1:2]),function(x)t.test(x$Fold_Change))
$`1.Yes`
One Sample t-test
data: x$Fold_Change
t = 3.5077, df = 1, p-value = 0.1768
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-1.139921 2.009299
sample estimates:
mean of x
0.434689
$`2.Yes`
One Sample t-test
data: x$Fold_Change
t = 61.0556, df = 1, p-value = 0.01043
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
0.5879919 0.8970401
sample estimates:
mean of x
0.742516
...
Шаг 3: Сохраните только значение p.приняв function(x)t.test(x$Fold_Change)$p.value
.
Если вы хотите сделать его немного более разборчивым, вы можете изменить его следующим образом:
> do.call(rbind,
lapply(split(Pairings,Pairings[,1:2]),
function(x)data.frame(Pos=x$Pos[1],
Pair=x$Pair[1],
p.value=t.test(x$Fold_Change)$p.value)))
Pos Pair p.value
1.Yes 1 Yes 0.17680222
2.Yes 2 Yes 0.01042596
3.Yes 3 Yes 0.10018152
4.Yes 4 Yes 0.24580956
1.No 1 No 0.19537040
2.No 2 No 0.41649186
3.No 3 No 0.08582059
4.No 4 No 0.08594222