일반화 된 비선형 최소 제곱 회귀에 대한 "손으로"로그 가능성 계산 (nlme)


12

함수 에 대한 일반화 된 비선형 최소 제곱 회귀에 대한 로그 우도를 계산하려고 합니다. ( 패키지 로부터) 브라운 운동을 가정하여 계통 발생 수 트리에서 거리에 의해 생성 된 분산 공분산 행렬을 사용하여 R 패키지의 함수 . 다음의 재현 가능한 R 코드는 x, y 데이터와 9 개의 분류법을 가진 임의의 트리를 사용하여 gnls 모델에 적합합니다.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) 

에서 logLik얻은 추정 된 매개 변수를 기반으로 로그 수 가능성을 "수동으로"(R로, 함수 를 사용하지 않음 ) 계산 gnls하여의 출력과 일치시킵니다 logLik(fit). 참고 : 매개 변수를 추정하려고하지 않습니다. gnls함수에 의해 추정 된 매개 변수의 로그 우도를 계산하고 싶습니다 (누군가없이 매개 변수를 계산하는 방법에 대한 재현 가능한 예가 있지만 gnls그것을 보는 데 매우 관심이 있습니다!).

나는 R 에서이 작업을 수행하는 방법을 잘 모르겠습니다 .S 및 S-Plus의 혼합 효과 모델 (Pinheiro 및 Bates)에 설명 된 선형 대수 표기법은 내 머리 위에 많이 있으며 내 시도와 일치하지 않습니다 logLik(fit). Pinheiro와 Bates가 설명한 세부 사항은 다음과 같습니다.

에 대한 로그 - 우도 일반화 최소 제곱 비선형 모델 여기서 다음과 같이 계산된다 :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|}

이는 Gauss-Seidel 알고리즘과 함께 사용되어 및 의 ML 추정값을 찾습니다 . 덜 편향된 추정값 이 사용됩니다.βλσ2

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

여기서 는 의 길이를 나타냅니다 .pβ

내가 직면하고있는 특정 질문 목록을 작성했습니다.

  1. 는 무엇입니까 ? in 에 의해 생성 된 거리 행렬 입니까, 아니면 또는 완전히 다른 것으로 변환되거나 매개 변수화되어야 합니까?Λibig_lambda <- vcv.phylo(tree)apeλ
  2. 겠습니까 BE 또는 적게 편향된 추정치 (포스트 마지막 방정식)에 대한 방정식?σ2fit$sigma^2
  3. 로그 가능성을 계산 하기 위해 를 사용해야 합니까, 아니면 매개 변수 추정의 중간 단계입니까? 또한 는 어떻게 사용됩니까? 단일 값 또는 벡터이며 모든 또는 비 대각선 요소 등으로 ?λλΛi
  4. 는 무엇입니까 ? 그 있을까 패키지에 ? 그렇다면, 나는 합계를 계산하는 방법에 대해 혼란스러워하고있어 , 때문에 반환 단일 값이 아닌 벡터.||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

함수 의 정의에 오른쪽에 가 없습니다 . f(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 (tree)를 시도하고 로그 우도에 대해 대략 -700을 얻었지만 logLik (fit)은 대략 -33입니다.
Eric

죄송합니다-코드를 복사하여 붙여 넣을 때 엉망이되었습니다. 이제 완료되었습니다. S는 잔차의 분산 공분산 행렬입니다. vcv함수 를 사용하여 올바른 길 을 가고 있지만 상관 행렬을 얻은 다음 를 사용하여 이것을 var-cov 행렬로 바꿔야합니다. σ^2
Wolfgang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.