首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误“权重不和为1”,但它们将和为1(R的MCDM包)

错误“权重不和为1”,但它们将和为1(R的MCDM包)
EN

Stack Overflow用户
提问于 2019-07-03 03:50:15
回答 1查看 281关注 0票数 0

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

代码语言:javascript
复制
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确认它们确实.

代码语言:javascript
复制
rowSums(normal_weights)

...returns a "1“。

然而,当我运行模型时,我得到了包特定的错误,权重不等于1。

基于我自己试图解决这个问题,我猜这与以下问题有关:

  1. 重量以双倍的形式储存。
  2. 通常情况下,这很好,因为小数位后面的16位数并不总是比needed...but多。
  3. rowSums实际上不会返回真正的"1“,所以如果一组权重存在轻微的精度问题,我在运行模型之前不会注意到
  4. 错误发生

这可能是发生了什么吗?如果是的话,我该如何解决呢?有办法保持精确吗?更好的正常化方式不会引起这个问题?

编辑:,我知道R Q&A "Why are these numbers not equal?"回答了R为什么这么做;但是,考虑到我不能改变我正在工作的包,那篇文章并没有回答我关于解决这个问题的一些变通方法的问题?

EN

回答 1

Stack Overflow用户

发布于 2019-07-03 05:17:48

这是很正常的,很难检查一个数字是否是1。仅仅因为R打印1并不意味着它就是1。事实上,你可以很容易地看到

代码语言:javascript
复制
identical(rowSums(normal_weights),1)
[1] FALSE

事实上,你可以看到

代码语言:javascript
复制
 rowSums(normal_weights) -1
[1] -1.110223e-16

所以我会做两件事:

1)确定权重之和为1,精度合理,类似于1e-8 (这取决于您的问题)。

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

代码语言:javascript
复制
 normal_weights[length(normal_weights)] <- 1- 
 sum(normal_weights[1:(length(normal_weights)-1)])

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

我想,您使用的MCMC函数在某个地方用作x == y语句,如果它们有一个容性测试,可能会更好,但这是另一个故事。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56862672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档