Я намагаюся обчислити ймовірність журналу для узагальненої нелінійної регресії найменших квадратів для функції оптимізована функціонують у пакеті R , використовуючи дисперсійну коваріаційну матрицю, породжену відстанями на філогенетичному дереві, припускаючи броунівський рух ( від пакета). Наступний відтворюваний код R підходить для моделі gnls з використанням даних x, y та випадкового дерева з 9 таксонами: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)
Я хотів би обчислити ймовірність журналу "вручну" (в R, але без використання logLik
функції) на основі розрахункових параметрів, отриманих з, gnls
щоб вона відповідала результатам з logLik(fit)
. ПРИМІТКА: я не намагаюся оцінити параметри; Я просто хочу обчислити вірогідність журналу параметрів, оцінених gnls
функцією (хоча якщо хтось має відтворюваний приклад того, як оцінити параметри без цього gnls
, мені було б дуже цікаво бачити це!).
Я не дуже впевнений, як це зробити в Р. Лінійна позначення алгебри, описана в моделях змішаних ефектів в S і S-Plus (Пінхеро та Бейтс), дуже сильно переживає мою голову, і жодна моя спроба не відповідає logLik(fit)
. Ось деталі, описані Пінхеро та Бейтсом:
Імовірність журналу для узагальненої нелінійної моделі найменших квадратів де обчислюється так:
де - кількість спостережень, а .
позитивно-визначений, та
Для фіксованих та оцінювач ML є
і ймовірність профільованого журналу є
який використовується з алгоритмом Гаусса-Зейделя для пошуку оцінок ML і . Використовується менш упереджена оцінка :
де позначає довжину .
Я склав список конкретних питань, з якими я стикаюся:
- Що таке ? Це матриця відстані, вироблена в , або її потрібно якось перетворити або параметризувати , або щось інше цілком?
big_lambda <- vcv.phylo(tree)
ape
- Would В , або рівняння для менш упереджено оцінки (останнього рівняння на цій посаді)?
fit$sigma^2
- Чи потрібно використовувати для обчислення ймовірності журналу, чи це просто проміжний крок для оцінки параметрів? Також, як використовується ? Це одне значення чи вектор, чи він помножується на всі або просто недіагональні елементи тощо?
- Що таке? Це було б у пакеті ? Якщо так, я плутаюсь щодо того, як обчислити суму , тому що повертає єдине значення, а не a вектор.
norm(y-f(fit$coefficients,x),"F")
Matrix
norm()
- Як можна обчислити? Є чи це , де знаходиться , або це з пакету ? Якщо це так , то як можна приймати суму матриці (або мається на увазі, що це просто діагональні елементи)?
log(diag(abs(big_lambda)))
big_lambda
logm(abs(big_lambda))
expm
logm()
- Для підтвердження, чи обчислюється так :?
t(solve(sqrtm(big_lambda)))
- Як обчислюються і ? Чи це одне з наступного:
y_star <- t(solve(sqrtm(big_lambda))) %*% y
і
f_star <- t(solve(sqrtm(big_lambda))) %*% f(fit$coefficients,x)
чи це було б
y_star <- t(solve(sqrtm(big_lambda))) * y
і
f_star <- t(solve(sqrtm(big_lambda))) * f(fit$coefficients,x)
?
Якщо всі ці питання відповідають, в теорії, я думаю , що журнал правдоподібність має бути обчислюваним , щоб відповідати висновку logLik(fit)
. Будь-яка допомога з будь-якого з цих питань буде дуже вдячна. Якщо щось потребує уточнення, будь ласка, повідомте мене про це. Дякую!
ОНОВЛЕННЯ : Я експериментував з різними можливостями для обчислення ймовірності журналу, і ось найкраще, що я придумав поки що. logLik_calc
послідовно від 1 до 3 вимкнено від значення, що повертається logLik(fit)
. Або я близький до фактичного рішення, або це суто збіг обставин. Будь-які думки?
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