R для l oop для расчета wilcox.test - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь написать код, который бы автоматически вычислял p-значение критерия Уилкоксона для нескольких сравнений.

Используемые данные: 2 набора данных с одинаковой информацией, представляющие две группы участников, выполнили одинаковые 5 задач, что означает, что каждая таблица содержит 5 столбцов (задач) и X строк с оценками задач.

data_17_18_G2  # first data set (in data.table format)
data_18_20_G2  # second data set (in data.table format)

Оба набора данных имеют идентичные имена столбцов, которые должны использоваться в W-тесте следующим образом:

wilcox.test(Group1Task1, Group2Task1, paired = F)
wilcox.test(Group1Task2, Group2Task2, paired = F)

и так далее. Входные данные (например, Grou1Task1) представляют собой два вектора оценок заданий (первый будет из data_17_18_G2, а другой из data_18_20_G2

Желаемый результат: таблица данных со столбцом p-значений. Проблема, с которой я столкнулся в том, что независимо от того, как я манипулировал пустыми объектами val1 и val2, во второй и третьей строках правильный размер «as.numeri c (unlist (data_17_18_G2 [, ..i]))» дает правильный вывод (a цифра c вектор) но его левый размер "val1 [i]" всегда возвращает только одно значение из вектора. Это дало мне представление о том, что главная проблема возникла на этапе создания пустого вектора, однако я не был способен решить эту проблему.

Пустые объекты:

result <- data.table(matrix(ncol=2))
val1 <- as.numeric() # here I also tried functions "numeric" and "vector" 
val2 <- as.numeric()
res <- vector(mode = "list", length = 7)

Для l oop

for (i in 1:5) {
  val1[i] <- as.numeric(unlist(data_17_18_G2[ , ..i]))  
  val2[i] <- as.numeric(unlist(data_18_20_G2[ , ..i]))
  res[i] <- wilcox.test(val1[i], val2[i], paired = F)
  result[i, 1] <- i
  result[i, 2] <- res$p.value
}

Вывод:

Error in `[<-.data.table`(`*tmp*`, i, 2, value = NULL) :
  When deleting columns, i should not be provided

1: В val1[i] <- as.numeric(unlist(data_17_18_G2[, ..i])) :
  number of items to replace is not a multiple of replacement length
2: В val2[i] <- as.numeric(unlist(data_18_20_G2[, ..i])) :
  number of items to replace is not a multiple of replacement length
3: В res[i] <- wilcox.test(val1[i], val2[i], paired = F) :
  number of items to replace is not a multiple of replacement length

Альтернатива: Я изменил вторую и третью строки

for (i in 1:5) {
  val1[i] <- as.numeric(data_17_18_G2[ , ..i])
  val2[i] <- as.numeric(data_18_20_G2[ , ..i])
  res[i] <- wilcox.test(val1[i], val2[i], paired = F)
  result[i, 1] <- i
  result[i, 2] <- res$p.value
}

и получил это

Error in as.numeric(data_17_18_G2[, ..i]) :
(list) object cannot be coerced to type 'double'

, что означает, что функция wilcox.test не может интерпретировать этот тип ввода.

Как я могу улучшить код, чтобы получить таблицу данных р-значение?

1 Ответ

0 голосов
/ 27 марта 2020

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

## use the cars dataset as a example (change with appropriate data)
data(cars)

data_17_18_G2  <- as.data.table(cars)
data_18_20_G2  <- data_17_18_G2[,2:1]

## Fixed code

result <- data.table(matrix(as.numeric(), nrow=ncol(data_17_18_G2), ncol=2))
val1 <- as.numeric() 
val2 <- as.numeric()
res <- vector(mode = "list", length = 7)

for (i in 1:ncol(data_17_18_G2)) {
  val1 <- as.numeric(unlist(data_17_18_G2[ , ..i]))  
  val2 <- as.numeric(unlist(data_18_20_G2[ , ..i]))
  res[[i]] <- wilcox.test(val1, val2, paired = F)
  result[i, 1] <- as.numeric(i)
  result[i, 2] <- as.numeric(res[[i]]$p.value)
}

Надеюсь, это даст вам результат, к которому вы стремитесь.

...