Genelleştirilmiş doğrusal olmayan en küçük kareler regresyonu (nlme) için günlük olasılığını “elle” hesaplayın


12

Ben tarafından optimize edilmiş işlevi için genelleştirilmiş doğrusal olmayan en küçük kareler regresyonu için günlük olasılığını hesaplamaya çalışıyorum R paketin fonksiyon , (Brown hareketi varsayarak aa filogenetik ağaç mesafe tarafından meydana varyans kovaryans matrisi kullanılarak gelen paket). Aşağıdaki yeniden üretilebilir R kodu, gnls modeline x, y verileri ve 9 taksonlu rastgele bir ağaç kullanarak uyar: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) 

Ben logLikelde edilen tahmini parametrelere dayanarak log-olasılık "el ile" (R, ancak fonksiyon kullanmadan ) hesaplamak istiyorum, gnlsböylece çıktıyla eşleşir logLik(fit). NOT: Parametreleri tahmin etmeye çalışmıyorum; Sadece gnlsfonksiyon tarafından tahmin edilen parametrelerin log-olasılığını hesaplamak istiyorum (birisinin parametreleri olmadan nasıl tahmin edilebileceğinin tekrarlanabilir bir örneği olsa da gnls, onu görmekle çok ilgilenirim!).

Bunu R'de nasıl yapacağımdan tam olarak emin değilim. S ve S-Plus'ta (Pinheiro ve Bates) Karışık Etkiler Modellerinde açıklanan doğrusal cebir gösterimi kafamın çok üstünde ve girişimlerimin hiçbiri eşleşmedi logLik(fit). İşte Pinheiro ve Bates tarafından açıklanan detaylar:

Genelleştirilmiş doğrusal olmayan en küçük kareler modelinin log olasılığı, ; burada aşağıdaki gibi hesaplanır:ϕ i = A i βyi=fi(ϕi,vi)+ϵiϕi=Aiβ

l(β,σ2,δ|y)=-12{N-günlük(2πσ2)+Σben=1M[||yben*-fben*(β)||2σ2+günlük|Λben|]}

burada , gözlem sayısıdır ve .f i ( β ) = f i ( ϕ i , v i )N-fben*(β)=fben*(φben,vben)

y i = Λ - T / 2 i y i f i ( ϕ i , v i ) = Λ - T / 2 i f i ( ϕ i , v i )Λben pozitif tanımlı, veyben*=Λben-T/2ybenfben*(φben,vben)=Λben-T/2fben(φben,vben)

Sabit için ve , ML tahmin olduğuλ σ 2βλσ2

σ^(β,λ)=Σben=1M||yben*-fben*(β)||2/N-

ve profilli günlük olasılığı

l(β,λ|y)=-12{N-[günlük(2π/N-)+1]+günlük(Σben=1M||yben*-fben*(β)||2)+Σben=1Mgünlük|Λben|}

ve ML tahminlerini bulmak için bir Gauss-Seidel algoritması ile kullanılır . daha az önyargılı bir tahmini kullanılır:λ σ 2βλσ2

σ2=Σben=1M||Λ^ben-T/2[yben-fben(β^)]||2/(N--p)

burada uzunluğunu temsil eder .βpβ

