我正在尝试为函数优化的广义非线性最小二乘回归计算对数似然功能在R包,使用由距离上AA进化树假设(布朗运动产生的方差协方差矩阵从包中)。以下可重现的R代码使用x,y数据和具有9个分类单元的随机树来拟合gnls模型:gnls
nlme
corBrownian(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描述的详细信息:
对数似然为广义非线性最小二乘模型 其中的计算方法如下:φ 我 = 甲我 β
其中是观察数,。
是正定的,和
对于固定的和,的ML估计为
剖析对数似然是
与高斯-赛德尔(Gauss-Seidel)算法一起使用,可以找到和的ML估计值。使用偏差较小的估计:
其中表示的长度。
我已经整理了一个我要面对的具体问题清单:
- 什么是?是in 生成的距离矩阵,还是需要通过或完全其他方式对其进行转换或参数化?
big_lambda <- vcv.phylo(tree)
ape
- 将 BE ,或对于不太偏估计(在这篇文章的最后一个方程)的方程?
fit$sigma^2
- 是否需要使用来计算对数似然,或者这仅仅是参数估计的中间步骤?另外,如何使用?它是一个值还是一个向量,并乘以所有或只是非对角线元素等?
- 什么是?那会在包装里吗?如果是这样,我对如何计算总和感到困惑,因为它返回单个值,而不是a向量。M ∑ i = 1 | | y ∗ i − f ∗ i(β )| | 2
norm(y-f(fit$coefficients,x),"F")
Matrix
norm()
- 如何计算?难道这里是,或者是从包中?如果是,一个人如何取一个矩阵的总和(或者暗示它只是对角线元素)?Λ 我
log(diag(abs(big_lambda)))
big_lambda
logm(abs(big_lambda))
expm
logm()
- 只是为了确认,是这样计算的?
t(solve(sqrtm(big_lambda)))
- 如何计算和?是以下其中之一: f ∗ i(β )
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