Обчисліть ймовірність журналу "вручну" для узагальненої нелінійної регресії найменших квадратів (nlme)


12

Я намагаюся обчислити ймовірність журналу для узагальненої нелінійної регресії найменших квадратів для функції оптимізована функціонують у пакеті R , використовуючи дисперсійну коваріаційну матрицю, породжену відстанями на філогенетичному дереві, припускаючи броунівський рух ( від пакета). Наступний відтворюваний код R підходить для моделі gnls з використанням даних x, y та випадкового дерева з 9 таксонами: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) 

Я хотів би обчислити ймовірність журналу "вручну" (в R, але без використання logLikфункції) на основі розрахункових параметрів, отриманих з, gnlsщоб вона відповідала результатам з logLik(fit). ПРИМІТКА: я не намагаюся оцінити параметри; Я просто хочу обчислити вірогідність журналу параметрів, оцінених gnlsфункцією (хоча якщо хтось має відтворюваний приклад того, як оцінити параметри без цього gnls, мені було б дуже цікаво бачити це!).

Я не дуже впевнений, як це зробити в Р. Лінійна позначення алгебри, описана в моделях змішаних ефектів в S і S-Plus (Пінхеро та Бейтс), дуже сильно переживає мою голову, і жодна моя спроба не відповідає logLik(fit). Ось деталі, описані Пінхеро та Бейтсом:

Імовірність журналу для узагальненої нелінійної моделі найменших квадратів де обчислюється так:yi=fi(ϕi,vi)+ϵiϕi=Aiβ

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

де - кількість спостережень, а .Nfi(β)=fi(ϕi,vi)

Λi позитивно-визначений, таyi=ΛiT/2yifi(ϕi,vi)=ΛiT/2fi(ϕi,vi)

Для фіксованих та оцінювач ML єβλσ2

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

і ймовірність профільованого журналу є

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

який використовується з алгоритмом Гаусса-Зейделя для пошуку оцінок ML і . Використовується менш упереджена оцінка :βλσ2

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

де позначає довжину .pβ

Я склав список конкретних питань, з якими я стикаюся:

  1. Що таке ? Це матриця відстані, вироблена в , або її потрібно якось перетворити або параметризувати , або щось інше цілком?Λibig_lambda <- vcv.phylo(tree)apeλ
  2. Would В , або рівняння для менш упереджено оцінки (останнього рівняння на цій посаді)?σ2fit$sigma^2
  3. Чи потрібно використовувати для обчислення ймовірності журналу, чи це просто проміжний крок для оцінки параметрів? Також, як використовується ? Це одне значення чи вектор, чи він помножується на всі або просто недіагональні елементи тощо?λλΛi
  4. Що таке? Це було б у пакеті ? Якщо так, я плутаюсь щодо того, як обчислити суму , тому що повертає єдине значення, а не a вектор.||yf(β)||norm(y-f(fit$coefficients,x),"F")Matrixi=1M||yifi(β)||2norm()
  5. Як можна обчислити? Є чи це , де знаходиться , або це з пакету ? Якщо це так , то як можна приймати суму матриці (або мається на увазі, що це просто діагональні елементи)?log|Λi|log(diag(abs(big_lambda)))big_lambdaΛilogm(abs(big_lambda))expmlogm()
  6. Для підтвердження, чи обчислюється так :?ΛiT/2t(solve(sqrtm(big_lambda)))
  7. Як обчислюються і ? Чи це одне з наступного:yifi(β)

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

у вашому визначенні функції відсутня з правого боку. xf(x)x
Glen_b -Встановити Моніку

Відповіді:


10

Почнемо з більш простого випадку, коли для залишків немає кореляційної структури:

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

Вірогідність журналу потім легко обчислити вручну за допомогою:

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

Оскільки залишки незалежні, ми можемо просто використовувати dnorm(..., log=TRUE)для отримання окремих імовірностей журналу (а потім підсумовувати їх). Як варіант, ми могли б використовувати:

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

Зауважте, що fit$sigmaце не "менш упереджена оцінка " - тому нам потрібно спершу зробити виправлення вручну.σ2

Тепер для більш складного випадку, коли залишки співвідносяться:

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

Тут нам потрібно використовувати багатоваріантне нормальне розподіл. Я впевнений, що для цього є функція, але давайте просто зробимо це вручну:

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)

Імовірність журналу некорельованих залишків спрацювала ідеально, проте я не можу визначити багатоваріантне нормальне розподіл. У цьому випадку, що таке S? Я спробував S <- vcv.phylo (дерево) і отримав приблизно -700 для вірогідності журналу, тоді як logLik (fit) був приблизно -33.
Ерік

Вибачте - я заплутався, коли копіював вставлений код. Зараз це завершено. S - дисперсійно-коваріаційна матриця залишків. Ви були на правильному шляху (з vcvфункцією) - але вам потрібно отримати матрицю кореляції, а потім скористатися щоб перетворити це на матрицю var-cov. σ^2
Вольфганг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.