R-“;CAPdiscrim“;及;lda“;“错误”;变量1在组内似乎是常数;

R-“;CAPdiscrim“;及;lda“;“错误”;变量1在组内似乎是常数;,r,statistics,pca,vegan,linear-discriminant,R,Statistics,Pca,Vegan,Linear Discriminant,所以我一直在搜寻现有的问题来解决这个问题,但没有结果 我有一个由个体(117)组成的数据集,每个个体都有一个来自不同变量(12)的观察值,并由一个因子变量(8个级别)分组 我想根据安德森和威利斯方法对这些数据的主要坐标进行规范分析。我从使用BiodiversityR::CAPdiscrim开始。让我们从一些示例数据开始: individual <- c(1:30) group <- rep(c("a","b","c"), 10) Var1 <- rnorm(n = 30, me

所以我一直在搜寻现有的问题来解决这个问题,但没有结果

我有一个由个体(117)组成的数据集,每个个体都有一个来自不同变量(12)的观察值,并由一个因子变量(8个级别)分组

我想根据安德森和威利斯方法对这些数据的主要坐标进行规范分析。我从使用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)]
返回:

lda中出错。默认值(x,分组,…): 变量1在组中似乎是常量

我们可以使用nearZeroVar查看这是否为真(这似乎不是真的):

这提供了一些输出,但不包括
CAPdiscrim
的一些功能,例如允许函数通过排列确定“m”的最佳数字

有人能建议如何修改
CAPdiscrim()
中的公差吗?或者如何使用这些其他功能在发动机罩下手动执行
CAPdiscrim()
正在执行的操作


如有任何见解,将不胜感激

我遇到了完全相同的问题。将软件包更新为
bioversityr_2.8-3
后,错误消失

(使用您提供的数据)


BiodiversityR::CAPdiscrim的作者已经解决了这个问题,并在随后的软件包更新中推出了这个问题。这是一个基于绝对值的错误检查案例,从生态学的角度来看,绝对值与输入数据的相对值是有意义的

谢谢你的更新@J.Con。我联系了作者,他们在更新软件包的过程中为我提供了一个临时补丁。我很高兴听到新的更新也解决了这个问题。
vars <- df[3:8]
BiodiversityR::CAPdiscrim(vars~group,
                          data = df,
                          dist = "euclidean",
                          axes = 4,
                          m = 0,
                          permutations = 999)
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
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_pldist <- lda(x = PCA_vars$points,
                  grouping = df$group,
                  tol = 1.0e-25)
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