Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“错误”;权重不';t总和为1“;发生,但它们的总和为1(R的MCDM包)_R_Precision_Normalization_Rowsum - Fatal编程技术网

“错误”;权重不';t总和为1“;发生,但它们的总和为1(R的MCDM包)

“错误”;权重不';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

我正在对一个多标准决策模型进行敏感性分析。该模型使用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”

但是,当我运行该模型时,我会得到特定于包的错误,即权重总和不等于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)
基于我自己尝试解决此问题,我猜这与以下方面有关:

  • 重量存储为双倍重量
  • 通常这很好,因为超过小数点后16位的数字超出了需要的范围……但并非总是如此
  • rowSums实际上并没有返回真的“1”,所以如果一组权重有轻微的精度问题,我在运行模型之前不会注意到它
  • 错误发生了
  • 这就是可能发生的事情吗?如果是,我该如何修复它?有没有办法保持精度?一个更好的正常化方法不会导致这个问题


    编辑:我知道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