所以我一直在寻找现有问题的解决方案,但无济于事。
我有一个由个体 (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]
现在我们可以对数据运行 CAPdiscrim
BiodiversityR::CAPdiscrim(vars~group,
data = df,
dist = "euclidean",
axes = 4,
m = 0,
permutations = 999)
返回:
我们可以使用 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(),所以我试图逐个分解这个分析:
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()
中有一个参数“tol”,可用于在处理非常小的数字时消除此错误,因此我可以这样做:LDA_pldist <- lda(x = PCA_vars$points,
grouping = df$group,
tol = 1.0e-25)
这提供了一些输出,但不包括
CAPdiscrim
的一些功能,例如允许函数通过排列确定“m”的最佳数字。谁能建议如何修改
CAPdiscrim()
中的容差?或者如何使用这些其他功能手动执行 CAPdiscrim()
在幕后所做的事情?任何见解将不胜感激。
最佳答案
我遇到了完全相同的问题。将包更新为 BiodiversityR_2.8-3
后,错误消失了。
(使用您提供的数据)
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
关于R - "CAPdiscrim"和 "lda"错误 "variable 1 appears to be constant within groups",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43714875/