def nLLeval(ldelta, Uy, S, REML=True):
"""
evaluate the negative log likelihood of a random effects model:
nLL = 1/2(n_s*log(2pi) + logdet(K) + 1/ss * y^T(K + deltaI)^{-1}y,
where K = USU^T.
Uy: transformed outcome: n_s x 1
S: eigenvectors of K: n_s
ldelta: log-transformed ratio sigma_gg/sigma_ee
"""
n_s = Uy.shape[0]
delta = scipy.exp(ldelta)
# evaluate log determinant
Sd = S + delta
ldet = scipy.sum(scipy.log(Sd))
# evaluate the variance
Sdi = 1.0 / Sd
Sdi=Sdi.reshape((Sdi.shape[0],1))
ss = 1. / n_s * (Uy*Uy*Sdi).sum()
# evalue the negative log likelihood
nLL = 0.5 * (n_s * scipy.log(2.0 * scipy.pi) + ldet + n_s + n_s * scipy.log(ss))
if REML:
pass
return nLL
评论列表
文章目录