web-dev-qa-db-fra.com

Contrôle du nombre de chiffres décimaux dans la sortie imprimée en R

Il existe une option dans R pour contrôler l’affichage des chiffres. Par exemple:

options(digits=10)

est censé donner les résultats du calcul en 10 chiffres jusqu'à la fin de la session R. Dans le fichier d'aide de R, le paramètre de définition des chiffres est le suivant:

digits: contrôle le nombre de chiffres à imprimer lors de l'impression de valeurs numériques. C'est une suggestion seulement. Les valeurs valides sont 1 ... 22 avec la valeur par défaut 7

Donc, il est dit que ceci est une suggestion seulement. Et si j'aime toujours afficher 10 chiffres, pas plus ou moins?

Ma deuxième question est la suivante: si j’aime afficher plus de 22 chiffres, c’est-à-dire pour des calculs plus précis, comme 100 chiffres? Est-ce possible avec la base R ou ai-je besoin d'un package/d'une fonction supplémentaire pour cela?

Edit: Grâce à la suggestion de jmoy, j'ai essayé sprintf("%.100f",pi) et cela a donné

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

qui a 48 décimales. Est-ce la limite maximale que R peut gérer?

100
Mehper C. Palavuzlar

Ce n’est qu’une suggestion, c’est que vous pourriez très facilement écrire une fonction d’impression qui ignore la valeur des options. Les fonctions d'impression et de formatage intégrées utilisent la valeur options par défaut.

En ce qui concerne la deuxième question, puisque R utilise une arithmétique en précision finie, vos réponses ne sont pas précises au-delà de 15 ou 16 décimales, donc, en général, davantage ne sont pas nécessaires. Les paquets gmp et rcdd traitent l'arithmétique à précision multiple (via un interace vers la bibliothèque gmp), mais cela est principalement lié à de grands entiers plutôt qu'à plus de décimales pour vos doublons .

Mathematica ou Maple vous permettra d'indiquer autant de décimales que votre cœur le souhaite.

MODIFIER:
Il pourrait être utile de réfléchir à la différence entre les décimales et les chiffres significatifs. Si vous effectuez des tests statistiques qui reposent sur des différences au-delà du 15ème chiffre significatif, votre analyse est presque certainement indésirable.

Par contre, si vous travaillez avec de très petits nombres, le problème est moins grave car R peut traiter des nombres aussi petits que .Machine$double.xmin (généralement 2e-308).

Comparez ces deux analyses.

x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1)  #Should throw an error

x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2)  #ok

Dans le premier cas, les différences entre les nombres ne se produisent qu'après plusieurs chiffres significatifs, de sorte que les données sont "presque constantes". Dans le second cas, bien que la taille des différences entre les nombres soit la même, comparée à la magnitude des nombres eux-mêmes, elles sont grandes.


Comme mentionné par e3bo, vous pouvez utiliser des nombres à virgule flottante à plusieurs précisions à l'aide du package Rmpfr.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

Ils sont plus lents et utilisent beaucoup plus de mémoire que les vecteurs réguliers [double précision] numeric, mais ils peuvent être utiles si vous avez un problème mal conditionné ou un algorithme instable.

45
Richie Cotton

Si vous produisez vous-même l'intégralité de la sortie, vous pouvez utiliser sprintf(), par exemple.

> sprintf("%.10f",0.25)
[1] "0.2500000000"

indique que vous souhaitez formater un nombre à virgule flottante avec dix décimales (en %.10f le f est pour float et le .10 spécifie dix points décimaux).

Je ne connais aucun moyen de forcer les fonctions de niveau supérieur de R à imprimer un nombre exact de chiffres.

Si vous imprimez les nombres habituels de R, l’affichage de 100 chiffres n’a aucun sens, car la meilleure précision que vous pouvez obtenir avec les doubles 64 bits est d’environ 16 décimales (regardez .Machine $ double.eps sur votre système). Les chiffres restants ne seront que des indésirables.

40