【问题标题】:Plotted envfit vectors not matching NMDS scores绘制的 envfit 向量与 NMDS 分数不匹配
【发布时间】:2019-12-11 16:40:00
【问题描述】:

我制作了一个 NMDS 图并绘制了我的 envfit,如下所示

mytable 的数据框

sites=c("Site A","Site B","Site C","Site D","Site E","Site F","Site 
G","Site H","Site I","Site J","Site K","Site L","Site M","Site N","Site O","Site P","Site Q","Site R","Site S","Site T","Site U")
american.elm=c(41.91,10.11,2.62,5.31,7.51,9.72,17.44,9.06,19.83,30.81,62.6,21.29,20.7,28.68,27.69,34.89,35.65,3.87,12.68,1.58,2.97)
white.birch=c(7.07,15.89,26.77,15.61,14.59,6.33,2.23,11.66,21.49,20.15,7.61,23.29,0,0,0,0,0,0,0,56.09,42.34)
red.oak=c(0,0,0,0,0,0,0,0,0,0,0,6.02,0,0,0,0,0,0,0,0,0.05)
populus.grand=c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.11,0)
beech=c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.36,5.45)
sugar.maple=c(0.49,2.64,3.35,4.6,3.37,2,1.32,4.21,4.13,3.61,0.34,1.2,0,0,0,0,0,0,0,2.19,0.09)

mytable <- data.frame(sites,american.elm,red.oak,populus.grand,beech,sugar.maple)
mytable<-mytable[,2:ncol(mytable)]

然后

library(vegan)

mytable.NMDS=metaMDS(mytable, distance = "jaccard", k = 4, trymax = 2000, autotransform=FALSE)

plot.mytable<-data.frame(mytable.NMDS$points)
plot.mytable
par(mar=c(3,3,2,5) ,mgp=c(1.8,0.75,0))
plot(plot.mytable$MDS1, plot.mytable$MDS2, pch=16, cex=1, col="black",
     xlab="NMDS1", ylab="NMDS2", cex.lab=1, cex.axis=1, main="", bty="L",
     mai=c(0,0,2,10), xlim=c(-1.5,1.3), ylim=c(-0.9,1))

fit <- envfit(mytable.NMDS, mytable, choices=c(1,2,3))
fit.plot = plot(fit, cex=1.3, col="red", xlim=c(-1.5,1.3), ylim=c(-1.2,1.2),
                xlab="NMDS1",ylab="NMDS2")

这是树木的 NMDS 分数

fit
# Table of the NMDS score of the trees
Trees=c("american.elm","red.oak","populus.grand","beech","sugar.maple")
Tree.NMDS1=c(-0.76538,-0.1533,0.36065,0.25411,0.49583)
Tree.NMDS2=c(-0.27961,0.06605,-0.51345,-0.79497,0.84299)
Tree.NMDS.scores=data.frame(Trees,Tree.NMDS1,Tree.NMDS2)
# Overlay the NMDS score on the plot
points(Tree.NMDS.scores$Tree.NMDS1,Tree.NMDS.scores$Tree.NMDS2,
       col="red", pch=16)

我想知道为什么矢量箭头的末端与envfit()函数给出的NMDS分数不匹配?

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。

标签: r vegan


【解决方案1】:

您在表中看到的值是用于将向量投影到排序中的线性回归的归一化系数。这些是单位长度箭头的方向。绘制时,我们通过它们相关性的平方根来缩放这些箭头。因此,相关性较小的箭头用比相关性更强的箭头更短的箭头表示。您可以使用scores() 方法获得这些缩放的箭头长度:

> scores(fit, "vectors")
                    NMDS1       NMDS2      NMDS3
american.elm  -0.73129278 -0.26985224 -0.5479775
red.oak       -0.06624995  0.03042562  0.4270764
populus.grand  0.21774166 -0.31045377  0.4862402
beech          0.22772624 -0.70982231  0.4990966
sugar.maple    0.33541356  0.56604306 -0.1245767

但请注意,这些也不是图中箭头的实际坐标。由于这些只是简单的方向,即使我们已经通过它们与坐标轴的相关性来缩放各个箭头的长度,我们也可以将所有箭头缩放相同的量,以使它们更好地填充绘图空间。

这一切都在?envfit 中进行了解释。以下是相关部分:

连续变量(向量)的打印输出给出了 方向余弦,是单元头部的坐标 长度向量。在plot 中,这些按相关性进行缩放 (r2 列的平方根)以便 weak 预测变量具有 比 strong 预测器更短的箭头。你可以看到缩放 使用命令scores 的相对长度。 plotted(和 缩放)箭头进一步调整到当前图表使用 常数乘数:这将保持相对 r2-scaled 箭头的长度,但尝试填充当前绘图。你可以 使用ordiArrowMul(result_of_envfit) 查看乘数,并设置 它带有参数arrow.mul

如果我们遵循我们看到的建议:

> ordiArrowMul(fit)
[1] 1.031244

暗示我们将缩放箭头乘以大约 3%。

> scrs <- scores(fit, "vectors", choices = 1:2)
> scrs * ordiArrowMul(fit)
                    NMDS1      NMDS2
american.elm  -0.73819522 -0.2723993
red.oak       -0.06687526  0.0307128
populus.grand  0.21979686 -0.3133840
beech          0.22987567 -0.7165221
sugar.maple    0.33857942  0.5713858

将所有这些与您的绘图代码放在一起,这就是我们如何到达plot.envfit 绘制的箭头:

plot(mytable.NMDS, display = "sites", type = "n")
points(mytable.NMDS, display = "sites", pch = 19, col = "black")
plot(fit, col = 'red')

## add the locations of arrow heads as blue points to see if the correspond
points(scrs * ordiArrowMul(fit), col = "blue")

这就是我们得到的


请注意我是如何使用现有的 plot 方法和提取器函数(如 scores())来处理 vegan 生成的对象并从组成部分构建图的。以这种方式做事可以避免您 i) 必须输入您已经可用的信息,以及 ii) 当我们更改纯素对象的内部表示或内部存储的值实际上是需要后续转换/处理的工作数据时被咬产生有效或可解释的值。尽可能避免使用$ 在对象中翻找。

【讨论】:

  • 非常感谢您花时间这么清楚地解释这一点!
猜你喜欢
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多