2017-05-01 28 views
2

alors j'ai été chalutant à travers des questions existantes pour des solutions à celui-ci, mais en vain. J'ai un ensemble de données composé d'individus (117), chacun avec une observation d'une variable différente (12), et groupé par une variable de facteur avec 8 niveaux.R - "CAPdiscrim" et "lda" erreur "variable 1 semble être constante au sein des groupes"

Je voudrais faire une analyse canonique des principales coordonnées de ces données basées sur l'approche d'Anderson et Willis. J'ai commencé par utiliser BiodiversityR :: CAPdiscrim. Commençons par quelques exemples de données:

individual <- c(1:30) 
group <- rep(c("a","b","c"), 10) 
Var1 <- rnorm(n = 30, mean = 3.0e-4,sd = 2.0e-6) 
Var2 <- rnorm(n = 30, mean = 2.4e-4,sd = 2.0e-6) 
Var3 <- rnorm(n = 30, mean = 7.0e-6,sd = 9.0e-9) 
Var4 <- rnorm(n = 30, mean = 4.2e-5,sd = 1.0e-6) 
Var5 <- rnorm(n = 30, mean = 1.0e-4,sd = 9.0e-6) 
Var6 <- rnorm(n = 30, mean = 8.0e-5,sd = 1.0e-5) 

df <- data.frame(cbind(individual, group, Var1, Var2, Var3, Var4, Var5, Var6)) 
df$Var1 <- as.numeric(levels(df$Var1))[as.integer(df$Var1)] 
df$Var2 <- as.numeric(levels(df$Var2))[as.integer(df$Var2)] 
df$Var3 <- as.numeric(levels(df$Var3))[as.integer(df$Var3)] 
df$Var4 <- as.numeric(levels(df$Var4))[as.integer(df$Var4)] 
df$Var5 <- as.numeric(levels(df$Var5))[as.integer(df$Var5)] 
df$Var6 <- as.numeric(levels(df$Var6))[as.integer(df$Var6)] 

CAPdiscrim nécessite des données dans un format particulier:

vars <- df[3:8] 

maintenant nous pouvons exécuter CAPdiscrim sur les données

BiodiversityR::CAPdiscrim(vars~group, 
          data = df, 
          dist = "euclidean", 
          axes = 4, 
          m = 0, 
          permutations = 999) 

qui retourne:

Erreur dans lda.default (x, grouping, ...): variables 1 semble être constante au sein des groupes

Nous pouvons utiliser nearZeroVar pour voir si cela est vrai (ce qui est ne semble pas être vrai):

vars_check <- nearZeroVar(vars, saveMetrics = TRUE, names = TRUE) 
vars_check 

    freqRatio percentUnique zeroVar nzv 
Var1   1   100 FALSE FALSE 
Var2   1   100 FALSE FALSE 
Var3   1   100 FALSE FALSE 
Var4   1   100 FALSE FALSE 
Var5   1   100 FALSE FALSE 
Var6   1   100 FALSE FALSE 

Maintenant, j'ai vu d'autres questions concernant cette erreur spécifique à LDA() et je constate que CAPdiscrim() appelle vegdist(), cmdscale() et LDA() donc j'essayé de briser cette peice d'analyse par peice:

dist_matrix <- vegdist(vars, 
         method = "euclidean", 
         binary = FALSE, 
         diag = FALSE, 
         upper = FALSE, 
         na.rm = TRUE) 

PCA_vars <- cmdscale(d = dist_matrix, 
         k = 5, 
         eig = TRUE, 
         add = FALSE, 
         x.ret = FALSE) 

LDA_pldist <- lda(x = PCA_vars$points, 
        grouping = df$group) 

qui renvoie un résultat très similaire:

erreur dans lda.default (x, groupement, ...): variables 1 2 3 4 5 semble être constante à l'intérieur des groupes

Maintenant en lda() il existe un argument "tol" qui peut être utilisé pour éliminer cette erreur en traitant un très petit nombre, donc je peux le faire:

LDA_pldist <- lda(x = PCA_vars$points, 
        grouping = df$group, 
        tol = 1.0e-25) 

cela fournit une sortie, mais ne comprend pas certaines des caractéristiques de CAPdiscrim telles que la fonction permettant de determi ne le meilleur nombre pour "m" à travers permutations.

Quelqu'un peut-il suggérer comment modifier la tolérance dans CAPdiscrim()? ou comment effectuer ce que CAPdiscrim() fait sous le capot manuellement avec ces autres fonctions?

Toute idée serait grandement appréciée.

Répondre

0

Je rencontrais exactement le même problème. Après la mise à jour du package à BiodiversityR_2.8-3, l'erreur a disparu.

(En utilisant les données que vous avez fournies)

BiodiversityR::CAPdiscrim(vars~group, 
          data = df, 
          dist = "euclidean", 
          axes = 4, 
          m = 0, 
          permutations = 999) 
#Percentage of correct classifications was 26.66667 
#Significance of this percentage was 0.98999 

#Overall classification success (m=1) : 26.6666666666667 percent 
#a (n=10) correct: 10 percent 
#b (n=10) correct: 70 percent 
#c (n=10) correct: 0 percent 
#Warning message: 
#In cmdscale(distmatrix, k = nrow(x) - 1, eig = T, add = add) : 
# only 18 of the first 29 eigenvalues are > 0 
+0

Merci pour la mise à jour @ J.Con.J'ai contacté l'auteur et ils m'ont fourni une solution temporaire pendant qu'ils étaient en train de mettre à jour le paquet. Je suis heureux d'apprendre que la nouvelle mise à jour a également résolu le problème. –