Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I plot a biplot for LDA in r?

Tags:

r

I did a linear discriminant analysis using the function lda() from the package MASS. Now I would try to plot a biplot like in ade4 package (forLDA). Do you know how can I do this?

If I try to use the biplot() function it doesn't work. For example, if I use the Iris data and make LDA:

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

then I can plot it using the function plot(), but if I use the function biplot() it doesn't work:

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

How can I plot the arrows of variables?

like image 444
alexmulo Avatar asked Jun 21 '13 09:06

alexmulo


1 Answers

I wrote the following function to do this:

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)
}

For your example:

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

The length of the arrows is arbitrary relative to the lda plot (but not to each other, of course!). If you want longer or shorter arrows, change the value of myscale accordingly. By default, this plots arrows for the first and second axes. If you want to plot other axes, change choices to reflect this.

like image 171
Tyler Avatar answered Sep 18 '22 22:09

Tyler