“错误”;权重不';t总和为1“;发生,但它们的总和为1(R的MCDM包)
我正在对一个多标准决策模型进行敏感性分析。该模型使用MCDM包在R中运行。该模型的一个关键组成部分是,它依赖于用户给定的一组权重,这些权重的总和必须为1。我使用的权重首选项最初不是和1,但我将其标准化为和1“错误”;权重不';t总和为1“;发生,但它们的总和为1(R的MCDM包),r,precision,normalization,rowsum,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 <- w
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”
但是,当我运行该模型时,我会得到特定于包的错误,即权重总和不等于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)
基于我自己尝试解决此问题,我猜这与以下方面有关:
编辑:我知道R Q&A回答了R为什么这样做;但是,这篇文章并没有回答我的问题:考虑到我无法更改正在使用的软件包,有哪些解决方法可以解决这个问题?这很正常,很难检查数字是否为1。仅仅因为R打印1并不意味着它就是1。事实上,你可以很容易地看到这一点
identical(rowSums(normal_weights),1)
[1] FALSE
事实上你可以看到
rowSums(normal_weights) -1
[1] -1.110223e-16
所以我要做两件事:
1) 确定权重总和为1,且具有合理的
准确度,类似1e-8(这取决于您的问题)
2) 为了避免错误,只需将正常_权重的最后一个元素定义为1——其他元素的总和:
normal_weights[length(normal_weights)] <- 1-
sum(normal_weights[1:(length(normal_weights)-1)])
identical(rowSums(normal_weights),1)
[1] TRUE
normal_weights[长度(normal_weights)]这很正常,很难检查数字是否为1。仅仅因为R打印1并不意味着它就是1。事实上,你可以很容易地看到这一点
identical(rowSums(normal_weights),1)
[1] FALSE
事实上你可以看到
rowSums(normal_weights) -1
[1] -1.110223e-16
所以我要做两件事:
1) 确定权重总和为1,且具有合理的
准确度,类似1e-8(这取决于您的问题)
2) 为了避免错误,只需将正常_权重的最后一个元素定义为1——其他元素的总和:
normal_weights[length(normal_weights)] <- 1-
sum(normal_weights[1:(length(normal_weights)-1)])
identical(rowSums(normal_weights),1)
[1] TRUE
normal_weights[长度(normal_weights)]了解软件中的浮点算法。浮点数据类型只能表示某些值。在大多数语言中,读取文本返回最接近其输入的本机类型值&每个算术运算符返回最接近其应用于(本机类型)输入的理想结果的本机类型值。然后,您必须根据精确性和准确性的适当概念来决定程序的实际规格。然后你必须写一个合适的程序。当你对问题有了更多的了解后,如果你陷入困境,可以问一个问题。PS仍然没有——剪切、粘贴和可运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和清晰的说明和解释。这包括您能给出的最少代码,即您显示为OK的代码,由您显示为not OK的代码扩展。请根据我最后的评论采取行动。例如:你说API“依赖于一组用户给定的权重,这些权重的总和必须为1”。文件上到底说了什么?您的代码、输入和输出是什么?有了新的FP知识,您现在还尝试了什么推理?了解软件中的浮点算法。浮点数据类型只能表示某些值。在大多数语言中,读取文本返回最接近其输入的本机类型值&每个算术运算符返回最接近其应用于(本机类型)输入的理想结果的本机类型值。然后,您必须根据精确性和准确性的适当概念来决定程序的实际规格。然后你必须写一个合适的程序。当你对问题有了更多的了解后,如果你陷入困境,可以问一个问题。PS仍然没有——剪切、粘贴和可运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和清晰的说明和解释。这包括您能给出的最少代码,即您显示为OK的代码,由您显示为not OK的代码扩展。请根据我最后的评论采取行动。例如:你说API“依赖于一组用户给定的权重,这些权重的总和必须为1”。文件上到底说了什么?您的代码、输入和输出是什么?有了新的FP知识,您现在还尝试了什么推理?非常感谢。我想可能就是这样,但我不太明白如何实现步骤2。我尝试了你的代码和正常权重[1,7],很抱歉这对你不起作用。这可能取决于我们使用的机器,我们得到不同的结果?恐怕这超出了我对R的了解。你能不能少用一点数字,稍微四舍五入一点?这可能会增加你的机会。您知道错误发生在MCMC的哪个功能中吗?也许你冷下载了源代码并修改了有问题的语句。但是我同意你的观点,因为你不能改变你正在使用的功能,所以发布的链接并不能解决你的问题。您可能需要发布一个完整的可复制的示例,并希望有更多的知识渊博的人来学习。谢谢。我想可能就是这样,但我不太明白如何实现步骤2。我尝试了你的代码和正常权重[1,7],很抱歉这对你不起作用。这可能取决于我们使用的机器,我们得到不同的结果?恐怕这超出了我对R的了解。你能不能少用一点数字,稍微四舍五入一点?这可能会增加你的机会。您知道错误发生在MCMC的哪个功能中吗?也许你可以下载sou