当我从数字向量创建数据时,R似乎截断了我在分析中所要求的精度以下的值:
data.frame(x=0.99999996)
返回1
(*但请参见更新1)
当拟合spline(x,y)
时,我被困住了,由于y的变化,x值中的两个被设置为1。我可以破解这一点,但我更愿意使用一个标准的解决方案,如果可以的话。
示例
下面是一个示例数据集
d <- data.frame(x = c(0.668732936336141, 0.95351462456867,
0.994620622127435, 0.999602102672081, 0.999987126195509, 0.999999955814133,
0.999999999999966), y = c(38.3026509783688, 11.5895099585560,
10.0443344234229, 9.86152339768516, 9.84461434575695, 9.81648333804257,
9.83306725758297))
以下解决方案有效,但我更喜欢不太主观的解决方案:
plot(d$x, d$y, ylim=c(0,50))
lines(spline(d$x, d$y),col='grey') #bad fit
lines(spline(d[-c(4:6),]$x, d[-c(4:6),]$y),col='red') #reasonable fit
更新1
*由于张贴了这个问题,我意识到这将返回1
,即使数据框架仍然包含原始值。
> dput(data.frame(x=0.99999999996))
返回
structure(list(x = 0.99999999996), .Names = "x", row.names = c(NA,
-1L), class = "data.frame")
更新2
在使用dput发布这个示例数据集和一些来自Dirk的指针之后,我可以看到问题不是x
值的截断,而是用于计算y
的模型中数值误差的限制。这就有理由删除几个等效的数据点(如示例中的红线)。
发布于 2010-12-27 18:10:05
如果您真的希望设置R以完全不合理的精度打印其结果,那么请使用:options(digits=16)
。
请注意,这对使用htese结果的函数的准确性没有任何帮助。它只是在将值打印到控制台时改变了它们的显示方式。在存储或访问这些值时,不需要舍入值,除非您输入比横坐标所能处理的更多的有效数字。“数字”选项对浮点数的最大精度没有影响。
发布于 2010-12-27 17:57:16
请重读R FAQ 7.31和其中引用的参考文献--这是一篇非常著名的论文,讲述了每个人都应该了解计算机上的浮点表示。
Kerngighan和Plauger的结束语也很精彩:
10.0乘以0.1几乎从来都不是1.0。
当然,除了数字精度问题外,R打印的小数比内部使用的要少:
> for (d in 4:8) print(0.99999996, digits=d)
[1] 1
[1] 1
[1] 1
[1] 1
[1] 0.99999996
>
https://stackoverflow.com/questions/4540649
复制相似问题