Skip to content

「中文」常见报错信息原因及解决办法

Shawn Wang edited this page May 23, 2022 · 7 revisions

数据清洗部分

报错信息01:

wrong sign in 'by' argument
'by'参数的正負號不对

原因: 主要原因是在Reserved genes Num.选项中你填写的保留基因数目大于了第一步去噪音后基因的总数。比如你的输入矩阵中共有10000个基因,第一步去噪音之后剩下了8000个,但是你这里仍然选择了10000甚至更多会造成这个报错,起始可以写一个判断如果这个值大于了第一步筛选的结果自动保留筛选结果那么多。后续可能会加上。

解决方法: 填写更小的Reserved genes Num

软阈值部分

【下个版本解决】报错信息 01 思考了几分钟,把nSamples赋值加上了 下版本更新,但同时得不到合适sft的要注意了。

找不到对象'nSamples'

问题已解决: 新代码里添加了如果没有合适的power会自动使用推荐的阈值。

原因: 有人说你找不到对象,那肯定是你的原因... 其实一般这种情况的出现是R2 cutoff设置的太高了! 当你的表达矩阵有强烈的样品异质性或者批次效应,甚至有些老铁拿差异基因来做的时候往往可能出现R2到达不了默认的0.8,这也就意味着你即使做出来了,构建的网络也很难形成一个无尺度网络。这时你可以选择对表达矩阵前处理的调参,比如不要直接用FPKM改为log(FPKM),或者换成readcount用VST标准化,再或者灵活调整去噪音的阈值,比如30%的样品FPKM大于0.5之类的,看数据能否抢救一下。如果实在抢救不过来,就把R2 cutoff调低,比如0.3, 0.5之类的,让代码继续往后跑,但是这个做到模块划分,模块-性状关联就到此为止了,因为你的模块不符合无标度的特征,再往后去看什么hubgene,共表达网络也是自欺欺人的,你就把这个结果当做高阶hclust或者k-means的方法去研究。比如你输入的表达矩阵中有多种组织,毋庸置疑,不同组织之间的差异是要远远大于同组织不同品种之间的差异的,所以这个结果即使做出来反映的也是不同组织之间的差异。那么你按照组织对sample进行分组关联,就可以得到一个module-tissue关联的关系,那么与tissue极显著相关的模块内的基因很可能就是组织特异表达的基因。

代码实现方面理解,这是个历史遗留问题,因为我在OneStepWGCNA版本中加入了如果没有合适的power会启用下面的方法筛选经验阈值

  ## exper power
  if (is.na(power)){
    power = ifelse(nSamples<20, ifelse(type == "unsigned", 9, 18),
                   ifelse(nSamples<30, ifelse(type == "unsigned", 8, 16),
                          ifelse(nSamples<40, ifelse(type == "unsigned", 7, 14),
                                 ifelse(type == "unsigned", 6, 12))
                   )
    )
  }

然而给我的感觉这些经验阈值并不是很好用,所以就没有启用,当然主要是忘了删... 这里面有个变量nSample我在新的版本中并没有给nSample赋值,所以当没有合适的power的时候会自动跑这个获取经验阈值的代码,然后nSample又没有被赋值,所以报错找不到对象nSample.... 这个在后续会改掉。到底要不要保留经验阈值.. 我再考虑一下

解决方法: 上面说了建议以下几方面:

  1. 重新考虑你所研究的生物学问题,你输入的表达矩阵到底包含了多少种差异,主要矛盾是谁,WGCNA真的可以解决你关注的生物学问题吗?
  2. 对表达矩阵的过滤调参,不断尝试。
  3. 调低 R2 cutoff

模块-网络部分

模块-性状stage

报错信息 01

Error in data.frame: duplicate 'row.names' are not allowed
row.names有重复

原因: 结合之前OneStepWGCNA的反馈和这次WGCNAshiny的反馈,这里出现这种报错原因就是你traitdata中材料名称出现了重复,一种是人为不小心写错了确实重复了,而更多的情况是很多人在制作traitdata文件时基本是在excel中做的,然后选取制作好的几列复制粘贴到其他软件保存,或者保存成tab分割的txt。但是有时候会不知不觉的多敲了几行空行,或者空白的单元格。在R读取文件的时候这些空白同样会读取到R中,read.table中确实有忽略空白行的参数,但是我不打算在这里做防呆,因为输入文件一定要谨慎遵守规则,最好提醒使用者多检查几次inputdata,防止格式的错误导致最后的分析错误,这种结果使用者大概率会把锅甩给软件。所以....😂

解决方法: 在你用excel生成traitdata之后,强烈建议只框选有用信息部分的单元格复制出来,然后用sublime text,editplus等软件(当然你用那个什么++我也没意见,只是我个人不喜欢)新建一个空白文档,粘贴进去保存成txt.

Interested module stage

提取HubGene阶段

问题 01

有些小伙伴已经发现当module-trait相关性较低的情况下(低于0.6)去找对应的hubgene,会发现找到的hubgene不在对应的模块。
罪魁祸首是万恶的屎山代码,最开始跑WGCNA流程直接CP大佬们的代码,当时年轻看不太懂就直接抄了。看下怎么出错的:

# 选择模块和性状
  which.module = mdl
  which.trait = datTrait %>%
    select(trt);
#计算gene significance相关性 datExpr为所有基因的表达矩阵
  GS1 = as.numeric(cor(which.trait,datExpr, use="p"))
  GS2=abs(GS1)
  ## MM
  kME.mod = KME.clean %>%
    select(mdl)
  kME.mod.df = data.frame(GeneID = rownames(kME.mod),
                          kME = kME.mod[,1])
  ## judge 判断是也是基于所有基因进行
  hub2 = abs(kME.mod) > kME.cut & GS2 > GS.cut

这里发现在计算GS的时候等于用所有基因都和该性状做了相关。所以后来筛选结果中出现了不属于该模块的基因。但是这个情况一般不会在极高相关的module-trait关系中出现;

后续改正了这个bug,用了tidyvers风格的写法,语句更清晰,也避免出错

hubgenes = function(datExpr,mdl,power,trt,KME,GS.cut,kME.cut,datTrait,g2m) {
  ## changenames
  colnames(KME) = gsub("MM.","",colnames(KME))
  ## hubgene by wgcna
  hubs = chooseTopHubInEachModule(datExpr = datExpr, colorh = net$moduleColors,
                                  power = power, type = "unsigned")
  hub_mdl = hubs[mdl]
  ## calculate GS and MM
  MM_vs_KME = KME %>%
    rownames_to_column("gene_id") %>%
    as_tibble %>%
    mutate(
      GS = as.numeric(cor(datTrait %>% select(trt),datExpr,use = "p")) # 这里仍旧是和所有基因都做相关
    ) %>%
    rename("MM" = mdl) %>%
    select(gene_id,MM,GS) %>%
    mutate(
      abs_MM = abs(MM),
      abs_GS = abs(GS)
    ) %>%
    inner_join(.,g2m,by = c("gene_id" = "GID")) %>%
    filter(Module == mdl) %>% ## 但是这里筛选了一下对应模块,确保你找到的hubgene属于对应模块
    dplyr::arrange(desc(abs_MM))

  hub3 = MM_vs_KME %>%
    filter(abs_MM >= kME.cut & abs_GS >= GS.cut)  ## 加入筛选条件

  hub1 = data.frame(GeneID = as.character(hub_mdl)) %>% left_join(.,MM_vs_KME, by = c("GeneID" = "gene_id") )
  hub_out = list(
    hub1 = hub1,
    hub3 = hub3
  )
}