Сохранить числовую точность в фрейме данных R? - PullRequest
4 голосов
/ 27 декабря 2010

Когда я создаю кадр данных из числовых векторов, R, кажется, усекает значение ниже точности, которая мне требуется в моем анализе:

data.frame(x=0.99999996)

возвращает 1 (* но см. Обновление 1)

Я застрял при установке spline(x,y), и два значения x установлены в 1 из-за округления при изменении y.Я мог бы взломать это, но я бы предпочел использовать стандартное решение, если оно доступно.

пример

Вот пример набора данных

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.Это оправдывает отбрасывание нескольких эквивалентных точек данных (как в примере с красной линией).

Ответы [ 2 ]

6 голосов
/ 27 декабря 2010

Если вы действительно хотите, чтобы R печатал результаты с совершенно необоснованной точностью, используйте: options(digits=16).

Обратите внимание, что это ничего не делает для такой точности функций, использующих результаты htese.Это просто меняет то, как значения отображаются, когда они выводятся на консоль.Нет округления значений, поскольку они хранятся или доступны, если вы не введете более значащие цифры, чем абсцисса может обработать.Параметр «цифры» не влияет на максимальную точность чисел с плавающей запятой.

5 голосов
/ 27 декабря 2010

Пожалуйста, перечитайте 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
> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...