用于执行分层线性回归的标准算法?


Answers:


9

有一种适用于Harvey Goldstein的迭代广义最小二乘(IGLS)算法,还有一个较小的修改,即受限迭代广义最小二乘(RIGLS),它给出了方差参数的无偏估计。

这些算法仍然是迭代的,因此不是封闭形式,但是它们在计算上比MCMC或最大似然度简单。您只需迭代直到参数收敛。

有关此方法和替代方法的更多信息,请参见例如:


极好!正是我想要的。
约翰·萨尔瓦捷

4

R中的lme4程序包使用迭代加权最小二乘(IRLS)和惩罚迭代加权最小二乘(PIRLS)。在此处查看PDF:

http://rss.acs.unt.edu/Rdoc/library/lme4/doc/index.html


1
道格拉斯·贝茨(Douglas Bates)和史蒂文·沃克(Steven Walker)创建了一个GitHub项目,其目标是使用纯R代码来实现上述PIRLS算法。github.com/lme4/lme4pureR。如果考虑R包中的基本lmer()函数,lme4通常必须通读一堆C ++代码,以了解PIRLS的实现lmer()(这对我们中那些不太精通C ++编程的人可能是一个挑战)。
克里斯

1

HLM的“计算算法”的另一个很好的来源(同样,在某种程度上,您将其视为与LMM相似的规范):

  • McCulloch,C.,Searle,S.,Neuhaus,J。(2008)。广义线性模型和混合模型。第二版。威利。第14章-计算。

他们列出的用于计算LMM的算法包括:

  • EM算法
  • 牛顿拉夫森算法

他们为GLMM列出的算法包括:

  • 数值正交(GH正交)
  • EM算法
  • MCMC算法(如您所述)
  • 随机近似算法
  • 模拟最大似然

他们建议的其他GLMM算法包括:

  • 惩罚拟似然法
  • 拉普拉斯近似
  • 具有自举偏置校正的PQL / Laplace

0

如果您认为HLM是一种线性混合模型,则可以考虑EM算法。以下课程笔记的第22-23页指出了如何为混合模型实现经典的EM算法:

http://www.stat.ucla.edu/~yuille/courses/stat153/emtutorial.pdf

###########################################################
#     Classical EM algorithm for Linear  Mixed Model      #
###########################################################
em.mixed <- function(y, x, z, beta, var0, var1,maxiter=2000,tolerance = 1e-0010)
    {
    time <-proc.time()
    n <- nrow(y)
    q1 <- nrow(z)
    conv <- 1
    L0 <- loglike(y, x, z, beta, var0, var1)
    i<-0
    cat("  Iter.       sigma0                 sigma1        Likelihood",fill=T)
    repeat {
            if(i>maxiter) {conv<-0
                    break}
    V <- c(var1) * z %*% t(z) + c(var0) * diag(n)
    Vinv <- solve(V)
    xb <- x %*% beta
    resid <- (y-xb)
    temp1 <- Vinv %*% resid
    s0 <- c(var0)^2 * t(temp1)%*%temp1 + c(var0) * n - c(var0)^2 * tr(Vinv)
    s1 <- c(var1)^2 * t(temp1)%*%z%*%t(z)%*%temp1+ c(var1)*q1 -
                                                c(var1)^2 *tr(t(z)%*%Vinv%*%z)
    w <- xb + c(var0) * temp1
    var0 <- s0/n
    var1 <- s1/q1
    beta <- ginverse( t(x) %*% x) %*% t(x)%*% w
    L1 <- loglike(y, x, z, beta, var0, var1)
    if(L1 < L0) { print("log-likelihood must increase, llikel <llikeO, break.")
                             conv <- 0
break
}
    i <- i + 1
    cat("  ", i,"  ",var0,"  ",var1,"  ",L1,fill=T)
    if(abs(L1 - L0) < tolerance) {break}  #check for convergence
    L0 <- L1
    }
list(beta=beta, var0=var0,var1=var1,Loglikelihood=L0)
}

#########################################################
#  loglike calculates the LogLikelihood for Mixed Model #
#########################################################
loglike<- function(y, x, z, beta, var0, var1)
}
{
n<- nrow(y)
V <- c(var1) * z %*% t(z) + c(var0) * diag(n)
Vinv <- ginverse(V)
xb <- x %*% beta
resid <- (y-xb)
temp1 <- Vinv %*% resid
(-.5)*( log(det(V)) + t(resid) %*% temp1 )
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.