保留R数据框中的数值精度?

Dav*_*uer 4 r

当我从数字向量创建数据框时,R似乎截断了我在分析中所需的精度以下的值:

data.frame(x=0.99999996)
Run Code Online (Sandbox Code Playgroud)

返回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))
Run Code Online (Sandbox Code Playgroud)

以下解决方案有效,但我更喜欢不太主观的东西:

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
Run Code Online (Sandbox Code Playgroud)

更新1

*自发布此问题以来,我意识到1即使数据框仍包含原始值,这将返回,例如

> dput(data.frame(x=0.99999999996))
Run Code Online (Sandbox Code Playgroud)

回报

structure(list(x = 0.99999999996), .Names = "x", row.names = c(NA, 
-1L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

更新2

在使用dput发布这个示例数据集和Dirk的一些指针之后,我可以看到问题不在于截断x值,而在于我用来计算的模型中的数值误差的限制y.这证明了丢弃一些等效数据点(如示例红线所示).

42-*_*42- 6

如果你真的想要设置R以完全不合理的精度打印它的结果,那么使用:options(digits=16).

请注意,这对于使用htese结果的函数的准确性没有任何作用.它只是更改值在打印到控制台时的显示方式.除非您输入的数字比横坐标可以处理的数字更多,否则不会对存储或访问的值进行舍入.'digits'选项对浮点数的最大精度没有影响.


Dir*_*tel 5

请重新阅读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
> 
Run Code Online (Sandbox Code Playgroud)