Q.
正規分布に従っていると考えられるデータに対して正規分布をあてはめたいです。最尤推定で平均パラメータと標準偏差パラメータを求めて、求めた結果の正規分布を描きたいです。
A.
「正規分布など好きな関数の曲線を描きたい」を参考にします。以下、コード例です。
OK_example.R
library(ggplot2)
set.seed(123)
X <- rnorm(20, mean=0.3, sd=1.2)
logLikelihood <- function(args, x){
likelihood <- 1/sqrt(2*pi*args[2]^2)*exp(-0.5*((x-args[1])/args[2])^2)
return(sum(log(likelihood)))
}
mle <- optim(par=c(0,1), fn=logLikelihood, x=X, control=list(fnscale=-1))$par
d <- data.frame(x=X, y=0, xend=X, yend=dnorm(X, mean=mle[1], sd=mle[2]))
p <- ggplot()
p <- p + geom_rug(data=data.frame(X=X), aes(x=X), sides="b")
p <- p + geom_segment(data=d, aes(x=x, y=y, xend=xend, yend=yend), linetype="dotted", size=0.25)
p <- p + stat_function(data=data.frame(X=c(-4,4)), aes(x=X), fun=dnorm, args=list(mean=mle[1], sd=mle[2]))
logLikelihood
関数で対数尤度を定義しています。他の関数をあてはめるときはここを変えます。最尤推定はoptim
が便利だと思います。使い方の詳細は他のサイトを参照してください。
ラグを描きたい時はそのものであるgeom_rug
がありますのでそれを使います。つながらない線分を描くときはgeom_segment
で描いていきます。これでラグから関数までの点線を描いています。そして、既存の関数を描くときはstat_function
を使うのでした。
参考資料
http://stackoverflow.com/questions/17649759/fitting-gaussian-to-data-geom-point-in-ggplot2/17650549#17650549
http://nekopuni.holy.jp/2013/12/r%E6%9C%80%E9%81%A9%E5%8C%96%E3%80%80%E6%9C%80%E5%B0%A4%E6%8E%A8%E5%AE%9A%E3%81%AE%E7%B7%B4%E7%BF%92/