2013-06-21 40 views
4

我使用MASS包中的函數lda()進行了線性判別分析。現在我會嘗試繪製一個雙線圖,就像在ade4包(forLDA)中一樣。你知道我該怎麼做?如何在r中繪製LDA的雙標圖?

如果我嘗試使用biplot()函數,它不起作用。例如,如果我使用虹膜數據,並LDA:

dis2 <- lda(as.matrix(iris[, 1:4]), iris$Species) 

那麼我就可以使用功能plot()繪製它,但如果我使用的功能biplot()這是行不通的:

biplot(dis2) 
Error in nrow(y) : argument "y" is missing, with no default 

我如何繪製變量的箭頭?

+1

當然,它沒有工作。 LDA不是你打算用雙標圖繪製的東西。你爲什麼認爲你可以這樣做? @PaulHiemstra給出的代碼是可重現的;只需加載包含'lda'和'biplot'函數的'MASS'包。 –

+0

他們是怎麼做到的? http://en.wikipedia.org/wiki/File:IrisDAbiplot.jpg – alexmulo

+0

@洪Ooi https://www.researchgate.net/publication/24056082_Extensions_of_Biplot_Methodology_to_Discriminant_Analysis –

回答

1

我寫了下面的函數來做到這一點:

lda.arrows <- function(x, myscale = 1, tex = 0.75, choices = c(1,2), ...){ 
    ## adds `biplot` arrows to an lda using the discriminant function values 
    heads <- coef(x) 
    arrows(x0 = 0, y0 = 0, 
     x1 = myscale * heads[,choices[1]], 
     y1 = myscale * heads[,choices[2]], ...) 
    text(myscale * heads[,choices], labels = row.names(heads), 
    cex = tex) 
} 

對於示例:

dis2 <- lda(as.matrix(iris[, 1:4]), iris$Species) 
plot(dis2, asp = 1) 
lda.arrows(dis2, col = 2, myscale = 2) 

箭頭的長度是相對隨意的LDA陰謀(但不給對方,當然!)。如果您想要更長或更短的箭頭,請相應地更改myscale的值。默認情況下,它會繪製第一個和第二個軸的箭頭。如果要繪製其他座標軸,請更改choices以反映此情況。

+0

非常感謝你,我會試試看,這非常有幫助。 – alexmulo

+0

@alexmulo:如果您發現有幫助的答案,通常會給它一個upvote。您也可以通過點擊「接受答案」複選標記來指出哪個答案最能解決您的問題。 – Tyler

1

我的理解是,線性判別分析的二維圖可以做到的,它實際上是在實施也R中包ggbiplot,見https://github.com/vqv/ggbiplot/tree/experimental和封裝ggord,看到https://github.com/fawda123/ggord,爲您的示例:

install.packages("devtools") 
library(devtools) 
install_github("fawda123/ggord") 
library(ggord) 
ord <- lda(Species ~ ., iris, prior = rep(1, 3)/3) 
ggord(ord, iris$Species) 

enter image description here

M. Greenacre的書「實踐中的Biplots」在其上有一章(第11章),在圖11.5中它顯示了虹膜數據集的線性判別分析的雙標圖: enter image description here