2015-08-08 11 views
18

Verwendung ggord man kann schön linearen Diskriminanzanalyse ggplot2 Biplots (CF Kapitel 11, 11.5 in Fig "Biplots in der Praxis" von M. Greenacre) machen, wie es inR: Plotten posterior Klassifizierungswahrscheinlichkeiten einer linearen Diskriminanzanalyse in ggplot2

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

enter image description here

ich würde auch die Klassifikationsbereiche hinzufügen, um (als Feststoff Regionen der gleichen Farbe wie ihre jeweilige Gruppe dargestellt mit sagen, alpha = 0,5) oder dem Posteriori-Wahrscheinlichkeiten einer Klassenmitgliedschaft (mit alpha dann Variieren nach dieser hinteren Wahrscheinlichkeit und die gleiche Farbe wie für jede Gruppe verwendet) (wie in BiplotGUI getan werden kann, aber ich suche nach einer ggplot2 Lösung). Würde jemand wissen, wie man das mit ggplot2 macht, vielleicht unter Verwendung ?

BEARBEITEN: unten fragt jemand, wie man die hinteren Klassifikationswahrscheinlichkeiten berechnet & vorhergesagten Klassen. Dies geht so:

library(MASS) 
library(ggplot2) 
library(scales) 
fit <- lda(Species ~ ., data = iris, prior = rep(1, 3)/3) 
datPred <- data.frame(Species=predict(fit)$class,predict(fit)$x) 
#Create decision boundaries 
fit2 <- lda(Species ~ LD1 + LD2, data=datPred, prior = rep(1, 3)/3) 
ld1lim <- expand_range(c(min(datPred$LD1),max(datPred$LD1)),mul=0.05) 
ld2lim <- expand_range(c(min(datPred$LD2),max(datPred$LD2)),mul=0.05) 
ld1 <- seq(ld1lim[[1]], ld1lim[[2]], length.out=300) 
ld2 <- seq(ld2lim[[1]], ld1lim[[2]], length.out=300) 
newdat <- expand.grid(list(LD1=ld1,LD2=ld2)) 
preds <-predict(fit2,newdata=newdat) 
predclass <- preds$class 
postprob <- preds$posterior 
df <- data.frame(x=newdat$LD1, y=newdat$LD2, class=predclass) 
df$classnum <- as.numeric(df$class) 
df <- cbind(df,postprob) 
head(df) 

      x  y  class classnum  setosa versicolor virginica 
1 -10.122541 -2.91246 virginica  3 5.417906e-66 1.805470e-10   1 
2 -10.052563 -2.91246 virginica  3 1.428691e-65 2.418658e-10   1 
3 -9.982585 -2.91246 virginica  3 3.767428e-65 3.240102e-10   1 
4 -9.912606 -2.91246 virginica  3 9.934630e-65 4.340531e-10   1 
5 -9.842628 -2.91246 virginica  3 2.619741e-64 5.814697e-10   1 
6 -9.772650 -2.91246 virginica  3 6.908204e-64 7.789531e-10   1 

colorfun <- function(n,l=65,c=100) { hues = seq(15, 375, length=n+1); hcl(h=hues, l=l, c=c)[1:n] } # default ggplot2 colours 
colors <- colorfun(3) 
colorslight <- colorfun(3,l=90,c=50) 
ggplot(datPred, aes(x=LD1, y=LD2)) + 
    geom_raster(data=df, aes(x=x, y=y, fill = factor(class)),alpha=0.7,show_guide=FALSE) + 
    geom_contour(data=df, aes(x=x, y=y, z=classnum), colour="red2", alpha=0.5, breaks=c(1.5,2.5)) + 
    geom_point(data = datPred, size = 3, aes(pch = Species, colour=Species)) + 
    scale_x_continuous(limits = ld1lim, expand=c(0,0)) + 
    scale_y_continuous(limits = ld2lim, expand=c(0,0)) + 
    scale_fill_manual(values=colorslight,guide=F) 

enter image description here

(auch nicht ganz sicher, dieser Ansatz für Grenzen Klassifizierung zeigt Konturen/Pausen bei 1,5 und 2,5 verwendet, ist immer richtig - es ist richtig für die Grenze zwischen den Arten 1 und 2 und 2 und 3, aber nicht, wenn die Region von Spezies 1 neben Spezies 3 wäre, da würde ich dann zwei Grenzen bekommen - vielleicht müsste ich den Ansatz here verwenden, wo jede Grenze zwischen jedem Artenpaar betrachtet wird separat)

