我正在尝试使用素食主义者的capscale
函数来显示距离矩阵。但是,我发现我不能,因为它在使用特定距离度量(“gower”距离)时只返回一个轴,我不明白为什么会这样。
library(vegan)
#> Warning: package 'vegan' was built under R version 3.4.3
#> Loading required package: permute
#> Loading required package: lattice
#> This is vegan 2.4-5
sp1 <- c(3, 3, 0, 0, 0)
sp2 <- c(0, 3, 0, 0, 1)
sp3 <- c(0, 0, 3, 3, 1)
sp4 <- c(0, 0, 0, 3, 1)
sp5 <- c(0, 2, 0, 0, 1)
sp6 <- c(0, 2, 0, 0, 1)
sp7 <- c(0, 0, 0, 1, 1)
sp8 <- c(0, 0, 0, 2, 1)
sp_mat <- rbind(sp1, sp2, sp3, sp4,
sp5, sp6, sp7, sp8)
colnames(sp_mat) <- letters[1:5]
sp_gow <- vegdist(sp_mat, method = "gower")
capscale(sp_gow ~ 1)
#> Call: capscale(formula = sp_gow ~ 1)
#>
#> Inertia Rank
#> Total 0.6489
#> Unconstrained 0.6489 1
#> Inertia is squared Gower distance
#>
#> Eigenvalues for unconstrained axes:
#> MDS1
#> 0.6489
即使距离矩阵具有我们期望的维度,也会发生这种情况:
sp_gow
#> sp1 sp2 sp3 sp4 sp5 sp6
#> sp2 0.40000000
#> sp3 1.00000000 0.60000000
#> sp4 0.80000000 0.40000000 0.20000000
#> sp5 0.46666667 0.06666667 0.53333333 0.33333333
#> sp6 0.46666667 0.06666667 0.53333333 0.33333333 0.00000000
#> sp7 0.66666667 0.26666667 0.33333333 0.13333333 0.20000000 0.20000000
#> sp8 0.73333333 0.33333333 0.26666667 0.06666667 0.26666667 0.26666667
#> sp7
#> sp2
#> sp3
#> sp4
#> sp5
#> sp6
#> sp7
#> sp8 0.06666667
使用不同的距离测量,它可以正常工作:
sp_gow <- vegdist(sp_mat, method = "bray")
capscale(sp_gow ~ 1)
#> Call: capscale(formula = sp_gow ~ 1)
#>
#> Inertia Eigenvals Rank
#> Total 1.453564 1.456806
#> Unconstrained 1.453564 1.456806 5
#> Imaginary -0.003243 1
#> Inertia is squared Bray distance
#>
#> Eigenvalues for unconstrained axes:
#> MDS1 MDS2 MDS3 MDS4 MDS5
#> 1.1350 0.2578 0.0552 0.0087 0.0001
答案 0 :(得分:1)
没有约束,capscale
产生无约束的主坐标分析。但是,它使用函数wcmdscale
而不是cmdscale
来进行计算,这两个函数在处理低特征值方面有所不同。使用您的数据:
> cmdscale(sp_gow, eig = TRUE)
$points
[,1] [,2]
sp1 -0.5666667 1.497751e-08
sp2 -0.1666667 -4.315554e-09
sp3 0.4333333 1.122044e-08
sp4 0.2333333 6.041776e-09
sp5 -0.1000000 -2.589333e-09
sp6 -0.1000000 -2.589333e-09
sp7 0.1000000 2.589333e-09
sp8 0.1666667 4.315554e-09
$eig
[1] 6.488889e-01 4.440892e-16 2.610151e-17 1.676474e-17 8.672740e-19
[6] 6.523746e-19 -1.829633e-33 -1.316088e-17
将此与wcmdscale
:
> wcmdscale(sp_gow, eig = TRUE)
Call: wcmdscale(d = sp_gow, eig = TRUE)
Inertia Rank
Total 0.6489 1
Results have 8 points, 1 axes
Eigenvalues:
[1] 0.6489
Weights: Constant
> scores(wcmdscale(sp_gow, eig = TRUE))
Dim1
sp1 -0.5666667
sp2 -0.1666667
sp3 0.4333333
sp4 0.2333333
sp5 -0.1000000
sp6 -0.1000000
sp7 0.1000000
sp8 0.1666667
请注意,第一个向量对于两个函数都是相同的。 wcmdscale
没有向我们展示第二个向量。但我们可以在cmdscale
输出中看到它。此外,cmdscale
中的第二和后续向量的特征值在零的舍入误差内。 wcmdscale
删除所有这些微小的值。
所有这些意味着capscale
已经对您的数据进行了PCoA,只有它已经抑制了所有具有特征值&lt; = 0的轴。如果您绘制cmdscale
的输出,您可以看到这一点为你自己:
plot(cmdscale(sp_gow, eig = TRUE)$points, asp = 1)