Как использовать «если» для преодоления данных по существу постоянная ошибка в г? - PullRequest
0 голосов
/ 01 ноября 2019

Мне нужно сравнить уровень экспрессии бактериальных генов между контрольными образцами и образцами заболевания. У меня есть большой набор данных, который был прочитан R. Он содержит 58 000 строк, представляющих разные гены, и 6 столбцов. Первые три столбца представляют значения в контроле, а остальные три - от больных пациентов.

Данные представляют собой матрицу, и все значения являются числовыми.

Я новичок в R, и я пытаюсь выяснить, как включить «если» для предотвращения ошибки «данные по существу постоянны», что, как я предполагаю, происходит из-за большой экспрессии геновзначения одинаковы как для заболевания, так и для контрольной группы (некоторые значения экспрессии гена также равны 0 в обеих группах).

Код, который я использую, выглядит следующим образом:

pvalues <- apply(finalgenecount, 1, function(currRow)
    { t.test(currRow[4:6], currRow[1:3])$p.value } )

Мне нужно выяснить, какие гены наиболее распространены в борьбе с болезнью, и собирался использовать разбор, чтобы определить, какиегены увеличиваются в группе заболеваний на основе значений из приведенного выше кода.

Я изо всех сил стараюсь правильно указать «если», чтобы преодолеть мою ошибку.

Пожалуйста, дайте мне знать, если у вас естькакие-либо предложения. Спасибо

точное сообщение об ошибке:

Error in t.test.default(currRow[4:6], currRow[1:3]) : 
  data are essentially constant is the error message.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Кажется, вы применяете t.test к двум векторам, по два триплета на строку. Если у любого набора есть 3 равных значения, он выдает ошибку.

Без ваших данных трудно вручную найти хорошее решение, но вы можете выбрать только те строки, в которых эти два набора элементов 1: 3 и 4: 6 имеют, по крайней мере, один элемент, отличающийся друг от друга.

selection_vector <- !(
finalgenecount[1,] == finalgenecount[2,] | 
finalgenecount[1,] == finalgenecount[3,] | 
finalgenecount[2,] == finalgenecount[3,] | 
finalgenecount[4,] == finalgenecount[5,] | 
finalgenecount[4,] == finalgenecount[6,] | 
finalgenecount[5,] == finalgenecount[6,]
) 

По сути, вам нужно использовать только строку, в которой ни одно из значений не соответствует ни одному из установленных множеств. Следовательно "!"отменить логическую проверку в любых случаях, когда пара столбцов в любом наборе имеет значение true. Можно сделать этот фильтр другими способами, но этот метод не требует никаких пакетов.

pvalues <- apply(finalgenecount[selection_vector ,], 1, function(currRow)
  {
  t.test(currRow[4:6], currRow[1:3])$p.value})
0 голосов
/ 01 ноября 2019

Я считаю, что лучший способ решить эту проблему - написать функцию отдельно, а затем использовать функцию apply.

Сначала у нас есть данные представлений.

dat <- structure(c(37L, 1L, 187L, 97L, 162L, 16L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 
                   0L, 3L, 6L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
                   0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
                 .Dim = c(6L, 6L), 
                 .Dimnames = list( c("gene1_36040_cov_12.4365_1", 
                                     "gene2_36040_cov_12.4365_3", 
                                     "gene3_32139_cov_10.3119_1", 
                                     "gene4_32139_cov_10.3119_2", 
                                     "gene5_32139_cov_10.3119_3", 
                                     "gene6_27992_cov_10.5976_1" ), 
                                   c("SRR527345", "SRR527312", "SRR527312", 
                                     "SRR52324", "SRR525625", "SRR53526")))

Затеммы разрабатываем функцию, которая проверяет 4-6 ряды снова 1-3 ряд. Если t-тест не пройден, он выдаст NA, а не ошибку.

you_function <- function(currRow){

  res <- try(t.test(currRow[4:6], currRow[1:3])$p.value)

  if(grepl(pattern = "Error", x = res)){ 
    return(NA)
  } else {
    res
  }

}

Эта функция использует try, который возвращает ошибку в случае сбоя функции и результат, если есть результат. Теперь вы можете применить эту функцию

out <- apply(dat, 1,you_function )

Мы также назовем этот новый вектор на основе имен столбцов в данных.

names(out) <- colnames(dat)

out

Что даст нам:

SRR527345 SRR527312 SRR527312  SRR52324 SRR525625  SRR53526 
0.3923287 0.4226497 0.4134629 0.3881068 0.4226497 0.4226497 

Теперь мы можем добавить порог и возвращать только те имена генов, которые соответствуют некоторому порогу. Поскольку вышеприведенные значения в основном> .4, я установлю порог этого уровня в иллюстративных целях. Если вы хотите снизить порог до 0,05, вы можете.


p_thresh <- 0.4

names(out)[out <= p_thresh]

, что даст нам:

[1] "SRR527345" "SRR52324" 

Тестирование на «плохих» данных, где повторяется одно и то же значение, выглядитследующее:

bad <- matrix(rep(1, 36), ncol = 6)

out <- apply(bad, 1,you_function )

out

Что выводит следующее. Вы все равно получите сообщение, но


[1] NA NA NA NA NA NA

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