함수 에 대한 일반화 된 비선형 최소 제곱 회귀에 대한 로그 우도를 계산하려고 합니다. ( 패키지 로부터) 브라운 운동을 가정하여 계통 발생 수 트리에서 거리에 의해 생성 된 분산 공분산 행렬을 사용하여 R 패키지의 함수 . 다음의 재현 가능한 R 코드는 x, y 데이터와 9 개의 분류법을 가진 임의의 트리를 사용하여 gnls 모델에 적합합니다.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)
에서 logLik
얻은 추정 된 매개 변수를 기반으로 로그 수 가능성을 "수동으로"(R로, 함수 를 사용하지 않음 ) 계산 gnls
하여의 출력과 일치시킵니다 logLik(fit)
. 참고 : 매개 변수를 추정하려고하지 않습니다. gnls
함수에 의해 추정 된 매개 변수의 로그 우도를 계산하고 싶습니다 (누군가없이 매개 변수를 계산하는 방법에 대한 재현 가능한 예가 있지만 gnls
그것을 보는 데 매우 관심이 있습니다!).
나는 R 에서이 작업을 수행하는 방법을 잘 모르겠습니다 .S 및 S-Plus의 혼합 효과 모델 (Pinheiro 및 Bates)에 설명 된 선형 대수 표기법은 내 머리 위에 많이 있으며 내 시도와 일치하지 않습니다 logLik(fit)
. Pinheiro와 Bates가 설명한 세부 사항은 다음과 같습니다.
에 대한 로그 - 우도 일반화 최소 제곱 비선형 모델 여기서 다음과 같이 계산된다 :
여기서 은 관측치 수이며 입니다.
는 양의 정의입니다, 및
고정 및 의 경우 의 ML 추정기 는
프로파일 된 로그 우도는
이는 Gauss-Seidel 알고리즘과 함께 사용되어 및 의 ML 추정값을 찾습니다 . 덜 편향된 추정값 이 사용됩니다.
여기서 는 의 길이를 나타냅니다 .
내가 직면하고있는 특정 질문 목록을 작성했습니다.
- 는 무엇입니까 ? in 에 의해 생성 된 거리 행렬 입니까, 아니면 또는 완전히 다른 것으로 변환되거나 매개 변수화되어야 합니까?
big_lambda <- vcv.phylo(tree)
ape
- 겠습니까 BE 또는 적게 편향된 추정치 (포스트 마지막 방정식)에 대한 방정식?
fit$sigma^2
- 로그 가능성을 계산 하기 위해 를 사용해야 합니까, 아니면 매개 변수 추정의 중간 단계입니까? 또한 는 어떻게 사용됩니까? 단일 값 또는 벡터이며 모든 또는 비 대각선 요소 등으로 ?
- 는 무엇입니까 ? 그 있을까 패키지에 ? 그렇다면, 나는 합계를 계산하는 방법에 대해 혼란스러워하고있어 , 때문에 반환 단일 값이 아닌 벡터.
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