有些软件总能以某种方式劝退你 | SpectralTAD 之 TAD calling

序 言

  有些软件总能以某种形式劝退你,让你毫不犹豫的投入其他软件的怀抱,外加产生一种不吐不快的情愫,激发一种唯恐他人也会“遭此毒手”的正义感。软件之所以叫做软件,大抵是因为经过包装与测试,比较成熟且有很大的兼容性,至少按照文档来运行应该不会问题,如果动不动就出错那与脚本何异?
  生信分析软件很大一部都属于小众软件,有些软件也许本身的出发点就是科研与文章,而好不好用能不能让更多的人使用并不重要。遇到这样的软件,那就启用咱们的万能躺平招式:分析软件千千万,不行咱就换一换。同时,对此类软件应该保持敬畏之心,那句话怎么说来着:明知山有虎,猛敲退堂鼓。不然浪费的可是自己宝贵的时间,下面咱就一起来看看今天的主角。

缘 起

  为什么会用到SpectralTAD呢?这都源自于做TAD差异分析时使用的TADCompare软件,关于该软件也写过两篇帖子:[TADCompare:差异TAD分析],[TADCompare 差异分析要留心]。TADCompare分析时可以接受预定于的TAD文件,而软件文档中call TAD用的就是SpectralTAD,这便有了下面的事情。
  SpectralTAD一个专门用于从HiC接触矩阵中做TAD calling的R包,其使用一种基于滑动窗口的改进版光谱聚类方法来快速检测TAD。SpectralTAD将接触矩阵作为输入,并输出BED格式的数据框,其中包含TAD相对应的坐标位置。该工具包含SpectralTADSpectralTAD_Par两个函数,分别为单CPU和多CPU模式。另外,该包接受多种格式,如n × nn × ( n + 3 )、3列等。
  至此,感觉SpectralTAD一切还挺正常,跟着文档代码走一遭才知该软件非常人所能驾驭也,一起来看看怎么回事:

文档示例:


自己测试:

devtools::install_github("dozmorovlab/SpectralTAD")
library(SpectralTAD)

data("rao_chr20_25_rep")
tads = SpectralTAD(rao_chr20_25_rep, chr = "chr20", levels = 2, qual_filter = FALSE)
Converting to n x n matrix
Matrix dimensions: 2517x2517
Error in `vec_init()`:
! `x` must be a vector, not `NULL`.
Run `rlang::last_trace()` to see where the error occurred.
Warning messages:
1: Unknown or uninitialised column: `Group`.
2: Unknown or uninitialised column: `Group`.

  这错误来的触不及防,也让人有点摸不到头脑。咋滴,这软件还认人不成?当然,软件不可能因人而异,但会因环境而异。经过一番倒腾,发现下面这一段代码:

