dist.ktab et arrondis...

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Jean-Yves Barnagaud
Messages : 17
Enregistré le : 06 Oct 2009, 07:16

dist.ktab et arrondis...

Messagepar Jean-Yves Barnagaud » 06 Fév 2017, 17:07

Bonjour,

J'espère que cette question n'a pas déjà été posée...

Je cherche à calculer une matrice de distance de Gower à partir de traits d'histoire de vie de n espèces codés en scores sommant par définition à 10 pour chaque ligne (fuzzy traits). Afin de le faire proprement, j'utilise la fonction dist.ktab d'ade4, en standardisant par la range des traits. Problème: la fonction plante avec le message d'erreur suivant:

Error in FUN(X[[i]], ...) :
The fuzzy data set must be prepared with the function prep.fuzzy


Ce message est retourné par la ligne suivante de la fonction dist.ktab:

Code : Tout sélectionner

if(!all(abs(apply(df, 1, sum, na.rm = TRUE) - floor(apply(df, 1, sum, na.rm = TRUE))) < tol, na.rm = TRUE))
+                 stop("The fuzzy data set must be prepared with the function prep.fuzzy")


Voici un exemple répétable (en tout cas, où le message d'erreur se répète sur ma machine) à partir de 2 espèces (données réelles):

Code : Tout sélectionner

library(ade4)
x1=c(2.0,8.0,0,0,0,0,0,0)
x2=c(2.8,7.1,0.1,0,0,0,0,0)
x3=data.frame(rbind(x1,x2))   # 2 lignes = 2 espèces dont les scores sur 8 colonnes somment à 10
x4=prep.fuzzy(x3,col.blocks=8,labels="traits") # préparer les données avec la fonction prep.fuzzy
ktab=ktab.list.df(list(x4))
distmat=dist.ktab(ktab,type="F",option="scaledBYrange") # calculer la distance entre x1 et x2


Le problème vient manifestement d'un arrondi dans la fonction prep.fuzzy: les deux lignes ne somment pas à 1, comme attendu:

> colsum=apply(x4,1,"sum")
> colsum
x1 x2
1 1
> colsum==1
x1 x2
TRUE FALSE


Et de fait la ligne 2 ne somme effectivement pas exactement à 1:
> colsum=apply(x4,1,"sum")
> sprintf("%.25f", colsum[colsum != 1])
[1] "0.9999999999999998889776975"



Si j'arrondis l'output du prep.fuzzy à 4 décimales, le problème persiste, il y a toujours des espèces qui ne somment pas à 1. Avec un arrondi à 1 ou 0 décimales, j'ai assez logiquement des lignes qui somment à 0.9, 1.1, donc ça n'est pas cohérent. Sur le sous-échantillon de lignes qui somment à 1, le résultat de dist.ktab change assez fortement selon l'arrondi. J'ai également tenté de changer l'argument tol dans dist.ktab, mais ça n'aide pas beaucoup (et ça me pose problème de modifier un argument dont je ne maîtrise pas la signification profonde).

Auriez-vous une idée de comment m'en sortir pour régler ce problème d'arrondi qui m'empêche d'obtenir ma matrice de distances?

Merci par avance!

JY Barnagaud
JY Barnagaud

Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron