前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用向量做Mantel的几个问题

用向量做Mantel的几个问题

作者头像
Listenlii-生物信息知识分享
发布2020-09-22 16:32:43
1K0
发布2020-09-22 16:32:43
举报

这几天有读者问我mental计算的几个问题,在此记录一下。

  1. mantel test一般用距离矩阵来计算,vegan的mantel输入只能是距离矩阵。如果想用向量做mantel ,可以用ecodist包做,输入数据可以是向量的形式。
  2. ecodist针对r<=0,r=0,r>=0分别输出了3个P值,不确定用哪个。我测试了一下发现r<=0时对应的P值和vegan中mantel结果的P值是一致的。因此可以用r<=0对应的P值,这也可以反推出vegan中mantel的原假设也是r<=0。 这一点在介绍ecodist的文章中已经添加: R——ecodist&MRM methods
  3. 后来他又发现数据为435行时可以出结果,而当数据为704行的时候会报错: Error in mantel(A ~ B) : Matrix not square.

我测试了一下果然如此。把435随机换成其他几个数也会报错。 这时候开始有点意思了。难道435这个数存在什么特别之处么。 函数说明中没有提到这个报错,我在网上搜了一下也没有找到答案。

那就简单粗暴看函数源代码: https://github.com/cran/ecodist/blob/master/R/mantel.R

其中有这么几句:

代码语言:javascript
复制
1 m <- as.matrix(m)
2 n <- (1 + sqrt(1 + 8 * nrow(m)))/2  
3  if (abs(n - round(n)) > 1e-07) 
4    stop("Matrix not square.\n")

m为输入数据,通过一个公式得到n,将n和其整数部分进行比较,如果不相等则会报这个错。 接下来测试当输入的数据是多少行的时候不会报错:

代码语言:javascript
复制
1 s = c()
2  for (i in 1:1000){
3    n <- (1 + sqrt(1 + 8 * i))/2   
4    if (n - round(n) == 0 ){s = c(s,i)}
5  }
6s
7[1]   1   3   6  10  15  21  28  36  45  55  66  78  91 105 120 136 153 171 190
8[20] 210 231 253 276 300 325 351 378 406 435 465 496 528 561 595 630 666 703 741
9[39] 780 820 861 903 946 990

1000行以内只有44种情况不会报错,其中就有435。 结合这个结果和报错信息,我才突然发现原来输入数据的行数(1,3,6,10…)必须满足可以被转化为对称矩阵中上(或下)三角的形式才会计算结果。如435正好填满29*29的上(下)三角矩阵。其他数字得到的不是对称矩阵,因此会报错:Matrix not square。

所以ecodist用向量计算mantel还是有隐含的前提条件的。

如果数据不方便先转化为矩阵,那只能取特定的行数输入才能算mantel。

点分享

点点赞

点在看

一个环境工程专业却做生信分析的深井冰博士,深受拖延症的困扰。想给自己一点压力,争取能够不定期分享学到的生信小技能,亦或看文献过程中的一些笔记与小收获,记录生活中的杂七杂八。

目前能力有限,尚不能创造知识,只是知识的搬运工。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Listenlii 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档