【问题标题】:R - "CAPdiscrim" and "lda" error "variable 1 appears to be constant within groups"R - “CAPdiscrim”和“lda”错误“变量 1 在组内似乎是常数”
【发布时间】:2017-09-28 14:51:10
【问题描述】:

所以我一直在寻找解决这个问题的现有问题,但无济于事。

我有一个由个人 (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)

返回:

lda.default(x, grouping, ...) 中的错误: 变量 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(),所以我试图逐个分解这个分析:

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, grouping, ...) 中的错误: 变量 1 2 3 4 5 在组内似乎是常数

现在lda() 中有一个参数“tol”,可用于在处理非常小的数字时消除此错误,所以我可以这样做:

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

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

谁能建议如何修改CAPdiscrim() 中的容差?或者如何使用这些其他功能手动执行CAPdiscrim() 在后台执行的操作?

任何见解将不胜感激。

【问题讨论】:

    标签: r statistics pca vegan linear-discriminant


    【解决方案1】:

    我遇到了完全相同的问题。将包更新为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
    

    【讨论】:

    • 感谢@J.Con 的更新。我联系了作者,他们在更新软件包的过程中为我提供了临时修复。我很高兴听到新的更新也解决了这个问题。
    【解决方案2】:

    BiodiversityR::CAPdiscrim 的作者已修复此问题,并已在后续软件包更新中推出。这是一个依赖于从生态角度来看有意义的绝对值与与输入数据相比的相对值的错误检查的案例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 2012-09-24
      • 2020-02-23
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多