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.
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. –