2017-11-12 25 views
2

私はガウス混合分布を近似しており、全体(一次元)データセットの推定カーネル密度をコンポーネントの合計として簡単にプロットできるかどうか疑問に思っていましたこの使用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の各密度を1つのレイヤーでposition = "identity"と指定し、2番目のレイヤーで、凡例なしで密度を使用して密度を指定することによって、可能な解決策があります。

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

enter image description here

より、2つのグループ使用時にご注意ください:

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

を各スタックの曲線は、(この2つのグループの例の問題ですが、1層目のlinetypeを装っ見えます代わりに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