2017-11-12 19 views
2

가우스 혼합을 사용하는 분포를 근사하고 전체 (1 차원) 데이터 세트의 추정 된 커널 밀도를 구성 요소의 합계로 자동적으로 플롯 할 수있는 쉬운 방법이 있는지 궁금합니다. 이 사용 ggplot2 같은 좋은 방식으로 밀도 :ggplot2를 사용하여 R에 플롯 가우시안 혼합물을 표시합니다.

#example data 
a<-rnorm(1000,0,1) #component 1 
b<-rnorm(1000,5,2) #component 2 
d<-c(a,b) #overall data 
df<-data.frame(d,id=rep(c(1,2),each=1000)) #add group id 

##ggplot2 
require(ggplot2) 

ggplot(df) + 
    geom_density(aes(x=d,y=..scaled..)) + 
    geom_density(data=subset(df,id==1), aes(x=d), lty=2) + 
    geom_density(data=subset(df,id==2), aes(x=d), lty=4) 
다음 예제 데이터 감안할 때

Full data density plotted with single component densities

, ggplot2 나의 접근 방식은 수동으로이 같은 조정 전체 밀도에 집합 밀도를 음모하는 것

ggplot2 Plot

저울에 대해서는 작동하지 않는다는 점에 유의하십시오. 또한 3 가지 농도를 모두 조절하거나 전혀 농도를 조절하지 않으면 작동하지 않습니다. 그래서 나는 위의 줄거리를 복제 할 수 없었습니다.

또한 수동으로 하위 집합을 지정하지 않고도이 플롯을 자동으로 생성 할 수는 없습니다. geom_density에서 position = "stacked"를 매개 변수로 사용해 보았습니다.

일반적으로 데이터 세트 당 약 5-6 개의 구성 요소가 있으므로 수동으로 하위 집합을 만들 수 있습니다. 그러나 ggplot의 범례에 표시되는 구성 요소 밀도마다 다른 색상이나 선 유형을 사용하고 싶습니다. 따라서 모든 하위 세트를 수동으로 수행하면 작업량이 상당히 증가합니다.

아이디어가 있으십니까? 감사합니다.

답변

2

aes의 각 밀도를 한 레이어에 position = "identity"으로 지정하고 두 번째 레이어에 범례없이 누적 밀도를 사용하여 지정할 수 있습니다. 이것은 위장 제 층에서 두 그룹 예에 문제이지만 linetype이다 (나타나는 각 스택

a <- rnorm(1000, 0, 1) 
    b <- rnorm(1000, 5, 2) 
    c <- rnorm(1000, 3, 2) 
    d <- rnorm(1000, -2, 1) 
    d <- c(a, b, c, d) 
    df <- data.frame(d, id = as.factor(rep(c(1, 2, 3, 4), each = 1000))) 

곡선 :

enter image description here

ggplot(df) + 
    stat_density(aes(x = d, linetype = as.factor(id)), position = "stack", geom = "line", show.legend = F, color = "red") + 
    stat_density(aes(x = d, linetype = as.factor(id)), position = "identity", geom = "line") 
보다 두 개의 그룹을 사용할 때 유의 함 대신 group을 사용하십시오.

gplot(df) + 
    stat_density(aes(x = d, group = id), position = "stack", geom = "line", show.legend = F, color = "red") + 
    stat_density(aes(x = d, linetype = id), position = "identity", geom = "line") 
이에

enter image description here

비교적 쉽게 수정 원치 않는 커브 0으로 알파 매핑을 추가하고 수동으로 설정하는 것이다

ggplot(df) + 
    stat_density(aes(x=d, alpha = id), position = "stack", geom = "line", show.legend = F, color = "red") + 
    stat_density(aes(x=d, linetype = id), position = "identity", geom = "line")+ 
    scale_alpha_manual(values = c(1,0,0,0)) 

enter image description here