LoginSignup
16
15

More than 5 years have passed since last update.

最尤推定であてはめて正規分布を描く

Posted at

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を使うのでした。

OK.png

参考資料

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/

16
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
15