手动计算对数似然,以进行广义非线性最小二乘回归(nlme)


12

我正在尝试为函数优化的广义非线性最小二乘回归计算对数似然功能在R包,使用由距离上AA进化树假设(布朗运动产生的方差协方差矩阵从包中)。以下可重现的R代码使用x,y数据和具有9个分类单元的随机树来拟合gnls模型:f(x)=β1(1+xβ2)β3gnlsnlmecorBrownian(phy=tree)ape

require(ape)
require(nlme)
require(expm)
tree <- rtree(9)
x <- c(0,14.51,32.9,44.41,86.18,136.28,178.21,262.3,521.94)
y <- c(100,93.69,82.09,62.24,32.71,48.4,35.98,15.73,9.71)
data <- data.frame(x,y,row.names=tree$tip.label)
model <- y~beta1/((1+(x/beta2))^beta3)
f=function(beta,x) beta[1]/((1+(x/beta[2]))^beta[3])
start <- c(beta1=103.651004,beta2=119.55067,beta3=1.370105)
correlation <- corBrownian(phy=tree)
fit <- gnls(model=model,data=data,start=start,correlation=correlation)
logLik(fit) 

我想logLik根据从获得的估计参数来“手动”计算对数似然(在R中,但不使用函数),gnls因此它与的输出匹配logLik(fit)。注意:我不是要估计参数;我只想计算该函数估计的参数的对数似然gnls性(尽管如果有人提供了一个可重现的示例,说明了如何在不使用的情况下估计参数gnls,我将非常感兴趣!)。

我不确定如何在R中执行此操作。S和S-Plus的混合效果模型(Pinheiro和Bates)中描述的线性代数表示法让我非常头疼,而且我的尝试都没有logLik(fit)。以下是Pinheiro和Bates描述的详细信息:

对数似然为广义非线性最小二乘模型 其中的计算方法如下:φ = βyi=fi(ϕi,vi)+ϵiϕi=Aiβ

l(β,σ2,δ|y)=12{Nlog(2πσ2)+i=1M[||yifi(β)||2σ2+log|Λi|]}

其中是观察数,。Nfi(β)=fi(ϕi,vi)

Λi是正定的,和yi=ΛiT/2yifi(ϕi,vi)=ΛiT/2fi(ϕi,vi)

对于固定的和,的ML估计为βλσ2

σ^(β,λ)=i=1M||yifi(β)||2/N

剖析对数似然是

l(β,λ|y)=12{N[log(2π/N)+1]+log(i=1M||yifi(β)||2)+i=1Mlog|Λi|}

与高斯-赛德尔(Gauss-Seidel)算法一起使用,可以找到和的ML估计值。使用偏差较小的估计:βλσ2

σ2=i=1M||Λ^iT/2[yifi(β^)]||2/(Np)

其中表示的长度。pβ

我已经整理了一个我要面对的具体问题清单:

  1. 什么是?是in 生成的距离矩阵,还是需要通过或完全其他方式对其进行转换或参数化?Λibig_lambda <- vcv.phylo(tree)apeλ
  2. 将 BE ,或对于不太偏估计(在这篇文章的最后一个方程)的方程?σ2fit$sigma^2
  3. 是否需要使用来计算对数似然,或者这仅仅是参数估计的中间步骤?另外,如何使用?它是一个值还是一个向量,并乘以所有或只是非对角线元素等?λλΛi
  4. 什么是?那会在包装里吗?如果是这样,我对如何计算总和感到困惑,因为它返回单个值,而不是a向量。M i = 1 | | y if iβ | | 2||yf(β)||norm(y-f(fit$coefficients,x),"F")Matrixi=1M||yifi(β)||2norm()
  5. 如何计算?难道这里是,或者是从包中?如果是,一个人如何取一个矩阵的总和(或者暗示它只是对角线元素)?Λ log|Λi|log(diag(abs(big_lambda)))big_lambdaΛilogm(abs(big_lambda))expmlogm()
  6. 只是为了确认,是这样计算的?ΛiT/2t(solve(sqrtm(big_lambda)))
  7. 如何计算和?是以下其中之一: f iβ yifi(β)

