我正在为多标准决策模型进行敏感性分析。该模型使用软件包 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。
基于我自己尝试解决此问题的方式,我猜测这与以下问题有关:
这可能是怎么回事?如果是这样,我该如何解决?有没有办法保持精度?进行标准化的更好方法不会导致此问题?
编辑:我了解R问答"Why are these numbers not equal?"回答了为什么 R这样做的原因;但是,该帖子没有回答我的问题考虑到我无法更改正在使用的软件包,有什么解决方法可以解决此问题?
答案 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语句,如果他们进行了公差测试可能会更好,但这是另一回事。