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

Я использую одни и те же варианты кода тепловой карты для создания тепловых карт уже несколько месяцев без каких-либо проблем, но в последнее время он перестал кластеризовать строки. Столбцы по-прежнему группируются, как обычно, но всякий раз, когда я пытаюсь добавить кластеризацию строк, я получаю то же сообщение об ошибке о 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 в приведенное выше. Я в тупике, почему это работало отлично, а теперь нет, когда, насколько я знаю, я ничего не изменил в том, как я вводил свои данные.

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


person paige    schedule 27.04.2020    source источник
comment
один раз между 2 рядами не получится, нет полных наблюдений   -  person StupidWolf    schedule 28.04.2020
comment
как эта диаграмма (матрица (c (NA, 1, NA, 2,3, NA), ncol = 3))   -  person StupidWolf    schedule 28.04.2020
comment
@StupidWolf Я не понимаю? Я использовал этот точный код с несколькими другими наборами данных, заполненными NA, и у меня никогда не было проблем с отсутствующими данными. Во всех моих строках есть › 2 выборки с z-значениями, и ни одна из них не имеет нулевой дисперсии.   -  person paige    schedule 28.04.2020
comment
Вы проверили пример, который я привел? Вы можете видеть, что невозможно рассчитать расстояние. проверка › 2 образцов и т. д. не гарантирует этого   -  person StupidWolf    schedule 28.04.2020
comment
@StupidWolf Да, но в примере недостаточно значений для расчета расстояний, тогда как в моем случае их должно быть много?   -  person paige    schedule 28.04.2020
comment
это более представительно и работает? pheatmap(matrix(c(NA,1,2,4,NA,2,3,1,NA),ncol=3))   -  person paige    schedule 28.04.2020
comment
пока есть одна пара, которую вы не можете вычислить, это выдает ошибку. В своем коде вы ничего не сделали для проверки того, что я только что сказал. это моя точка зрения. хорошо, сделай это, table(is.na(dist(protdata))))   -  person StupidWolf    schedule 28.04.2020
comment
привет @paige, если вы можете предоставить ссылку на данные. Я могу проверить это для вас, какие строки вызывают проблему. таким образом, это спасает от недопонимания   -  person StupidWolf    schedule 28.04.2020
comment
@StupidWolf извините, я так запутался! вот ссылка на один набор данных github.com/bosschard/peet_protdata   -  person paige    schedule 29.04.2020
comment
Не волнуйтесь. спасибо, что поделились данными. Я взглянул. Есть около 60 строк, которые дают проблемы для попарных евклидовых расстояний... мы можем сначала удалить их, чтобы вы могли построить   -  person StupidWolf    schedule 29.04.2020
comment
Хорошо, я сделал быстрый расчет .. удаление 14 из них будет работать, я могу написать это ниже как ответ, и вы увидите, имеет ли это смысл   -  person StupidWolf    schedule 29.04.2020


Ответы (2)


Я преобразовал ваш файл в 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)

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

person StupidWolf    schedule 28.04.2020
comment
Круто, я только что попробовал это на паре других моих наборов данных, которые тоже не работали, и теперь все они работают! Спасибо, что нашли время, чтобы помочь с этим! - person paige; 29.04.2020
comment
прохладно. нет проблем .. да, извините, было немного сложно объяснить проблему словами. рад, что вы смогли преодолеть разочарование от заговора :) - person StupidWolf; 29.04.2020

Вам нужно будет удалить свои NA перед вызовом pheatmap (изменив здесь на нули)

mat[is.na(mat)] = 0

pheatmap(mat)
person LiveLongandProsper    schedule 08.09.2020
comment
Это не работает со всеми нулями и не отражает данные (ноль на самом деле не ноль, просто слишком низкий для обнаружения), поэтому мне пришлось в первую очередь преобразовать их в NA. - person paige; 03.11.2020