Sto provando a calcolare la probabilità logaritmica per una regressione generalizzata dei minimi quadrati non lineari per la funzione ottimizzata dal funzione nel pacchetto R , usando la matrice di covarianza di varianza generata dalle distanze su un albero filogenetico assumendo un movimento browniano ( dal pacchetto). Il seguente codice R riproducibile si adatta al modello gnls usando i dati x, y e un albero casuale con 9 taxa:gnlsnlmecorBrownian(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)
Vorrei calcolare la verosimiglianza "a mano" (in R, ma senza l'uso della logLikfunzione) in base ai parametri stimati ottenuti da in gnlsmodo che corrisponda all'output da logLik(fit). NOTA: non sto cercando di stimare i parametri; Voglio solo calcolare la verosimiglianza dei parametri stimati dalla gnlsfunzione (anche se se qualcuno ha un esempio riproducibile di come stimare i parametri senza gnls, sarei molto interessato a vederlo!).
Non sono davvero sicuro di come procedere in R. La notazione algebrica lineare descritta in Modelli a effetti misti in S e S-Plus (Pinheiro e Bates) è molto sopra la mia testa e nessuno dei miei tentativi è stato abbinato logLik(fit). Ecco i dettagli descritti da Pinheiro e Bates:
La probabilità logaritmica per il modello dei minimi quadrati non lineari generalizzati dove è calcolata come segue:ϕ i = A i β
dove è il numero di osservazioni e .f ∗ i ( β ) = f ∗ i ( ϕ i , v i )
y ∗ i = Λ - T / 2 i y i f ∗ i ( ϕ i , v i ) = Λ - T / 2 i f i ( ϕ i , v i ) è definito positivo, e
Per e fissi , lo stimatore ML di èλ σ 2
e la probabilità logaritmica profilata è
che viene utilizzato con un algoritmo di Gauss-Seidel per trovare le stime ML di e . Viene utilizzata una stima meno distorta di :
dove rappresenta la lunghezza di .
Ho compilato un elenco di domande specifiche che sto affrontando:
- Che cos'è ? È la matrice di distanza prodotta da in o deve essere in qualche modo trasformata o parametrizzata da o qualcos'altro?
big_lambda <- vcv.phylo(tree)ape - Sarebbe BE , o l'equazione per la stima meno di parte (l'ultima equazione in questo post)?
fit$sigma^2 - È necessario utilizzare per calcolare la verosimiglianza o è solo un passaggio intermedio per la stima dei parametri? Inoltre, come viene utilizzato ? È un singolo valore o un vettore ed è moltiplicato per tutti gli o solo per elementi non diagonali, ecc.?
- Che cos'è? Sarebbe nel pacchetto ? In tal caso, sono confuso su come calcolare la somma , perché restituisce un singolo valore, non un vettore.M ∑ i = 1 | | y ∗ i - f ∗ i ( β ) | | 2
norm(y-f(fit$coefficients,x),"F")Matrixnorm() - Come si calcola? E ' dove è , o è dal pacchetto ? Se lo è , come si prende la somma di una matrice (o è implicito che siano solo gli elementi diagonali)?Λ io
log(diag(abs(big_lambda)))big_lambdalogm(abs(big_lambda))expmlogm() - Solo per confermare, calcolato in questo modo :?
t(solve(sqrtm(big_lambda))) - Come vengono e ? È uno dei seguenti: f ∗ i ( β )
y_star <- t(solve(sqrtm(big_lambda))) %*% y
e
f_star <- t(solve(sqrtm(big_lambda))) %*% f(fit$coefficients,x)
o sarebbe
y_star <- t(solve(sqrtm(big_lambda))) * y
e
f_star <- t(solve(sqrtm(big_lambda))) * f(fit$coefficients,x) ?
Se a tutte queste domande viene data risposta, in teoria, penso che la probabilità di log dovrebbe essere calcolabile per corrispondere all'output da logLik(fit). Qualsiasi aiuto su una di queste domande sarebbe molto apprezzato. Se qualcosa necessita di chiarimenti, per favore fatemelo sapere. Grazie!
AGGIORNAMENTO : Ho sperimentato varie possibilità per il calcolo della verosimiglianza e qui è la migliore che ho escogitato finora. logLik_calcè costantemente circa 1 a 3 di sconto sul valore restituito da logLik(fit). O sono vicino alla soluzione reale, o questo è puramente per coincidenza. qualche idea?
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