Pheatmap не будет кластеризовать строки: NA / NaN / Inf при вызове сторонней функции (аргумент 10) - PullRequest
0 голосов
/ 28 апреля 2020

Я использовал те же самые варианты кода pheatmap для создания тепловых карт в течение нескольких месяцев без каких-либо проблем, но в последнее время он перестал иметь возможность кластеризовать строки. Столбцы по-прежнему кластеризуются как обычно, но всякий раз, когда я пытаюсь добавить кластеризацию строк, это выдает мне одно и то же сообщение об ошибке NA / NaN / Inf в данных

Все мои наборы данных выглядят очень похожими, в основном только с количеством строк меняется (между 40-2000 и более). Вот глава данных, которые я сейчас использую, все 0 уже заменены на NA:

> head(protdata, 4)
          PR1      PO1      WA1     PR2      PO2      WA2      PR3      PO3     WA3      PR4 PO4     WA4      PR5      PO5
[1,] 0.004420       NA 0.002370 0.00141 0.002890 0.003740 4.36e-03 0.005370 0.00143 0.002070  NA 0.00428 0.005220       NA
[2,] 0.000233 8.85e-06 0.000136      NA 0.000056 0.000713 5.98e-05       NA      NA 0.000541  NA      NA 0.006700 4.95e-05
[3,] 0.001220 1.79e-05 0.000447 0.00183 0.000136       NA 6.99e-04 0.000298 0.00267 0.001330  NA      NA 0.000655 1.36e-04
[4,] 0.001170 6.84e-04 0.000282 0.00173 0.001620 0.000648 1.05e-03 0.003570 0.00101 0.001410  NA      NA 0.002960       NA
          WA5     PR6      PO6      WA6      PR7      PO7      WA7
[1,] 0.001030 0.00448       NA 1.53e-03 0.005220 0.005520 1.86e-03
[2,] 0.000139 0.00145 0.000484 8.88e-05 0.000118 0.000122 1.79e-05
[3,] 0.003680 0.00033       NA       NA       NA 0.000163 3.99e-03
[4,] 0.000393 0.00023       NA       NA 0.000625       NA 7.15e-04

В наборах данных много нулей, но кластеризация всегда работала, пока они преобразуются в NA. Ни один из столбцов или строк не имеет нулевой дисперсии. Вот код, который я использовал для создания тепловых карт:

protdata <- as.matrix(input[,-1])
protdata[protdata == 0] <- NA

rownames <- input[,1]
annotation_row <- data.frame(rownames)
rownames(protdata) <- annotation_row$Gene

pheatmap(log10(protdata), scale="row", border_color=NA, na_col="white", breaks=seq(-2,2,.01),
     color=colorRampPalette(rev(brewer.pal(n=7, name="RdYlBu")))(400))

А вот сообщение об ошибке, которое я получаю:

Error in hclust(d, method = method) : 
  NA/NaN/Inf in foreign function call (arg 10)

Единственный способ получить сюжет, чтобы появиться с cluster_rows=FALSE, включенным в выше. Я озадачен тем, почему это работает отлично, а теперь нет, когда, насколько я знаю, я ничего не изменил в способе ввода данных.

Любая помощь будет принята с благодарностью !!

1 Ответ

0 голосов
/ 29 апреля 2020

Я преобразовал ваш файл в csv и прочитал:

mat = read.csv("peet_protdata.csv",row.names=1)
mat[mat==0] = NA

Нет строк со всеми NA или нулевой дисперсией, как вы сказали, но если вы выполните вычисления dist, в некоторых из них есть NA. записей, указывающих между рядами, невозможно рассчитать евклидовы расстояния. Вам нужна евклидова матрица расстояний, чтобы не было NA для кластеризации:

 sum(is.na(as.matrix(dist(mat))))
[1] 434

Ниже приведен быстрый (неприятный) бит, чтобы найти строки, содержащие наибольшее число NA, удалите их, чтобы получить полную матрицу расстояний. :

giveNAs = which(is.na(as.matrix(dist(mat))),arr.ind=TRUE)
head(giveNAs)
    row col
G103  18   1
G100  53   1

Так, например, строки 18 и 1 создают проблемы, и вы можете видеть, что нет полных наблюдений (попарно):

mat[c(1,18),]
     PR1 PO1 WA1         PR2 PO2 WA2         PR3 PO3 WA3         PR4
G56   NA  NA  NA 0.000483209  NA  NA 0.000433088  NA  NA 0.000203604
G103  NA  NA  NA          NA  NA  NA          NA  NA  NA          NA
             PO4         WA4         PR5        PO5 WA5 PR6 PO6 WA6 PR7
G56  0.000294898 0.000269724 0.000299341 0.00046987  NA  NA  NA  NA  NA
G103          NA          NA          NA         NA  NA  NA  NA  NA  NA
             PO7         WA7         PR8 PO8 WA8         PR9         PO9 WA9
G56  0.000682594 0.000656168 0.000702988  NA  NA          NA          NA  NA
G103          NA          NA          NA  NA  NA 0.000629987 0.000504159  NA

Мы получаем строки и начинаем проверять, что удалить:

tab = sort(table(c(giveNAs)),decreasing=TRUE)
checkNA = sapply(1:length(tab),function(i){
sum(is.na(as.matrix(dist(mat[-as.numeric(names(tab[1:i])),]))))
})
rmv = names(tab)[1:min(which(checkNA==0))]

 [1] "18"  "53"  "81"  "84"  "54"  "97"  "55"  "38"  "70"  "100" "31"  "93" 
[13] "52"  "80"  "91"

Мы удаляем эти 15 строк:

mat = mat[-as.numeric(rmv),]
pheatmap(mat)

enter image description here

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