R语言 如何在PCoA中指定相异度矩阵(包括混合/有序变量)的特征向量?

inkz8wg9  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(221)

我有一个数据集,其中包含了许多物种的有序变量,我想使用主坐标分析(PCoA)来可视化这个数据集。当我认为数据是连续的(数值型)时,直接使用vegan::vegdist来创建高尔相异度指数,ape::pcoa来计算主坐标分解,biplot来可视化变量:

library(ape)
library(vegan)
library(FD)

df <- data.frame(a = sample.int(4, 20, replace=TRUE),
b = sample.int(4, 20, replace=TRUE),
c = sample.int(4, 20, replace=TRUE),
d = sample.int(4, 20, replace=TRUE),
e = sample.int(4, 20, replace=TRUE))
rownames(df) <- paste0("species_", letters[1:20])

df.distance <- vegdist(df, "bray")
res <- pcoa(df.distance)
#biplot(res)
biplot(res, df)

然而,由于变量是有序的,vegdist无法解释这一点,所以我使用FD::gowdis来计算混合变量的Gowers相异度。

df.ordinal <- df
df.ordinal$a <- factor(df.ordinal$a,levels=1:4,labels = c("low","medium","high","veryhigh"),ordered=T)
df.ordinal$b <- factor(df.ordinal$b,levels=1:4,labels = c("low","medium","high","veryhigh"),ordered=T)
df.ordinal$c <- factor(df.ordinal$c,levels=1:4,labels = c("low","medium","high","veryhigh"),ordered=T)
df.ordinal$d <- factor(df.ordinal$d,levels=1:4,labels = c("low","medium","high","veryhigh"),ordered=T)
df.ordinal$e <- factor(df.ordinal$e,levels=1:4,labels = c("low","medium","high","veryhigh"),ordered=T)

df.distance.gower <- gowdis(df.ordinal, ord="podani")
res <- pcoa(df.distance.gower)
biplot(res)

在考虑有序数据时,排序是不同的,这并不奇怪,但我无法将覆盖变量可视化为特征向量:

> biplot(res.ordinal, df.ordinal)
Error in cov(Y, points.stand) : 
  is.numeric(x) || is.logical(x) is not TRUE```

这大概是因为变量现在是有序数据,而不是像vegdist的例子中那样连续。
是否有一种方法可以可视化混合数据集的特征向量/载荷,或者是否有理论上的原因不能应用于PCoA?

tyky79it

tyky79it1#

我不太清楚你问的是什么。你确实在PCoA中得到了特征向量,但这些特征向量只涉及采样单位(行)。PCoA基于差异(其被视为距离),并且这些不相似性没有关于变量的信息对于SU之间的任何相异度矩阵,有无限多个可能的列变量会产生这些差异(我们甚至不能说有多少列变量--也不能说它们是什么)。这意味着基本上不能基于采样单位(行)的不同而获得PCoA中的列信息。
不过,有时候您还是可以从软件中获取此列的信息,这是基于在计算相异度之前访问数据,然后将这些相异度视为与这些数据的欧氏距离(它们通常不是)。好吧,如果它们真的碰巧是欧几里得距离,你就不应该使用PCoA,而应该使用PCA(主成分分析)。然而,如果PCoA * 的相异度是 * 欧几里得,那么你就可以同时得到行和列的特征向量得分/载荷。这样做的结果是,如果你的不相似性可以表示为 * 的欧几里德距离transformed* 数据,则该变换数据会给出列特征向量解(“载荷”)。
在PCoA应用中,我们通常忽略这种不相容性、不一致性和不可能性,并假设输入数据可以用来将观测变量投影到采样单元的特征向量解上(行)即使是半度量或非度量的差异。这并不严格正确,但通常效果很好,我们希望这能让我们从罪恶中解脱出来。但是交叉手指。所以关键是找到数据的变换,它将尽可能类似于相异度指数中的隐式变换。对于有序数据,你应该有相应的连续数值变换,其中有序水平不是等距的,而是由那个转换定义的值。如果你不能得到那些(我不知道你的软件:可以得到这些值,但是软件可能不给予这些值),
请注意,我写的是 * 添加 * 列得分(特征向量载荷),因为PCoA不知道这些,也不可能知道这些,但是必须在分析之后添加,如果PCoA中有欧氏距离,或者如果你的距离可以表示为变换数据的欧氏距离,那么这个添加将是严格正确的。并利用这些变换后的数据添加变量的信息在这种情况下,您应该首先使用转换数据的PCA。一般而言,在PCoA中,列得分 * 从不 * 完全正确,但它们只是辅助信息,在许多情况下可能不会太坏,往往可以是有用的和信息丰富的(即使严格来说不正确)。

相关问题