Ваша проблема в том, что вы делаете гораздо больше сравнений в dist
, чем вы могли подозревать. Вы вычисляете выберите 2, а не выберите 2 сравнения. Возможно, это не то, чего вы хотите, но это делается в коде.
Как отмечает @Roland, большая часть времени проводится в dist
, что также дает понять, что это проблема. Вот пример на моей машине:
data <- replicate(1500, rnorm(200))
system.time(aheatmap(data, dist="correlation"))
user system elapsed
27.69 0.64 28.33
system.time(dist(1 - cor(data))) # A line that is in aheatmap
user system elapsed
21.26 0.02 21.28
dist
функция реализуется с помощью функции C в R, так что можно было бы ожидать, что это будет быстро.
Когда вы запустите cor(data)
, он даст вам матрицу 5000x5000 (или 1500x1500 в моем меньшем тестовом случае), который затем используется dist
. Это означает, что мой компьютер вычисления
choose(1500,2)/21
[1] 53535.71
примерно 53535.71 сравнений в секунду, что довольно быстро, я думаю. Вы не получите большой разницы, если не уменьшите количество сравнений.
Если вы хотите, чтобы остановить вычисления кластеризацию для ваших 5000 столбцов, вы можете передать NA
Colv
к аргументу, как указано в ?aheatmap
.
aheatmap(data,distfun="correlation",Rowv=NA) # No clustering on rows.
aheatmap(data,distfun="correlation",Colv=NA) # No clustering on columns.
Следует отметить, что прохождение FALSE
будет по-прежнему вычислять dendogram (медленная часть), но она не будет отображать его, в то время как NA
не будет даже вычислить dendogram.
Если вы профилируете 'aheatmap', вы увидите, что большую часть времени тратите на' grid.Call.graphics' и 'dist'. Я бы рассмотрел способы агрегирования данных перед построением графика. Выход не выглядит так, как будто это высокое разрешение в тепловой карте. – Roland
@Roland: Я думаю, что dist нужно вычислить 200, выбрать 2 раза, чтобы вычислить все пары ... не уверен, как этого избежать, но я не понимаю, почему вычисления корреляции настолько медленны в R – user248237dfsf