【问题标题】:LDA contribution biplotLDA 贡献双标图
【发布时间】:2017-02-28 12:15:39
【问题描述】:

我正在尝试为线性判别分析 (LDA) 创建双图。我正在使用从这里获得的代码的修改版本https://stats.stackexchange.com/questions/82497/can-the-scaling-values-in-a-linear-discriminant-analysis-lda-be-used-to-plot-e

但是,我有 80 个变量,这使得双标图非常难以阅读。高度贡献的变量会加剧这种情况,因为它们的箭头长度很长,并且剩余的标签在中间被挤压。 所以我想要实现的是一个双标图,其中所有可变箭头的长度相同,并且它们的相对贡献(比例)通过分级颜色来区分。 到目前为止,我已经设法获得分级颜色,但我找不到使箭头长度相同的方法。据我了解,geom_textgeom_segment 使用 LD1 和 LD2 值来确定箭头的 lengthdirection。如何覆盖长度?

代码:

library(ggplot2)
library(grid)
library(MASS)
data(iris)


iris.lda <- lda(as.factor(Species)~.,
                data=iris)

#Project data on linear discriminants
iris.lda.values <- predict(iris.lda, iris[,-5])

#Extract scaling for each predictor and
data.lda <- data.frame(varnames=rownames(coef(iris.lda)), coef(iris.lda))

#coef(iris.lda) is equivalent to iris.lda$scaling

data.lda$length <- with(data.lda, sqrt(LD1^2+LD2^2))

#Plot the results
p <- qplot(data=data.frame(iris.lda.values$x),
           main="LDA",
           x=LD1,
           y=LD2,
           colour=iris$Species)+stat_ellipse(geom="polygon", alpha=.3, aes(fill=iris$Species))
p <- p + geom_hline(aes(yintercept=0), size=.2) + geom_vline(aes(xintercept=0), size=.2)
p <- p + theme(legend.position="right")
p <- p + geom_text(data=data.lda,
                   aes(x=LD1, y=LD2,
                       label=varnames, 
                       shape=NULL, linetype=NULL,
                       alpha=length, position="identity"),
                   size = 4, vjust=.5,
                   hjust=0, color="red")
p <- p + geom_segment(data=data.lda,
                      aes(x=0, y=0,
                          xend=LD1, yend=LD2,
                          shape=NULL, linetype=NULL,
                          alpha=length),
                      arrow=arrow(length=unit(0.1,"mm")),
                      color="red")
p <- p + coord_flip()

print(p)

【问题讨论】:

    标签: r ggplot2 pca


    【解决方案1】:

    这样的事情怎么样?我们必须做一些三角函数来使长度相等。请注意,相等是在绘图坐标中,因此如果您想实际显示为相等大小,则需要添加coord_equal

    (我清理了你的绘图代码,因为其中很多都非常混乱。)

    rad <- 3 # This sets the length of your lines.
    data.lda$length <- with(data.lda, sqrt(LD1^2+LD2^2))
    data.lda$angle <- atan2(data.lda$LD1, data.lda$LD2)
    data.lda$x_start <- data.lda$y_start <- 0
    data.lda$x_end <- cos(data.lda$angle) * rad
    data.lda$y_end <- sin(data.lda$angle) * rad
    
    #Plot the results
    ggplot(cbind(iris, iris.lda.values$x),
           aes(y = LD1, x = LD2, colour = Species)) + 
      stat_ellipse(aes(fill = Species), geom = "polygon", alpha = .3) +
      geom_point() +
      geom_hline(yintercept = 0, size = .2) + 
      geom_vline(xintercept = 0, size = .2) +
      geom_text(aes(y = y_end, x = x_end, label = varnames, alpha = length),
                data.lda, size = 4, vjust = .5, hjust = 0, colour = "red") +
      geom_spoke(aes(x_start, y_start, angle = angle, alpha = length), data.lda, 
                 color = "red", radius = rad, size = 1) +
      ggtitle("LDA") +
      theme(legend.position = "right")
    

    【讨论】:

    • 真的太棒了!我永远不会想出这个。谢谢!
    【解决方案2】:

    我认为我有一个更简单的代码来实现双标图。我希望下面的代码有所帮助。我已使用 IRIS 数据集进行分析

    library(readr)
    IR <- read_csv("D:/Keerthesh/R Folder/DataSet/Iris.csv")
    
    # --- data partition -- #
    set.seed(555)
    IRSam <- sample.int(n = nrow(IR), size = floor(.60*nrow(IR)), replace = FALSE, prob = NULL)
    IRTrain <- IR[IRSam,]
    IRTest <- IR[-IRSam,]
    
    library(MASS)
    IR.lda <- lda(Species~. -Id, data=IRTrain)
    print(IR.lda)
    

    要绘制双标图,您需要从 github 安装 ggord 包。

    library(devtools)
    install_github('fawda123/ggord') --- Used to install ggord from github we need to run devtools to achieve this.
    library(ggord)
    ggord(IR.lda, IRTrain$Species, ylim=c(-5,5), xlim=c(-10,10))
    

    【讨论】:

    • 这并没有回答问题,不是“如何制作双标图”,而是如何制作等长的箭头。
    猜你喜欢
    • 1970-01-01
    • 2020-05-19
    • 2013-01-08
    • 1970-01-01
    • 2021-05-05
    • 2017-03-03
    • 2011-09-13
    • 2011-10-10
    • 2021-05-13
    相关资源
    最近更新 更多