2014-06-17 2 views
6

contour (기본 R)에 해당하는 내용을 ggplot2로 플로팅하려면 어떻게해야합니까?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)) 

ggplot와 등고선 플롯 할 때, 매트릭스를 사용하는 것이 가능하지 않다 : 이하 선형 판별 함수를 분석 한 예이다. 상기 매트릭스는 용융물을 사용하여 데이터 프레임으로 재배치 될 수있다. 아래의 데이터 프레임에서 iris.pr1의 확률 값은 다음 두 열의 x 및 y 좌표와 함께 첫 번째 열에 표시됩니다. x와 y 좌표는 30 x 30 포인트의 그리드를 형성합니다.

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

I의 사후 확률은 0.5 (즉, 결정 입계) 인 좌표 (바람직 평활화 곡선에 의해 접속)을 플롯하고 싶다.

답변

6

ggplot에서 geom_contour을 사용하면 비슷한 효과를 얻을 수 있습니다. 올바르게 가정하면 데이터를 변형해야합니다. 난 그냥

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

을하고 그리고 당신이 geom_contour 해당 data.frame을 통과하고

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

0.5에서 휴식을 원하는 지정하고 그

ggplot with probability contour boundaries

를 제공 할 수 있습니다 결국
+0

선을 그리려면 등고선 플롯을 통과해야합니까? geom_line을 사용하는 다른 방법은 없습니까? – user3236841

0

klaR 라이브러리의 partimat 함수는 관찰 된 예측 변수에 대해 원하는 것을 수행하지만 LDA 예측에 대해 동일하게 사용하려는 경우 데이터 fr 즉, LD1 ... LDk 투영을 사용하여 원본을 보완 한 다음 수식 Group + LD1 + ... + LDk, method = 'lda'를 사용하여 partimat을 호출하면보고 싶은 "LD 평면"을 볼 수 있습니다. 너를 위해서. 이것은 적어도 의도적이지 않은 방식으로 이미 제공된 기능을 재사용하고 있기 때문에 적어도 R에 새로운 학생들에게 설명하는 것이 더 쉬워 보였습니다.