所以我一直在通过现有的问题来解决这个问题,但无济于事。R - “CAPdiscrim”和“lda”错误“变量1在组内”似乎是不变的“
我有一个由个人(117)组成的数据集,每个个人都有来自不同变量(12)的观察结果,并且由具有8个级别的因子变量分组。
我想根据Anderson和Willis的方法对这些数据的主要坐标进行规范分析。我开始使用BiodiversityR :: CAPdiscrim。让我们先从一些示例数据:
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需要以特定格式数据:
:vars <- df[3:8]
现在我们可以对数据
BiodiversityR::CAPdiscrim(vars~group,
data = df,
dist = "euclidean",
axes = 4,
m = 0,
permutations = 999)
它返回运行CAPdiscrim
lda.default(x,分组,...)中的错误: 变量1似乎组内恒定
我们可以使用nearZeroVar,看看如果这是真的(这似乎是不正确的):
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
现在我看到关于此错误的其他问题具体到LDA()和我注意到,CAPdiscrim()调用vegdist(),cmdscale()和LDA(),所以我试图通过peice的打破这种分析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)
它返回一个非常相似的结果:
错误lda.default(X,分组,...): 变量1 2 3 4 5似乎组内是恒定的现在
在lda()
有一种说法 “TOL”可以使用非常小的数字打交道时消除这种误差,这样我就可以做到这一点:
LDA_pldist <- lda(x = PCA_vars$points,
grouping = df$group,
tol = 1.0e-25)
这提供了一些输出,但不包括一些的CAPdiscrim
的功能,如允许的功能determi ne通过排列成为“m”的最佳数字。
任何人都可以建议如何修改公差CAPdiscrim()
?或如何执行什么CAPdiscrim()
手动引擎盖下做这些其他功能?
任何有识之士将不胜感激。
感谢您的更新@ J.Con。我联系了作者,他们在更新软件包的过程中为我提供了临时修复。我很高兴听到新的更新也解决了这个问题。 –