Calcola la probabilità logaritmica "a mano" per la regressione generalizzata dei minimi quadrati non lineari (nlme)


12

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: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) 

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 βyi=fi(ϕi,vi)+ϵiϕi=Aiβ

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

dove è il numero di osservazioni e .f i ( β ) = f i ( ϕ i , v i )Nfi(β)=fi(ϕi,vi)

y i = Λ - T / 2 i y i f i ( ϕ i , v i ) = Λ - T / 2 i f i ( ϕ i , v i )Λi è definito positivo, eyi=ΛiT/2yifi(ϕi,vi)=ΛiT/2fi(ϕi,vi)

Per e fissi , lo stimatore ML di èλ σ 2βλσ2

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

e la probabilità logaritmica profilata è

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

che viene utilizzato con un algoritmo di Gauss-Seidel per trovare le stime ML di e . Viene utilizzata una stima meno distorta di :βλσ2

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

dove rappresenta la lunghezza di .pβ

Ho compilato un elenco di domande specifiche che sto affrontando:

  1. Che cos'è ? È la matrice di distanza prodotta da in o deve essere in qualche modo trasformata o parametrizzata da o qualcos'altro?Λibig_lambda <- vcv.phylo(tree)apeλ
  2. Sarebbe BE , o l'equazione per la stima meno di parte (l'ultima equazione in questo post)?σ2fit$sigma^2
  3. È 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.?λλΛi
  4. 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||yf(β)||norm(y-f(fit$coefficients,x),"F")Matrixi=1M||yifi(β)||2norm()
  5. 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)?Λ iolog|Λi|log(diag(abs(big_lambda)))big_lambdaΛilogm(abs(big_lambda))expmlogm()
  6. Solo per confermare, calcolato in questo modo :?ΛiT/2t(solve(sqrtm(big_lambda)))
  7. Come vengono e ? È uno dei seguenti: f i ( β )yifi(β)

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

nella tua definizione della funzione manca una sul lato destro. xf(x)x
Glen_b -Restate Monica

Risposte:


10

Cominciamo con il caso più semplice in cui non esiste una struttura di correlazione per i residui:

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

La probabilità di log può quindi essere facilmente calcolata a mano con:

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))

Dato che i residui sono indipendenti, possiamo semplicemente usare dnorm(..., log=TRUE)per ottenere i termini di verosimiglianza dei log individuali (e quindi riassumerli). In alternativa, potremmo usare:

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

Si noti che fit$sigmanon è la "stima meno distorta di ", quindi è necessario prima effettuare la correzione manualmente.σ2

Ora per il caso più complicato in cui i residui sono correlati:

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

Qui, dobbiamo usare la distribuzione normale multivariata. Sono sicuro che ci sia una funzione per questo da qualche parte, ma facciamolo a mano:

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)

La probabilità logaritmica per i residui non correlati funzionava perfettamente, tuttavia non riesco a capire la distribuzione normale multivariata. In questo caso, cos'è S? Ho provato S <- vcv.phylo (albero) e ho ottenuto circa -700 per la probabilità logaritmica, mentre logLik (fit) era approssimativamente -33.
Eric,

Scusa: ho sbagliato quando ho incollato il codice. Ora è completo S è la matrice varianza-covarianza dei residui. Eri sulla strada giusta (con la vcvfunzione) - ma devi ottenere la matrice di correlazione e quindi usare per trasformarla nella matrice var-cov. σ^2
Wolfgang,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.