当我从数字向量创建数据框时,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
。这证明了丢弃一些等效数据点(如示例红线所示)。
答案 0 :(得分:6)
如果您真的想要设置R以完全不合理的精度打印其结果,请使用:options(digits=16)
。
请注意,这对于使用htese结果的函数的准确性没有任何作用。它只是更改值在打印到控制台时的显示方式。除非您输入的数字比横坐标可以处理的数字更多,否则不会对存储或访问的值进行舍入。 'digits'选项对浮点数的最大精度没有影响。
答案 1 :(得分: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
>