Rで最尤法を行おうと思ったのですが、ネットで調べてもいまいち分からなかったため自分で作ってみました。 自然な設定として線形回帰モデルを考え、最尤推定量を求めます。
モデル:
ここで. 誤差項の分布として を仮定。
設定:
N <- 1000 # サンプル数 mu <- c(5,2,3) # 回帰係数 sig <- 3 # 分散 X <- matrix(runif(3*N,min=1,max=5), nr=N, nc=3) # 説明変数行列 par.init <- c(2,2,2,1) # 最適化の初期値
対数尤度関数:
ここではの確率密度関数、 の番目の成分、の行。
log.likelihood <- function(y){ return(function(par){ mu1 <- par[1] mu2 <- par[2] mu3 <- par[3] mu <- c(mu1, mu2, mu3) sig <- par[2] return(sum(log(dnorm((y-X%*%mu)/sig, 0,1)/sig))) }) }
推定:
~ t <- proc.time() y0 <- X%*%mu + rnorm(N,0,sig) mle.sample <- optim(par.init, log.likelihood(y0), method = "L-BFGS-B", lower = c(-Inf,-Inf,-Inf,0), upper = c(Inf, Inf,Inf,Inf), control = list(fnscale = -1))$par proc.time()-t mle.sample ~
計算時間と推定結果
> proc.time()-t user system elapsed 0.006 0.001 0.006 > mle.sample [1] 4.670545 2.559163 2.805950 1.000000