我正在对一个多标准的决策模型进行敏感性分析。该模型在R中运行,使用的是包MCDM。该模型的一个关键组成部分是它依赖于用户给定的一组权重,这些权重必须之和为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)...returns a "1“。
然而,当我运行模型时,我得到了包特定的错误,权重不等于1。
基于我自己试图解决这个问题,我猜这与以下问题有关:
这可能是发生了什么吗?如果是的话,我该如何解决呢?有办法保持精确吗?更好的正常化方式不会引起这个问题?
编辑:,我知道R Q&A "Why are these numbers not equal?"回答了R为什么这么做;但是,考虑到我不能改变我正在工作的包,那篇文章并没有回答我关于解决这个问题的一些变通方法的问题?
发布于 2019-07-03 05:17:48
这是很正常的,很难检查一个数字是否是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语句,如果它们有一个容性测试,可能会更好,但这是另一个故事。
https://stackoverflow.com/questions/56862672
复制相似问题