R: t-тест по всем подмножествам по всем столбцам - PullRequest
1 голос
/ 12 марта 2012

Это вопрос из R: t-критерий для всех столбцов

Предположим, у меня огромный набор данных, а затем я создал множество подмножеств на основе определенных условий.Подмножества должны иметь одинаковое количество столбцов.Затем я хочу сделать t-тест на двух подмножествах за один раз (внешний цикл), а затем для каждой комбинации подмножеств пройти все столбцы по одному столбцу за раз (внутренний цикл).придумать на основе предыдущего ответа.Этот останавливается с ошибкой.

C <- c("c1","c1","c1","c1","c1",
   "c2","c2","c2","c2","c2",
   "c3","c3","c3","c3","c3",
   "c4","c4","c4","c4","c4",
   "c5","c5","c5","c5","c5",
   "c6","c6","c6","c6","c6",
   "c7","c7","c7","c7","c7",
   "c8","c8","c8","c8","c8",
   "c9","c9","c9","c9","c9",
   "c10","c10","c10","c10","c10")
X <- rnorm(n=50, mean = 10, sd = 5)
Y <- rnorm(n=50, mean = 15, sd = 6)
Z <- rnorm(n=50, mean = 20, sd = 5)
Data <- data.frame(C, X, Y, Z)

Data.c1 = subset(Data, C == "c1",select=X:Z)
Data.c2 = subset(Data, C == "c2",select=X:Z)
Data.c3 = subset(Data, C == "c3",select=X:Z)
Data.c4 = subset(Data, C == "c4",select=X:Z)
Data.c5 = subset(Data, C == "c5",select=X:Z)

Data.Subsets = c("Data.c1",
                 "Data.c2",
                 "Data.c3",
                 "Data.c4",
                 "Data.c5") 

library(plyr)

combo1 <- combn(length(Data.Subsets),1)
adply(combo1, 1, function(x) {

  combo2 <- combn(ncol(Data.Subsets[x]),2)
  adply(combo2, 2, function(y) {

      test <- t.test( Data.Subsets[x][, y[1]], Data.Subsets[x][, y[2]], na.rm=TRUE)

      out <- data.frame("Subset" = rownames(Data.Subsets[x]),
                    , "Row" = colnames(x)[y[1]]
                    , "Column" = colnames(x[y[2]])
                    , "t.value" = round(test$statistic,3)
                    ,  "df"= test$parameter
                    ,  "p.value" = round(test$p.value, 3)
                    )
      return(out)
  } )
} )

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Прежде всего, вы можете легче определить свой набор данных, используя gl и избегая создания отдельных переменных для столбцов.

Data <- data.frame(
  C = gl(10, 5, labels = paste("c", 1:10, sep = "")),
  X = rnorm(n = 50, mean = 10, sd = 5),
  Y = rnorm(n = 50, mean = 15, sd = 6),
  Z = rnorm(n = 50, mean = 20, sd = 5)
)

Преобразуйте это в "длинный" формат, используя melt из пакета reshape. (Вы также можете использовать функцию base reshape.)

longData <- melt(Data, id.vars = "C")

Теперь используйте pairwise.t.test, чтобы вычислить t-тесты для всех пар X / Y / Z для каждого уровня C.

with(longData, pairwise.t.test(value, interaction(C, variable)))

Обратите внимание, что важно использовать pairwise.t.test, а не просто множество отдельных вызовов t.test, потому что вам нужно настроить значения p, если вы запускаете много тестов. (См., Например, xkcd для объяснения.)

Как правило, парные t-тесты уступают регрессии, поэтому будьте осторожны с их использованием.

1 голос
/ 12 марта 2012

Вы можете использовать get(Data.subset[x]), который выберет соответствующий фрейм данных. Но я не думаю, что это должно быть необходимо.

Явное подмножество, которое много раз не должно быть необходимым. Вы можете создать их, используя что-то вроде

conditions = c("c1", "c2", "c3", "c4", "c5")
dfs <- lapply(conditions, function(x){subset(Data, C==x, select=X:Z)})

Это должно (не проверять это) возвращать список фреймов данных, каждый из которых был разбит на части при различных условиях, которые вы передали.

Однако, как указывает @Richie Cotton, было бы гораздо лучше изменить форму вашего фрейма данных и использовать попарные t-тесты.

Я должен отметить, что выполнение такого множества t-тестов не кажется разумным. Даже после исправления для множественного тестирования, будь то FDR, перестановка или другое. Было бы лучше попытаться выяснить, можете ли вы использовать какую-либо анову, поскольку они используются почти для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...