如何使用素食函数 metaMDS() 实现非默认相异性度量?

How do I implement a non-default dissimilarity metric with vegan function metaMDS()?

我使用 Claddis 函数 MorphDistMatrix() 和距离度量 "MORD"(最大可观察重标距离)从系统发育数据构建了一个距离矩阵。我现在想使用素食函数 metaMDS() 将此差异矩阵用于 运行 NMDS。然而,虽然 metaMDS 有许多距离度量可供选择,但 "MORD" 不是其中之一。如何启用 metaMDS() 以将此指标作为选项?

编辑:这里是一些示例代码:

nexus.data<-ReadMorphNexus("example.nex")

正在读取 Nexus 文件

dist<- MorphDistMatrix(nexus.data, distance = "MORD")

用于创建距离矩阵的 Claddis 命令。我不想使用 Gower 相异性(距离 = "GC"),而是使用最大可观察重新缩放距离(距离 = "MORD"),这是 Gower 的修改形式,用于有序字符(Lloyd 2016 ).到目前为止,一切都很好。

nmds<-metaMDS(dist$DistanceMatrix, k=2, trymax=1000, distance = "GC")

这是我 运行 遇到麻烦的地方:据我了解,用于 metaMDS 命令的距离应该与用于构建距离矩阵的距离相同,但 MORD 不是 "distance" 在 metaMDS 中。如果我要在 Gower 相异性下构建距离矩阵,那将不是问题,因为 metaMDS

中也可以使用

Lloyd, G. T.,2016 年。使用离散字符分类矩阵估计形态多样性和速度:实施、挑战、进展和未来方向。林奈学会生物学杂志, 118, 131-151.

metaMDS 有自变量 distfun 到 select 除了 vegdist 之外的其他相异函数。这样的函数应该接受参数 method 到 select 所使用的差异度量。此外,它应该 return 一个继承自标准 R dist 函数的常规相异对象。我不知道这个 Claddis 包:它是 return 常规差异还是一些特殊的东西?您的示例暗示它 returns 不是常规的 R 对象,而是一些特殊的东西。或者,您可以使用预先计算的差异作为 metaMDS 中的输入。同样,这些应该是常规的差异,就像在任何体面的 R 实现中一样。因此,您需要检查以下内容与您的不同之处:

inherits(dist, "dist") # your dist result: should be TRUE
inherits(dist$DistanceMatrix, "dist") # alternatively this should be TRUE
## if the latter was TRUE, you can extract that with
d <- dist$DistanceMatrix
## if d is not a "dist" object, you can see if it can be turned into one
d <- as.dist(dist$DistanceMatrix)
inherits(d, "dist") # TRUE: OK, FALSE: no hope
## if it was OK, you just do
metaMDS(d)