else {
    gap_order = order(-point_dist)
    sil_score = c()
    for (cluster in clusters) {
        k = 1
        partition_found = 0
        first_run = TRUE
        cutpoints = c()
        while (partition_found == 0) {
          new_gap = gap_order[k]
          cutpoints = c(cutpoints, new_gap)
          diff_points = which(abs(new_gap - cutpoints[-length(cutpoints)]) <=
            min_size)
          if (length(diff_points) > 0) {
            cutpoints = cutpoints[-length(cutpoints)]
          }
          if (length(cutpoints) == cluster) {
            partition_found = 1
          }
          else {
            k = k + 1
          }
        }
        if (any(is.na(cutpoints))) {
          next
        }
        cutpoints = cutpoints[order(cutpoints)]
        cutpoints = c(1, cutpoints, length(non_gaps_within) +
          1)
        group_size = diff(cutpoints)
        memberships = c()
        for (i in seq_len(length(group_size))) {
          memberships = c(memberships, rep(i, times = group_size[i]))
        }
        sil = summary(cluster::silhouette(memberships,
          dist_sub))
        sil_score = c(sil_score, sil$si.summary[4])
        Group_mem[[cluster]] = memberships
    }
    end_group = Group_mem[[which(diff(sil_score) < 0)[1]]]
    if (length(end_group) == 0) {
        end_group = dplyr::bind_rows()
    }
    else {
        end_group = data.frame(ID = as.numeric(colnames(sub_filt)),
          Group = end_group)
        end_group = end_group %>% dplyr::mutate(group_place = Group) %>%
          dplyr::group_by(group_place) %>% dplyr::mutate(Group = max(ID)) %>%
          ungroup() %>% dplyr::select(ID, Group)
    }
}
if (end == nrow(cont_mat)) {
    Group_over = dplyr::bind_rows(Group_over, end_group)
    end_loop = 1
}
else {
    end_IDs = which(end_group$Group == last(end_group$Group))
    start = end - length(end_IDs) + 1
    if (length(start) == 0) {
        start = end
    }
    end = start + window_size
    end_group = end_group[-end_IDs, ]
    Group_over = dplyr::bind_rows(Group_over, end_group)
    if ((end + (2e+06/resolution)) > nrow(cont_mat)) {
        end = nrow(cont_mat)
    }
}

  运行文档的代码之所以出错是由于end_group没有结果,dplyr::bind_rows(Group_over, end_group)合并数据时引发了错误,也由此找到了相关联的参数min_size

tads = SpectralTAD(rao_chr20_25_rep, chr = "chr20", levels = 2, qual_filter = FALSE, min_size=4)
Error in `vec_init()`:
! `x` must be a vector, not `NULL`.
Run `rlang::last_trace()` to see where the error occurred.
Warning messages:
1: Unknown or uninitialised column: `Group`.
2: Unknown or uninitialised column: `Group`.

tads = SpectralTAD(rao_chr20_25_rep, chr = "chr20", levels = 2, qual_filter = FALSE, min_size=3)
Error in `vec_init()`:
! `x` must be a vector, not `NULL`.
Run `rlang::last_trace()` to see where the error occurred.
Warning messages:
1: Unknown or uninitialised column: `Group`.
2: Unknown or uninitialised column: `Group`.

tads = SpectralTAD(rao_chr20_25_rep, chr = "chr20", levels = 2, qual_filter = FALSE, min_size=2)
 head(tads$Level_1)
# A tibble: 6 × 4
  chr     start     end Level
  <chr>   <dbl>   <dbl> <dbl>
1 chr20   50000  325000     1
2 chr20  325000  525000     1
3 chr20  525000  775000     1
4 chr20  775000 1200000     1
5 chr20 1200000 1450000     1
6 chr20 1450000 1775000     1

  当自以为可以正常运行时,软件又告诉你没那么简单。帮助信息中虽提示可以通过out_format参数修改输出格式:juiceboxbedpehicexplorerbed,但是一运行又掉入另外一个坑:

tads = SpectralTAD(rao_chr20_25_rep, chr = "chr20", levels = 2, qual_filter = FALSE, min_size=2, out_format='juicebox')
New names:
• `chr` -> `chr...1`
• `start` -> `start...2`
• `end` -> `end...3`
• `chr` -> `chr...4`
• `start` -> `start...5`
• `end` -> `end...6`
Error in `mutate()`:
ℹ In argument: `start = format(start, scientific = FALSE)`.
Caused by error:
! `start` must be size 1709 or 1, not 14.

  算了,真心累了,不再折腾了,这个时候只想对软件说一句:就此别过,后会无期!

结 语

  分析时还是挑知名度好,出场率高的软件吧,毕竟这样的软件更加成熟,即使出了问题也能快速找到相应的解决办法,用不着花费大量的时间在软件上面。除非没有更好的选择,否则还是不要啃硬骨头的好,不然时间浪费不说还可能消化不良,不如一开始就避而远之。
  当然,不可否认,造成软件无法正常运行的原因很可能是与开发者的环境不同。所以,分析时使用软件更多的时候都是在与软件的环境和参数作斗争,躺不平的时候还要支棱起来:生信路不平,还需要缝缝补补。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容