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: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)
Vorrei calcolare la verosimiglianza "a mano" (in R, ma senza l'uso della logLik
funzione) in base ai parametri stimati ottenuti da in gnls
modo che corrisponda all'output da logLik(fit)
. NOTA: non sto cercando di stimare i parametri; Voglio solo calcolare la verosimiglianza dei parametri stimati dalla gnls
funzione (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")
Matrix
norm()
- 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_lambda
logm(abs(big_lambda))
expm
logm()
- 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