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