[R] Help: Maximum likelihood estimation
Ravi Varadhan
rvaradhan at jhmi.edu
Mon Oct 25 04:14:17 CEST 2010
Can you provide a reproducible code?
Ravi.
____________________________________________________________________
Ravi Varadhan, Ph.D.
Assistant Professor,
Division of Geriatric Medicine and Gerontology
School of Medicine
Johns Hopkins University
Ph. (410) 502-2619
email: rvaradhan at jhmi.edu
----- Original Message -----
From: roach <roachyang at gmail.com>
Date: Saturday, October 23, 2010 4:41 am
Subject: Re: [R] Help: Maximum likelihood estimation
To: r-help at r-project.org
> I'm not quite familiar with E-M algorithm, but I think what I did was
> the
> first step of the iteration.
> The method used in the original article is as follow:
>
> I gave lamda an initial value, and maximized the likelihood function.
> This is the complete chunk of my code after using "alabama" package.
>
> The first iteration had no problem, but after a few iterations, I
> again got
> warnings and the result is not good.
> Is it possible that it's because of some computational problems? because
> there are too many log and exp in the functions? Or is there anything
> I
> missed?
>
>
> library("alabama")
> # n=number of observation
> w=seq(0.05,0.9,length.out=n)
> # iteration
> repeat{
> lamda=mean(w)
> ## -log likelihood function
> log.L=function(parm){
> alpha0=parm[1]
> alpha1=parm[2]
> alpha2=parm[3]
> beta0=parm[4]
> beta1=parm[5]
> beta2=parm[6]
> beta3=parm[7]
> # here sigma is actually sigma inverse
> sigma11=parm[8]
> sigma12=parm[9]
> sigma21=parm[10]
> sigma22=parm[11]
>
> u1=-alpha0-alpha1*logp-alpha2*lakes+logq
> u21=-beta0-beta1*logq-beta2*s-beta3+logp
> u22=-beta0-beta1*logq-beta2*s+logp
> expon1=u1^2*sigma11+u1*u21*sigma12+u1*u21*sigma21+u21^2*sigma22
> expon2=u1^2*sigma11+u1*u22*sigma12+u1*u22*sigma21+u22^2*sigma22
> const=-log(2*pi)+.5*log(sigma11*sigma22-sigma12*sigma21)+log(abs(1-alpha1*beta1))
> logf=const+log(lamda*exp(-0.5*expon1)+(1-lamda)*exp(-0.5*expon2))
> log.L=-sum(logf)
> return(log.L)
> }
>
> ## estimate with nonlinear constraint
> hin=function(parm){
> h=rep(NA,1)
> h[1]=parm[8]*parm[11]-parm[9]*parm[10]
> h[2]=parm[8]
> h[3]=parm[11]
> h
> }
>
> heq=function(parm){
> h=rep(NA,1)
> h[1]=parm[9]-parm[10]
> h
> }
> max.like=constrOptim.nl(par=c(-0.5,-0.5,-0.5,-0.5,0.02,-0.02,0.02,1.9,-1.1,-1.1,1.9),fn=log.L,
> hin=hin,heq=heq)
> max.like$par
>
>
> ######
> parm=max.like$par
> alpha0=parm[1]
> alpha1=parm[2]
> alpha2=parm[3]
> beta0=parm[4]
> beta1=parm[5]
> beta2=parm[6]
> beta3=parm[7]
> sigma11=parm[8]
> sigma12=parm[9]
> sigma21=parm[10]
> sigma22=parm[11]
> u1=-alpha0-alpha1*logp-alpha2*lakes+logq
> u21=-beta0-beta1*logq-beta2*s-beta3+logp
> u22=-beta0-beta1*logq-beta2*s+logp
> expon1=u1^2*sigma11+u1*u21*sigma12+u1*u21*sigma21+u21^2*sigma22
> expon2=u1^2*sigma11+u1*u22*sigma12+u1*u22*sigma21+u22^2*sigma22
>
> h1_log=(-log(2*pi)+0.5*log(sigma11*sigma22-sigma12*sigma21))+(log(abs(1-alpha1*beta1))-0.5*expon1)
> h2_log=(-log(2*pi)+0.5*log(sigma11*sigma22-sigma12*sigma21))+(log(abs(1-alpha1*beta1))-0.5*expon2)
> w1=w
>
> w=1/(1+(1-lamda)/lamda*exp(h2_log-h1_log))
> if(cor(w,w1)>0.999) break
> }
>
>
> --
> View this message in context:
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help at r-project.org mailing list
>
> PLEASE do read the posting guide
> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list