2014-06-17 10 views
6

Come si traccia l'equivalente di contour (base R) con ggplot2? Di seguito un esempio di analisi discriminante lineare:Tracciare i limiti decisionali con ggplot2?

require(MASS) 
iris.lda<-lda(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris) 
datPred<-data.frame(Species=predict(iris.lda)$class,predict(iris.lda)$x) #create data.frame 

#Base R plot 
eqscplot(datPred[,2],datPred[,3],pch=as.double(datPred[,1]),col=as.double(datPred[,1])+1) 

#Create decision boundaries 
iris.lda2 <- lda(datPred[,2:3], datPred[,1]) 
x <- seq(min(datPred[,2]), max(datPred[,2]), length.out=30) 
y <- seq(min(datPred[,3]), max(datPred[,3]), length.out=30) 
Xcon <- matrix(c(rep(x,length(y)), 
      rep(y, rep(length(x), length(y)))),,2) #Set all possible pairs of x and y on a grid 

iris.pr1 <- predict(iris.lda2, Xcon)$post[, c("setosa","versicolor")] %*% c(1,1) #posterior probabilities of a point belonging to each class 
contour(x, y, matrix(iris.pr1, length(x), length(y)), 
    levels=0.5, add=T, lty=3,method="simple") #Plot contour lines in the base R plot 
iris.pr2 <- predict(iris.lda2, Xcon)$post[, c("virginica","setosa")] %*% c(1,1) 
contour(x, y, matrix(iris.pr2, length(x), length(y)), 
    levels=0.5, add=T, lty=3,method="simple") 

#Eqivalent plot with ggplot2 but without decision boundaries 
ggplot(datPred, aes(x=LD1, y=LD2, col=Species)) + 
geom_point(size = 3, aes(pch = Species)) 

Non è possibile utilizzare una matrice durante la stampa le linee di contorno con ggplot. La matrice può essere riorganizzata su un frame di dati mediante fusione. Nel riquadro dati sottostante i valori di probabilità di iris.pr1 vengono visualizzati nella prima colonna insieme alle coordinate x e y nelle due colonne seguenti. Le coordinate xey formano una griglia di 30 x 30 punti.

df <- transform(melt(matrix(iris.pr1, length(x), length(y))), x=x[X1], y=y[X2])[,-c(1,2)] 

desidero tracciare le coordinate (preferibilmente collegati da una curva levigata) dove le probabilità a posteriori sono 0,5 (cioè i confini decisione).

risposta

6

È possibile utilizzare geom_contour in ggplot per ottenere un effetto simile. Come hai correttamente ipotizzato, devi trasformare i tuoi dati. Ho finito solo facendo

pr<-data.frame(x=rep(x, length(y)), y=rep(y, each=length(x)), 
    z1=as.vector(iris.pr1), z2=as.vector(iris.pr2)) 

E poi si può passare che data.frame al geom_contour e specificare che si desidera che le pause di 0,5 con

ggplot(datPred, aes(x=LD1, y=LD2)) + 
    geom_point(size = 3, aes(pch = Species, col=Species)) + 
    geom_contour(data=pr, aes(x=x, y=y, z=z1), breaks=c(0,.5)) + 
    geom_contour(data=pr, aes(x=x, y=y, z=z2), breaks=c(0,.5)) 

e che dà

ggplot with probability contour boundaries

+0

Per disegnare una linea, dobbiamo passare attraverso una trama di contorno? Non c'è altro modo con geom_line? – user3236841

0

La funzione partimat nella libreria klaR esegue ciò che si desidera per i predittori osservati, ma se si desidera lo stesso per le proiezioni LDA, è possibile creare un dato come aumentare l'originale con le proiezioni LD1 ... LDk, quindi chiamare partimat con la formula Gruppo ~ LD1 + ... + LDk, metodo = 'lda' - quindi si vede il "piano LD" che si intendeva vedere, ben suddiviso in partizioni per te. Mi è sembrato più facile, almeno per spiegare agli studenti più recenti a R, dal momento che sto solo riutilizzando una funzione già fornita in un modo in cui non era del tutto intenzionale.

Problemi correlati