【问题标题】:R: Avoid floating point arithmetic when normalizing to sum 0R:在归一化为总和 0 时避免浮点运算
【发布时间】:2017-10-13 13:51:29
【问题描述】:

我需要从正态分布中提取一个向量并将其归一化为总和 0,因为我想使用 pwrRasch 包中的 pwr.rasch() 函数来模拟功率。听起来很简单。

我这样创建向量:

set.seed(123)
itempars <- rnorm(n = 10, mean = 0, sd = 1.8)  

为了将参数标准化为 0,我从向量的最后一个元素中减去向量的总和,如下所示:

itempars[10] <- itempars[10] - sum(itempars)

当我输入 sum(itempars) 时,它应该是 0,但它是 -8.326673e-17。这怎么可能?我怎样才能把它变成0?我已经尝试四舍五入,但它只会增加总和。

我不想手动选择每个 Itemparameter。提前致谢!

编辑:

显然原因是浮点运算。但很难想象没有办法。

pwr.rasch()的错误消息如下:

Error in simul.rasch(eval(parse(text = ppar[[1]])), ipar[[1]]) : 
Item pararameters are not normalized to sum-0

遗憾的是,该函数的文档很差。当我使用 eRmRM() 函数估计分组项参数时,该函数有一个额外的参数用于归一化为总和 0,它给了我与我的示例类似的差异。

任何技巧都会派上用场,因为我不想每手创建超过 50 个正态分布的项目参数。更糟糕。如果我正确理解浮点算术,则通常使用双精度数可能会出现此问题。如果我只能使用整数作为项目参数,那将是非常有限的。

【问题讨论】:

  • 浮点精度
  • stackoverflow.com/questions/9508518/… 。您能否详细说明为什么您需要总和完全为零,即当总和不完全为零时,pwr.rasch() 中的失败原因是什么?
  • @docendodiscimus 这回答了为什么,但没有解决我的问题。有没有办法处理这个问题?
  • 这是一个 XY 问题。 X 是“为什么这个总和不正好为 0 以及我如何做到这一点” - 答案是“不精确性是浮点运算所固有的;你不能让它正好为 0。”但是您的 Y 似乎是“我如何将rasch::pwr.rasch 与非整数一起使用”,这可能有也可能没有您喜欢的答案。
  • 我不反对将问题修改为“我怎样才能完成这项工作”。但是请提供一个 reproducible 示例,例如library(pwrRasch); pwr.rasch(c(5,5),ipar=list(scale(rnorm(5)),scale(rnorm(5))))。简短的回答:代码(IMO)写得不好。如果不破解代码(我们可以向您展示如何做到这一点)或联系维护者,我看不到直接的解决方法。

标签: r simulation normal-distribution


【解决方案1】:

我下载了pwrRasch包的源代码,并将if条件从

if (all(round(unlist(lapply(ipar, sum)), 3) != 0)) {

    stop("Item pararameters are not normalized to sum-0")

} 

if (all(round(unlist(lapply(ipar, sum)), 3) > 1e-5)) {

    stop("Item pararameters are not normalized to sum-0")

} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2012-11-26
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多