Das bringt mich soweit wie plotti ng der Klassifikationsregionen. Ich suche jedoch nach einer Lösung, um auch die tatsächlichen hinteren Klassifikationswahrscheinlichkeiten für jede Art an jeder Koordinate aufzutragen, wobei Alpha (Opakheit) proportional zur späteren Klassifikationswahrscheinlichkeit für jede Art und eine artspezifische Farbe verwendet wird. Mit anderen Worten, mit einem Stapel von drei Bildern überlagert. Als Alpha-Blending in ggplot2 bekannt ist order-dependent zu sein, ich denke, die Farben dieses Stapels würde vorher allerdings berechnet haben, und geplottet so etwas wie

qplot(x, y, data=mydata, fill=rgb, geom="raster") + scale_fill_identity() 

Here is a SAS example of what I am after mit:

enter image description here

würde jemand wissen, wie man das vielleicht macht? Oder hat jemand irgendwelche Gedanken darüber, wie man diese posterioren Klassifikationswahrscheinlichkeiten am besten darstellen kann?

Beachten Sie, dass die Methode für eine beliebige Anzahl von Gruppen funktionieren sollte, nicht nur für dieses spezielle Beispiel.

+0

können Sie ein Beispiel für Ihr Datenlayout hinzufügen? – Benvorth

+0

ah, Iris, vergiss meine Frage :-) – Benvorth

+0

Können Sie die Daten (Klassifikationsregionen, Posterior-Wahrscheinlichkeiten), die geplottet werden sollen, extrahieren? – tonytonov

Antwort

4

Auch gerade kam die folgende einfache Lösung: nur eine Spalte in df, wo Klassen Vorhersagen sind stochastisch gemacht, entsprechend den späteren Wahrscheinlichkeiten, die dann zu Dithering in unsicheren Regionen, z.wie in

fit = lda(Species ~ Sepal.Length + Sepal.Width, data = iris, prior = rep(1, 3)/3) 
ld1lim <- expand_range(c(min(datPred$LD1),max(datPred$LD1)),mul=0.5) 
ld2lim <- expand_range(c(min(datPred$LD2),max(datPred$LD2)),mul=0.5) 

Rest wie oben, und

lvls=unique(df$class) 
df$classpprob=apply(df[,as.character(lvls)],1,function(row) sample(lvls,1,prob=row)) 

p=ggplot(datPred, aes(x=LD1, y=LD2)) + 
    geom_raster(data=df, aes(x=x, y=y, fill = factor(classpprob)),hpad=0, vpad=0, alpha=0.7,show_guide=FALSE) + 
    geom_point(data = datPred, size = 3, aes(pch = Group, colour=Group)) + 
    scale_fill_manual(values=colorslight,guide=F) + 
    scale_x_continuous(limits=rngs[[1]], expand=c(0,0)) + 
    scale_y_continuous(limits=rngs[[2]], expand=c(0,0)) 

Einfügen gibt mir enter image description here

viel einfacher und klarer als Ausgang ohnehin Farben in einem gewissen additiven oder subtraktiven Art und Weise zu vermischen (was der Teil, wo ich noch Schwierigkeiten hatte, und der anscheinend nicht so trivial ist, gut zu machen).

6

Ich nehme an, der einfachste Weg wird sein, die posterioren Wahrscheinlichkeiten zu zeigen. Es ist ziemlich einfach für Ihren Fall:

datPred$maxProb <- apply(predict(fit)$posterior, 1, max) 
ggplot(datPred, aes(x=LD1, y=LD2)) + 
    geom_raster(data=df, aes(x=x, y=y, fill = factor(class)),alpha=0.7,show_guide=FALSE) + 
    geom_contour(data=df, aes(x=x, y=y, z=classnum), colour="red2", alpha=0.5, breaks=c(1.5,2.5)) + 
    geom_point(data = datPred, size = 3, aes(pch = Species, colour=Species, alpha = maxProb)) + 
    scale_x_continuous(limits = ld1lim, expand=c(0,0)) + 
    scale_y_continuous(limits = ld2lim, expand=c(0,0)) + 
    scale_fill_manual(values=colorslight, guide=F) 

enter image description here

Sie die Punkte, an blau-grünen Grenze mischen sehen.

+1

nice possible solution - danke dafür! Obwohl ich es vorziehen würde, meine Punkte nicht als z. Ich habe immer noch daran gedacht, falsch klassifizierte in rot hervorzuheben, und vielleicht sind nicht alle Teile der Regionen gut durch Punkte dargestellt. Ich suche also immer noch nach einer Lösung, um ihnen zu zeigen, dass sie im schattierten Hintergrundteil Alpha-Schattierungen verwenden, um etwas wie die SAS-Ausgabe zu erhalten. Trotzdem +1! –