出现错误“权重不等于1”,但它们的总和等于1(R的MCDM软件包)

时间:2019-07-03 03:50:15

标签: r precision normalization rowsum

我正在为多标准决策模型进行敏感性分析。该模型使用软件包 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问答"Why are these numbers not equal?"回答了为什么 R这样做的原因;但是,该帖子没有回答我的问题考虑到我无法更改正在使用的软件包,有什么解决方法可以解决此问题?

1 个答案:

答案 0 :(得分:1)

这是很正常的,很难检查数字是否为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

我猜想您正在某处使用MCMC函数作为x == y语句,如果他们进行了公差测试可能会更好,但这是另一回事。