R:归一化为 0 时避免浮点运算

R: Avoid floating point arithmetic when normalizing to sum 0

我需要从正态分布中提取一个向量并将其归一化为总和 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?我已经尝试四舍五入了,但它只会增加总和。

我不想手动选择每个项目参数。提前致谢!

编辑:

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

pwr.rasch()错误提示如下:

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

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

任何技巧都会派上用场,因为我不想每手创建超过 50 个正态分布的项目参数。甚至更糟。如果我正确地理解了浮点运算,这个问题通常会在使用双打时出现。如果我只能使用整数作为项目参数,那将是极其有限的。

我下载了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")

}