在 R 中绘制 lda 对象

Plotting lda-object in R

我正在尝试绘制一个使用 MASS 包的 lda 函数创建的 lda 对象。

我使用的数据在这里: https://pastebin.com/yjfmsE3F

我当前的代码是:

types <- c('GO', 'GO', 'GO', 'GO', 'GO', 'OO', 'OR', 'OO', 'OO', 'GO', 'GR', 'OO', 'OO', 'GO')
bacDummy <- t(bacCountData)
bacDummy2 <- decostand(bacDummy, "freq")
bacDummy3 <- cbind(types, bacDummy2)
colnames(bacDummy3)[1] <- "Site"
bacDummy4 <- as.data.frame(bacDummy3)

其中 decostand 来自 vegan 包。

然后我继续尝试使用 lda-函数:

bac.lda <- lda(bacDummy4[,2:170], grouping=types)

这给了我以下错误:

Error in lda.default(x, grouping, ...) : 
  variables   4  53 114 138 appear to be constant within groups

然后我删除了麻烦的列(即使我知道这是肮脏的工作):

bacDummy4 <- bacDummy4[,-139]
bacDummy4 <- bacDummy4[,-115]
bacDummy4 <- bacDummy4[,-54]
bacDummy4 <- bacDummy4[,-5]

这让我可以做 LDA,但是有警告:In lda.default(x, grouping, ...) : variables are collinear

当我尝试在散点图中绘制组时,出现以下错误:

plot(bac.lda)
Error in FUN(x, aperm(array(STATS, dims[perm]), order(perm)), ...) : 
  non-numeric argument to binary operator

我做错了什么?如果我这样做 str(bac.lda) 我得到这个输出:

List of 8
 $ prior  : Named num [1:4] 0.5 0.0714 0.3571 0.0714
  ..- attr(*, "names")= chr [1:4] "GO" "GR" "OO" "OR"
 $ counts : Named int [1:4] 7 1 5 1
  ..- attr(*, "names")= chr [1:4] "GO" "GR" "OO" "OR"
 $ means  : num [1:4, 1:165] 6.14 1 2.2 5 2.14 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:4] "GO" "GR" "OO" "OR"
  .. ..$ : chr [1:165] "ReferenceOTU1484" "ReferenceOTU893" "ReferenceOTU1445" "ReferenceOTU623" ...
 $ scaling: num [1:165, 1:3] -0.01649 -0.03767 -0.00607 0.04141 -0.03966 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:165] "ReferenceOTU1484" "ReferenceOTU893" "ReferenceOTU1445" "ReferenceOTU623" ...
  .. ..$ : chr [1:3] "LD1" "LD2" "LD3"
 $ lev    : chr [1:4] "GO" "GR" "OO" "OR"
 $ svd    : num [1:3] 4.54 3.06 2.03
 $ N      : int 14
 $ call   : language lda(x = bacDummy4[, -1], grouping = bacDummy4$Site)
 - attr(*, "class")= chr "lda"

非常感谢所有帮助!

您应该注意在每个 t运行 形成期间仔细跟踪变量的数据类型。我 运行 遇到了您提供的代码的一些问题。这似乎有效

bacCountData <- read.csv("https://pastebin.com/raw/yjfmsE3F", header=T, row.names=1)
types <- c('GO', 'GO', 'GO', 'GO', 'GO', 'OO', 
    'OR', 'OO', 'OO', 'GO', 'GR', 'OO', 'OO', 'GO')

bacDummy <- t(bacCountData)
bacDummy2 <- vegan::decostand(bacDummy, "freq")
bacDummy3 <- data.frame(types=types, bacDummy2)
colnames(bacDummy3)[1] <- "Site"

bac.lda <- MASS::lda(bacDummy3[,-c(1, 5, 54, 115, 139)], grouping=types)
plot(bac.lda)

并产生以下情节