CMDR中cmdscale的意外结果

CMDR中cmdscale的意外结果,r,multi-dimensional-scaling,R,Multi Dimensional Scaling,恐怕我遗漏了一些明显的东西,但我就是看不出我做错了什么。 如果有人能帮我找到它,那就太好了 这是我从完整的对称距离矩阵开始的: d2 <- structure(list(P1 = c(0, 0.1, 0.3, 0.2, 0, 0.1), P2 = c(0.1, 0, 0.5, 0.7, 1, 0.9), P3 = c(0.3, 0.5, 0, 1, 0.2, 0.3), P4 = c(0.2, 0.7, 1, 0, 0.2, 0.5), P5 = c(0, 1, 0.2, 0.2, 0

恐怕我遗漏了一些明显的东西,但我就是看不出我做错了什么。
如果有人能帮我找到它,那就太好了

这是我从完整的对称距离矩阵开始的:

d2 <- structure(list(P1 = c(0, 0.1, 0.3, 0.2, 0, 0.1), P2 = c(0.1, 
0, 0.5, 0.7, 1, 0.9), P3 = c(0.3, 0.5, 0, 1, 0.2, 0.3), P4 = c(0.2, 
0.7, 1, 0, 0.2, 0.5), P5 = c(0, 1, 0.2, 0.2, 0, 0.7), P6 = c(0.1, 
0.9, 0.3, 0.5, 0.7, 0)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L))

sum(abs(d2-t(d2)))
#[1] 0
因此,假设
k=3
足够了,当我尝试反转操作时会发生以下情况:

dd <- dist(cmdscale(d2,k=3),diag = T,upper = T)
dd
#          1         2         3         4         5         6
#1 0.0000000 0.5294049 0.5384495 0.4940956 0.5348482 0.4844970
#2 0.5294049 0.0000000 0.7578630 0.8710048 1.0045529 0.9013064
#3 0.5384495 0.7578630 0.0000000 1.0018275 0.6777074 0.6282371
#4 0.4940956 0.8710048 1.0018275 0.0000000 0.6319294 0.7097335
#5 0.5348482 1.0045529 0.6777074 0.6319294 0.0000000 0.7065166
#6 0.4844970 0.9013064 0.6282371 0.7097335 0.7065166 0.0000000
有人知道为什么这两个距离矩阵根本不匹配吗

我可以尝试构建自己的最小二乘问题来找到坐标,但首先我需要了解这些现成的R功能是否有问题

谢谢


编辑发现的数据中可能存在的不一致

问题可能是根据
d2
点1和5重合(它们的距离为0):

但这两个点与其他点的距离不同,例如,d(1-2)为0.1,而d(5-2)为1

但是,替换两个0似乎没有帮助:

d3 <- d2
d3[1,5] <- 0.2
d3[5,1] <- 0.2
dd3 <- cmdscale(as.matrix(d3),k=3)
sum(abs(as.matrix(dist(dd3))-as.matrix(d3)))
#[1] 7.168348

d3多维缩放为指定数量的维度创建坐标,以便它们尽可能接近原始矩阵中的距离。但距离将是不同的尺度。在您的示例中,
d3
是原始距离矩阵,
dd3
是坐标矩阵,
dist(dd3)
是重构坐标的距离矩阵。这些值不同,但它们反映了点之间相同的关系:

d3.v <- as.vector(as.dist(d3))  # Vector of original distances
dd3.v <- as.vector(dist(dd3))   # Vector of distances computed from coordinates
cor(d3.v, dd3.v)
# [1] 0.9433903
plot(d3.v, dd3.v, pch=16)

d3.v谢谢@dcarlson。是的,我看到了坐标矩阵和距离之间的差异;我的疑问更多的是为什么
cmdscale
无法生成一个坐标矩阵,重新转换为距离矩阵,与原始矩阵完全匹配。但我想我现在明白了,事实上,并不是所有的距离矩阵都对应于欧几里德空间中的点,无论使用多少维。我会用一个例子来编辑这篇文章。是的。例如,距离矩阵可以用英里或公里表示。从另一个中减去一个不会产生零矩阵。这些距离的表示是空间不是唯一的,因为原点的旋转、反射和平移产生不同的坐标系,但产生相同的距离矩阵。
as.matrix(d2)
#      P1  P2  P3  P4  P5  P6
#[1,] 0.0 0.1 0.3 0.2 0.0 0.1
#[2,] 0.1 0.0 0.5 0.7 1.0 0.9
#[3,] 0.3 0.5 0.0 1.0 0.2 0.3
#[4,] 0.2 0.7 1.0 0.0 0.2 0.5
#[5,] 0.0 1.0 0.2 0.2 0.0 0.7
#[6,] 0.1 0.9 0.3 0.5 0.7 0.0
d3 <- d2
d3[1,5] <- 0.2
d3[5,1] <- 0.2
dd3 <- cmdscale(as.matrix(d3),k=3)
sum(abs(as.matrix(dist(dd3))-as.matrix(d3)))
#[1] 7.168348
d3.v <- as.vector(as.dist(d3))  # Vector of original distances
dd3.v <- as.vector(dist(dd3))   # Vector of distances computed from coordinates
cor(d3.v, dd3.v)
# [1] 0.9433903
plot(d3.v, dd3.v, pch=16)