Karşılaştığım belirli soruların bir listesini derledim:

  1. Nedir ? O ürettiği mesafe matrisidir içinde , ya da bu şekilde tarafından oyuna veya parametreli edilmesi gerekir veya tamamen başka bir şey? λΛbenbig_lambda <- vcv.phylo(tree)apeλ
  2. Misiniz be , az ya da çok yanlı tahmin (bu yayındaki son denklemi) için denklem?σ2fit$sigma^2
  3. Günlük olasılığını hesaplamak için kullanmak gerekli mi yoksa bu sadece parametre tahmini için bir ara adım mı? Ayrıca nasıl kullanılır? Tek bir değer mi, vektör mü ve tüm ya da sadece diyagonal olmayan elemanlar vb. çarpıldı mı?λ Λ iλλΛben
  4. Nedir? O olurdu pakette ? Öyleyse, toplamının nasıl hesaplanacağı konusunda kafam karıştı , çünkü tek bir değer döndürüyor, vektör.M Σ i = 1 | | y i - f i ( β ) | | 2||y-f(β)||norm(y-f(fit$coefficients,x),"F")MatrixΣben=1M||yben*-fben*(β)||2norm()
  5. nasıl hesaplanır ? Öyle mi nerede olduğunu , yoksa değil mi paketinden ? Eğer öyleyse, bir matrisin toplamını nasıl alır (ya da sadece diyagonal elemanlar olduğu ima edilir)?Λ bengünlük|Λben|log(diag(abs(big_lambda)))big_lambdaΛbenlogm(abs(big_lambda))expmlogm()
  6. Sadece onaylayın vardır böyle hesaplanan: ?Λben-T/2t(solve(sqrtm(big_lambda)))
  7. Nasılsın ve hesaplanır? Aşağıdakilerden herhangi biri mi: f i ( β )yben*fben*(β)

y_star <- t(solve(sqrtm(big_lambda))) %*% y

ve

f_star <- t(solve(sqrtm(big_lambda))) %*% f(fit$coefficients,x)

ya da olur mu

y_star <- t(solve(sqrtm(big_lambda))) * y

ve

f_star <- t(solve(sqrtm(big_lambda))) * f(fit$coefficients,x) ?

Tüm bu sorular cevaplanırsa, teorik olarak, log-olasılığının çıktıdan eşleşecek şekilde hesaplanabilir olması gerektiğini düşünüyorum logLik(fit). Bu sorulardan herhangi biri için herhangi bir yardım çok takdir edilecektir. Bir şeyin açıklığa ihtiyacı varsa, lütfen bana bildirin. Teşekkürler!

GÜNCELLEME : Günlük olasılığının hesaplanması için çeşitli olasılıkları deniyorum ve işte şimdiye kadar bulduğum en iyi şey. logLik_calcsürekli olarak döndürülen değerden yaklaşık 1 ila 3 arasındadır logLik(fit). Ya gerçek çözüme yakınım ya da bu tamamen tesadüf. Düşüncesi olan var mı?

  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

işleviyle ilgili tanımınızda sağ tarafta bir eksik . xf(x)x
Glen_b

Yanıtlar:


10

Artıklar için korelasyon yapısının olmadığı daha basit durumla başlayalım:

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

Günlük olasılığı daha sonra elle kolayca hesaplanabilir:

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

Kalanlar bağımsız olduğu için, sadece dnorm(..., log=TRUE)bireysel günlük olabilirlik koşullarını almak için kullanabiliriz (ve sonra bunları özetleyebiliriz). Alternatif olarak şunları kullanabiliriz:

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

Not fit$sigmadeğil "daha az önyargılı tahmindir elle ilk düzeltme yapmak gerekir böylece -".σ2

Artık artıkların ilişkili olduğu daha karmaşık dava için:

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

Burada, çok değişkenli normal dağılımı kullanmamız gerekir. Bir yerde bunun için bir fonksiyon olduğundan eminim, ama bunu sadece elle yapalım:

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)

İlişkisiz kalıntılar için günlük olasılığı mükemmel çalıştı, ancak çok değişkenli normal dağılımı anlayamıyorum. Bu durumda, S nedir? S <- vcv.phylo (tree) 'ı denedim ve log olabilirliği için yaklaşık -700, logLik (fit) yaklaşık -33'tür.
Eric

Üzgünüz - Kodu kopyaladığımda berbat ettim. Şimdi tamamlandı. S, artıkların varyans-kovaryans matrisidir. Doğru yoldaydınız ( vcvişlevle) - ancak korelasyon matrisini almanız ve bunu var-cov matrisine dönüştürmek için gerekir. σ^2
Wolfgang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.