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
遗憾的是,该函数的文档很差。当我使用 eRm
的 RM()
函数估计分组项目参数时,它有一个额外的参数用于归一化为 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")
}
我需要从正态分布中提取一个向量并将其归一化为总和 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
遗憾的是,该函数的文档很差。当我使用 eRm
的 RM()
函数估计分组项目参数时,它有一个额外的参数用于归一化为 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")
}