y_star <- t(solve(sqrtm(big_lambda))) %*% y

f_star <- t(solve(sqrtm(big_lambda))) %*% f(fit$coefficients,x)

还是会

y_star <- t(solve(sqrtm(big_lambda))) * y

f_star <- t(solve(sqrtm(big_lambda))) * f(fit$coefficients,x)

如果所有这些问题都得到了回答,那么从理论上讲,我认为对数似然性应该可以计算出来以匹配的输出logLik(fit)。任何关于这些问题的帮助将不胜感激。如果有任何需要澄清的地方,请告诉我。谢谢!

更新:我一直在尝试各种可能性来计算对数似然,这是到目前为止我提出的最好的。logLik_calc始终与所返回的值相差约1到3 logLik(fit)。我要么接近实际的解决方案,要么纯粹是巧合。有什么想法吗?

  C <- vcv.phylo(tree) # variance-covariance matrix
  tC <- t(solve(sqrtm(C))) # C^(-T/2)
  log_C <- log(diag(abs(C))) # log|C|
  N <- length(y)
  y_star <- tC%*%y 
  f_star <- tC%*%f(fit$coefficients,x)
  dif <- y_star-f_star  
  sigma_squared <-  sum(abs(y_star-f_star)^2)/N
  # using fit$sigma^2 also produces a slightly different answer than logLik(fit)
  logLik_calc <- -((N*log(2*pi*(sigma_squared)))+
       sum(((abs(dif)^2)/(sigma_squared))+log_C))/2

您对函数定义在右侧缺少。xf(x)x
Glen_b-恢复莫妮卡2014年

Answers:


10

让我们从一个简单的情况开始,在该情况下,残差没有相关结构:

fit <- gnls(model=model,data=data,start=start)
logLik(fit)

对数似然然后可以轻松地通过手工计算:

N <- fit$dims$N
p <- fit$dims$p
sigma <- fit$sigma * sqrt((N-p)/N)
sum(dnorm(y, mean=fitted(fit), sd=sigma, log=TRUE))

由于残差是独立的,因此我们可以使用dnorm(..., log=TRUE)来获取各个对数似然项(然后将其求和)。或者,我们可以使用:

sum(dnorm(resid(fit), mean=0, sd=sigma, log=TRUE))

请注意,fit$sigma它不是“偏倚估计值较小”,因此我们需要首先手动进行校正。σ2

现在,对于残差相关的更复杂的情况:

fit <- gnls(model=model,data=data,start=start,correlation=correlation)
logLik(fit)

在这里,我们需要使用多元正态分布。我敢肯定某个地方有一个函数,但是让我们手动做一下:

N <- fit$dims$N
p <- fit$dims$p
yhat <- cbind(fitted(fit))
R <- vcv(tree, cor=TRUE)
sigma <- fit$sigma * sqrt((N-p)/N)
S <- diag(sigma, nrow=nrow(R)) %*% R %*% diag(sigma, nrow=nrow(R))
-1/2 * log(det(S)) - 1/2 * t(y - yhat) %*% solve(S) %*% (y - yhat) - N/2 * log(2*pi)

对不相关残差的对数似然性工作得很好,但是我无法弄清楚多元正态分布。在这种情况下,S是什么?我尝试了S <-vcv.phylo(tree),对数可能性约为-700,而logLik(fit)约为-33。
埃里克

抱歉-复制粘贴代码时,我搞砸了。现在完成了。S是残差的方差-协方差矩阵。您(使用vcv函数)走在正确的轨道上,但是您需要获取相关矩阵,然后使用将其转换为var-cov矩阵。σ^2
沃尔夫冈2014年
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.