Цикл For с использованием функции t-stat для создания списка

#list #r

#Список #r

Вопрос:

Я использую следующую функцию для вычисления t-stat для данных во фрейме данных (x):

     wilcox.test.all.genes<-function(x,s1,s2) {
     x1<-x[s1]
     x2<-x[s2]
     x1<-as.numeric(x1)
     x2<-as.numeric(x2)
     wilcox.out<-wilcox.test(x1,x2,exact=F,alternative="two.sided",correct=T)
     out<-as.numeric(wilcox.out$statistic)
     return(out)
    }
  

Мне нужно написать цикл for, который будет повторяться определенное количество раз. Для каждой итерации столбцы необходимо перетасовывать, выполнять вышеуказанную функцию и сохранять максимальное значение t-stat в списке.

Я знаю, что могу использовать sample() функцию для перетасовки столбцов фрейма данных и max() функцию для определения максимального значения t-stat, но я не могу понять, как соединить их вместе, чтобы получить работоспособный код.

Комментарии:

1. Приведенный ниже ответ работает, но мне все еще немного неясно, что вы на самом деле пытаетесь сделать. Сравнение вашей реальной тестовой статистики с результатами распределения, полученными в результате этих перестановок, даст вам эмпирическое значение p. Однако вы упомянули о максимальном значении, которое обычно используется для исправления множественных сравнений, если вы выполняете много подобных тестов. Однако меня смущает то, что ваш x является вектором, и вы выполняете только один тест. В любом случае, если вы немного проясните, я буду рад соответствующим образом отредактировать свой ответ.

2. Фрейм данных, который я использую, содержит данные от двух классов индивидуумов, я разделяю данные на основе класса. Функция представляет собой тест Уилкокса на данных из двух классов. После завершения первоначального теста я хочу перетасовать столбцы фрейма данных, снова выполнить функцию, получить максимальную статистику теста из новых данных и сохранить это число в списке. Я хочу выполнить перетасовку 500 раз, в результате чего будет получен список из 500 максимальных тестовых статистических данных из перетасованных данных. Я буду использовать этот список тестовой статистики для определения 95% тестовой статистики для сравнения с исходным набором данных. Спасибо

3. Я понимаю. Это то, что я подумал. Было бы полезно, если бы вы предоставили примерные данные, поскольку у нас не было возможности узнать, что у вас есть фрейм данных. Кроме того, возникает небольшая путаница, потому что для выполнения подобного тестирования перестановок вы переставляете метки классов (т. Е. строки ), а не столбцы. Смотрите мой отредактированный ответ ниже для вашего решения. Удачи!

Ответ №1:

Вы пытаетесь сгенерировать эмпирические p-значения с поправкой на множественные сравнения, которые вы проводите из-за множества столбцов в ваших данных. Сначала давайте смоделируем пример набора данных:

 # Simulate data
n.row = 100
n.col = 10

set.seed(12345)
group = factor(sample(2, n.row, replace=T))
data  = data.frame(matrix(rnorm(n.row*n.col), nrow=n.row))
  

Вычислите критерий Уилкоксона для каждого столбца, но мы будем повторять это много раз, переставляя принадлежность наблюдений к классу. Это дает нам эмпирическое нулевое распределение этой тестовой статистики.

 # Re-calculate columnwise test statisitics many times while permuting class labels
perms = replicate(500, apply(data[sample(nrow(data)), ], 2, function(x) wilcox.test(x[group==1], x[group==2], exact=F, alternative="two.sided", correct=T)$stat))
  

Вычислите нулевое распределение максимальной тестовой статистики путем свертывания по нескольким сравнениям.

 # For each permuted replication, calculate the max test statistic across the multiple comparisons
perms.max = apply(perms, 2, max)
  

Теперь, просто отсортировав результаты, мы можем определить критическое значение p = 0.05.

 # Identify critical value 
crit = sort(perms.max)[round((1-0.05)*length(perms.max))]
  

Мы также можем построить наше распределение вместе с критическим значением.

 # Plot 
dev.new(width=4, height=4)
hist(perms.max)
abline(v=crit, col='red')
  

введите описание изображения здесь

Наконец, сравнение реальной тестовой статистики с этим распределением даст вам эмпирическое значение p, скорректированное для множественных сравнений путем регулирования ошибки по семейству до p<0,05. Например, давайте представим, что реальная тестовая статистика была 1600. Затем мы могли бы вычислить p-значение следующим образом:

 > length(which(perms.max>1600))/length(perms.max)
[1] 0.074