出现错误“权重总和不等于 1”,但它们的总和确实为 1(R 的 MCDM 包)[重复]

问题描述 投票:0回答:1

我正在对多标准决策模型进行敏感性分析。该模型使用包 MCDM 在 R 中运行。该模型的一个关键组成部分是,它依赖于用户给定的一组权重,这些权重的总和必须为 1。我正在使用的权重偏好最初总和不为 1,但我将其归一化为总和为 1。

weights <- data.frame("w1"=0.03125, "w2"=0.53125, "w3"=0.84375, "w4"=0.21875, "w5"=0.46875, "w6"=0.28125, "w7"=0.96875)

normal_weights <- weights/rowSums(weights)

当我检查并确认新的权重总和为 1 时,R 确认它们是...

rowSums(normal_weights)

...返回“1”。

但是,当我运行模型时,我收到了特定于包的错误,即权重总和不等于 1。

根据我自己尝试解决这个问题,我猜这与:

  1. 权重存储为双精度
  2. 通常这很好,因为小数点后 16 位数字超出了需要......但并非总是如此
  3. rowSums 实际上并不返回真正的“1”,因此如果一组权重存在轻微的精度问题,我在运行模型之前不会注意到它
  4. 发生错误

这可能是发生的事情吗?如果是这样,我该如何解决?有没有办法保持精度?有更好的标准化方法不会导致此问题吗?

编辑:我理解R Q&A “为什么这些数字不相等?”回答为什么R这样做;但是,该帖子没有回答我的问题:考虑到我无法更改正在使用的软件包,有哪些解决方法可以解决此问题?

r precision normalization rowsum mcdm
1个回答
3
投票
这很正常,检查一个数字是否为 1 是非常困难的。仅仅因为 R 打印 1,并不意味着它恰好是 1。事实上你可以很容易地看到这一点

identical(rowSums(normal_weights),1) [1] FALSE

事实上你可以看到

rowSums(normal_weights) -1 [1] -1.110223e-16

所以我会做两件事:

1) 建立合理的权重总和为 1 准确性,例如 1e-8(这实际上取决于您的问题)

2)要解决该错误,只需将 normal_weights 的最后一个元素定义为 1 - 其他元素的总和:

normal_weights[length(normal_weights)] <- 1- sum(normal_weights[1:(length(normal_weights)-1)]) identical(rowSums(normal_weights),1) [1] TRUE

我猜你在某个地方用作 x == y 语句的 MCMC 函数,如果他们进行容差测试可能会更好,但那是另一个故事了。

© www.soinside.com 2019 - 2024. All rights reserved.