【问题标题】:Calculate the weighted distance from a modified distance matrix根据修改后的距离矩阵计算加权距离
【发布时间】:2020-11-13 12:53:20
【问题描述】:

我得到了一个修改后的距离矩阵,我想在其中使用转换后的(标准化)距离来创建变量。下面,我有一些生成示例数据的代码。

set.seed(12)

size <- sample(100:1000, 7)
var <- c("V3", "V4", "V5", "V6", "V7", "V8", "V9")
dist <- matrix(runif(100), nrow = 7, ncol = 7)
diag(dist) <- 0

df <- as.data.frame(cbind(var, size, dist))

这导致数据集如下所示:

  var size                  V3                V4                 V5                V6                V7                 V8                V9
1  V3  549                   0 0.264918377622962  0.787836347473785 0.439429325051606 0.941087544662878   0.97763589094393 0.774718186818063
2  V4  445  0.0228777434676886                 0 0.0978530396241695 0.669819295872003 0.693911424372345  0.197649595327675 0.394586439244449
3  V5  435 0.00832482660189271 0.457607151241973                  0 0.240883231163025 0.843702238984406  0.844225987326354 0.361513090785593
4  V6  346   0.392697197152302 0.540707547217607  0.217823043232784                 0 0.384644460165873 0.0950279189273715 0.421090044546872
5  V7  958   0.813880559289828 0.665679829893634  0.267943592974916 0.882756386883557                 0  0.381151003297418 0.322011524345726
6  V8  273    0.37624845537357 0.112698937533423  0.504767951788381 0.814063254510984  0.58848182996735                  0 0.552160830702633
7  V9  552   0.380812183720991  0.21836716751568  0.188586926786229 0.633264608215541 0.530477509833872  0.152623838977888                 0

数据由几个变量组成,表示var和不同点之间的距离,其中V3V4等列是另一个点,即var == V4到@的距离987654329@ 由名为V5 的列表示。 Size 表示大小。

我要做的是计算distance的加权和,其中距离根据另一点的大小加权。见下面的公式:

其中Si 是单位i 的大小,(变量称为size)。 Di 是一个点(即列var3var4var5...)到i 个点,总和是所有 k 个单位。

例如,Di可以是给定点V3V40.264918377622962)的距离,然后是Sivar == V4size(即445

当我的数据看起来像这样时,如何执行此计算?

谢谢!

【问题讨论】:

  • @Onyambu 我认为WS 是一个标量,它是根据与所有其他点的距离加权的单个点的大小,因此下标代表所有其他点,我们只需要为每个考虑的WS 提供一个索引。这就是我的解释-也许OP可以澄清一下?
  • @AllanCameron 很抱歉不够清楚。但是,是的。你的解释是对的。如何编辑帖子以使其更清晰?
  • @AllanCameron 很抱歉不够清楚。我意识到我误读了您之前评论的一部分。你的解释几乎是正确的。 WS 是一个标量,它是从一个点到所有其他点的加权距离之和,根据其他点的大小加权。所以 WS 是,例如从 V3 到 V4 的距离根据 V4 的大小加权,从 V3 到 V5 的距离应该根据 V5 的大小加权,以此类推。然后将这个相加,这就是 V3 的 WS 值。那有意义吗?如何编辑帖子以使其更清晰?
  • 我想我明白了。你能检查我的更新吗?

标签: r distance distance-matrix


【解决方案1】:

也许这就是你要找的?

按列工作,我们将每个点的size 除以其与代表相关点的列的距离 (1:7)。显然我们排除了对角线。将结果相加就可以得到该点的加权大小

set.seed(12)

size <- sample(100:1000, 7)
var <- c("V3", "V4", "V5", "V6", "V7", "V8", "V9")
dist <- matrix(runif(49), nrow = 7, ncol = 7)
diag(dist) <- 0

df <- as.data.frame(cbind(var, size, dist))

df$WS <- sapply(seq(nrow(df)), 
         function(i) sum(as.numeric(as.character((df[[2]][-i]))) / 
                         as.numeric(as.character(df[[i + 2]][-i]))))

df$WS
#> [1] 75937.840 10052.202 13876.181  6011.826  4144.254 13099.493  7330.831

reprex package (v0.3.0) 于 2020 年 11 月 13 日创建

【讨论】:

  • 谢谢!手动检查您的代码,发现一个问题。我不太确定如何在 R 中解决这个问题。如果我们有两个点(V3 和 V4),根据您的代码,我们取 V3 到 V4 的距离,除以 V3 的大小,并将其分配为WS 到 V4。我想让它走那个距离,除以V4的大小,然后分配给V3。示例:A 区有 445 人,B 区有 549 人。从 A 到 B 的变换距离为 0.1693。在为 A 创建 WS 值时,我们将 A 和 B 之间的距离除以 B 的人口规模 (549)。 WS 是 (549/0.164) 3242.764
  • @ecl 不,这是不对的。假设 i 为 1(在第一次迭代中)。那么df[[2]][-i]就是df[[2]][-1],和df$size[2:7]一样。同样,df[[i + 2]][-i]df$V3[2:7] 相同。这意味着 V3 列的计算不包括 V3 行中的任何内容,并且从 V4 的行开始,因此代码所做的计算就是您所描述的计算。第一个值是df$size[2]/df$V3[2],如您所描述的,它是 V4 的大小除以 V3 到 V4 的距离。
  • 是的,你是对的!对不起。我意识到我提供的数据让我感到困惑,因为它为相同的距离提供了两个不同的距离。 (V4 到 V3 有一个值,而 V3 到 V4 有另一个)。所以这就是为什么我认为出了点问题。非常感谢您花时间帮助我。我非常感谢:D
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多