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: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)
Ben logLik
elde edilen tahmini parametrelere dayanarak log-olasılık "el ile" (R, ancak fonksiyon kullanmadan ) hesaplamak istiyorum, gnls
böylece çıktıyla eşleşir logLik(fit)
. NOT: Parametreleri tahmin etmeye çalışmıyorum; Sadece gnls
fonksiyon 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 β
burada , gözlem sayısıdır ve .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 ) pozitif tanımlı, ve
Sabit için ve , ML tahmin olduğuλ σ 2
ve profilli günlük olasılığı
ve ML tahminlerini bulmak için bir Gauss-Seidel algoritması ile kullanılır . daha az önyargılı bir tahmini kullanılır:λ σ 2
burada uzunluğunu temsil eder .β
Karşılaştığım belirli soruların bir listesini derledim:
- 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? λ
big_lambda <- vcv.phylo(tree)
ape
- Misiniz be , az ya da çok yanlı tahmin (bu yayındaki son denklemi) için denklem?
fit$sigma^2
- 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
- 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
norm(y-f(fit$coefficients,x),"F")
Matrix
norm()
- 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)?Λ ben
log(diag(abs(big_lambda)))
big_lambda
logm(abs(big_lambda))
expm
logm()
- Sadece onaylayın vardır böyle hesaplanan: ?
t(solve(sqrtm(big_lambda)))
- Nasılsın ve hesaplanır? Aşağıdakilerden herhangi biri mi: f ∗ i ( β )
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_calc
sü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