Estoy tratando de calcular el logaritmo de la probabilidad para un generalizada no lineal de mínimos cuadrados de la regresión de la función de f(x)=β1(1+xβ2)β3 optimizado por el gnls
función en el paquete de R nlme
, el uso de la varianza de la matriz de covarianza generados por las distancias en un árbol filogenético suponiendo que el movimiento Browniano (corBrownian(phy=tree)
de la ape
paquete). El siguiente reproducible R código se ajusta a la gnls modelo de uso de la x,y datos y un árbol al azar con 9 taxones:
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)
Quiero calcular el logaritmo de la probabilidad "a mano" (en R, pero sin el uso de la logLik
función), basado en la estimación de los parámetros obtenidos a partir de gnls
para que coincida con la salida de logLik(fit)
. NOTA: no estoy tratando de estimar los parámetros; sólo quiero calcular la log-verosimilitud de los parámetros estimados por el gnls
función (aunque si alguien tiene una reproducible ejemplo de cómo estimar los parámetros sin gnls
, yo estaría muy interesado en verlo!).
No estoy realmente seguro de cómo ir sobre hacer esto en R. El álgebra lineal notación descrita en Modelos de Efectos Mixtos en S y S-Plus (Pinheiro y Bates) está muy por encima de mi cabeza y ninguno de mis intentos han igualado logLik(fit)
. Aquí están los detalles descritos por Pinheiro y Bates:
La log-verosimilitud para la generalización de la no lineal de mínimos cuadrados del modelo de yi=fi(ϕi,vi)+ϵi donde ϕi=Aiβ se calcula de la siguiente manera:
l(β,σ2,δ|y)=−12{Nlog(2πσ2)+M∑i=1[||y∗i−f∗i(β)||2σ2+log|Λi|]}
donde N es el número de observaciones, y f∗i(β)=f∗i(ϕi,vi).
Λi es positiva definida, y∗i=Λ−T/2iyi f∗i(ϕi,vi)=Λ−T/2ifi(ϕi,vi)
Fijo βλ, el estimador ML de σ2 es
ˆσ(β,λ)=M∑i=1||y∗i−f∗i(β)||2/N
y el perfil de la log-verosimilitud es
l(β,λ|y)=−12{N[log(2π/N)+1]+log(M∑i=1||y∗i−f∗i(β)||2)+M∑i=1log|Λi|}
que se utiliza con una de Gauss-Seidel algoritmo para encontrar el ML estimaciones de βλ. Una menor estimación sesgada de σ2 se utiliza:
σ2=M∑i=1||ˆΛ−T/2i[yi−fi(ˆβ)]||2/(N−p)
donde p representa la longitud de β.
He compilado una lista de preguntas específicas que estoy mirando:
- ¿Qué es Λi? Es la distancia de la matriz producida por
big_lambda <- vcv.phylo(tree)
enape
, o qué se necesita para ser transformado de alguna manera o con parámetros por λ o algo completamente distinto? - Sería σ2
fit$sigma^2
, o la ecuación de la menor estimación sesgada (la última ecuación en este post)? - Es necesario el uso de λ, para calcular la log-verosimilitud, o es que sólo un paso intermedio para la estimación de parámetros? También, cómo es λ utiliza? Es un único valor o un vector, y es multiplicado por todos los de Λi o simplemente fuera de la diagonal de los elementos, etc.?
- ¿Qué es ||y−f(β)||? Tendría que ser
norm(y-f(fit$coefficients,x),"F")
en el paqueteMatrix
? Si es así, estoy confundido acerca de cómo calcular la suma de M∑i=1||y∗i−f∗i(β)||2 porquenorm()
devuelve un único valor, no un vector. - Cómo se calculan las log|Λi|? Es
log(diag(abs(big_lambda)))
dondebig_lambda
es Λi o eslogm(abs(big_lambda))
del paqueteexpm
? Si eslogm()
, ¿cómo hace uno para tomar la suma de una matriz (o es implícita de que es sólo los elementos de la diagonal)? - Sólo para confirmar, es Λ−T/2i calcula de la siguiente manera:
t(solve(sqrtm(big_lambda)))
? - ¿Cómo se y∗i f∗i(β) calculado? Es cualquiera de los siguientes:
y_star <- t(solve(sqrtm(big_lambda))) %*% y
y
f_star <- t(solve(sqrtm(big_lambda))) %*% f(fit$coefficients,x)
o sería
y_star <- t(solve(sqrtm(big_lambda))) * y
y
f_star <- t(solve(sqrtm(big_lambda))) * f(fit$coefficients,x)
?
Si todas estas preguntas son respondidas, en teoría, creo que el logaritmo de la probabilidad debe ser calculable para que coincida con la salida de logLik(fit)
. Cualquier ayuda en cualquiera de estas preguntas, sería muy apreciado. Si algo necesita aclaración, por favor hágamelo saber. Gracias!
ACTUALIZACIÓN: he estado experimentando con diversas posibilidades para el cálculo de la log-verosimilitud, y aquí es el mejor que han llegado tan lejos. logLik_calc
es constantemente alrededor de 1 a 3 de descuento en el valor devuelto por logLik(fit)
. Yo estoy cerca de la solución real, o esto es puramente por casualidad. Los pensamientos?
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