【问题标题】:Plotting lda-object in R在 R 中绘制 lda 对象
【发布时间】:2017-03-31 04:33:17
【问题描述】:

我正在尝试绘制使用 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-function:

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"

非常感谢所有帮助!

【问题讨论】:

    标签: r plot lda


    【解决方案1】:

    您应该注意在每次转换期间仔细跟踪变量的数据类型。我在您提供的代码中遇到了一些问题。这似乎有效

    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)
    

    并产生以下情节

    【讨论】:

    • 非常感谢!你知道我的错误到底在哪里吗?
    • 我猜是cbind。永远不要将 data.types 与 cbind 混合使用,因为默认情况下它适用于只能保存单个原子数据类型的矩阵,而 data.frames 可以保存不同类型的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2020-08-14
    • 2013-10-22
    • 2017-03-27
    • 2013-04-26
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多