【发布时间】: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
遗憾的是,该函数的文档很差。当我使用 eRm 的 RM() 函数估计分组项参数时,该函数有一个额外的参数用于归一化为总和 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