Ошибка R (критерий Фишера): все записи x должны быть неотрицательными и конечными - PullRequest
0 голосов
/ 27 января 2020

Вот мой код ниже:

 d2 <- data.frame(cbind(1:10, sapply(1:4, function(x) { sample(1:25, size = 10, replace = TRUE) })))

 pvals <- rep(0, nrow(d2))

 for (n in 1:nrow(d2)) 
  {
  pvals[n] <- fisher.test(
    matrix(d2[n, 2:5], nrow = 2, ncol = 2, byrow = TRUE)
  )$p.value
  }

Где моя ошибка? Спасибо!

1 Ответ

0 голосов
/ 27 января 2020

В коде ОП нам нужно unlist, чтобы удалить data.frame структуру в vector перед созданием matrix, так как каждая строка извлекается как data.frame

str(d2[1, 2:5])
#'data.frame':  1 obs. of  4 variables:
# $ X2: int 22
# $ X3: int 12
# $ X4: int 19
# $ X5: int 12

, и это создает list, когда мы вызываем matrix

str(matrix(d2[1, 2:5], 2, 2))
#List of 4
# $ : int 22
# $ : int 12
# $ : int 19
# $ : int 12
# - attr(*, "dim")= int [1:2] 2 2

Если мы unlist, структура становится

str(matrix(unlist(d2[1, 2:5]), 2, 2))
#int [1:2, 1:2] 22 12 19 12

Внесение изменений в код ОП

pvals <- rep(0, nrow(d2))
for (n in 1:nrow(d2)) {
   pvals[n] <- fisher.test(
      matrix(unlist(d2[n, 2:5]), nrow = 2, ncol = 2, byrow = TRUE)
     )$p.value
  }

pvals
#[1] 0.80226381499 0.09361771430 0.23302332741 0.00001155306 0.76106849673 0.81049227216 0.14211831663 0.28974696874 0.00140855512
#[10] 0.04810238920

Другой вариант - apply, где мы указываем MARGIN = 1 для циклического перемещения по строке

apply(d2[-1], 1, FUN = function(x) fisher.test(matrix(x, 2, 2, byrow = TRUE))$p.value)
#[1] 0.80226381499 0.09361771430 0.23302332741 0.00001155306 0.76106849673 0.81049227216 0.14211831663 0.28974696874 0.00140855512
#[10] 0.04810238920
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...