主要坐标分析与gower距离

时间:2018-03-13 15:36:44

标签: r vegan

我正在尝试使用素食主义者的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

1 个答案:

答案 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) 

enter image description here