Tôi đang cố gắng tính toán khả năng ghi nhật ký cho hồi quy bình phương nhỏ nhất phi tuyến tổng quát cho hàm tối ưu hóa bởi hàm trong gói R , sử dụng ma trận hiệp phương sai được tạo bởi khoảng cách trên cây aa phát sinh giả định chuyển động Brown ( từ gói). Mã R có thể tái tạo sau đây phù hợp với mô hình gnls sử dụng dữ liệu x, y và cây ngẫu nhiên có 9 đơn vị phân loại: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)
Tôi muốn tính toán khả năng đăng nhập "bằng tay" (bằng R, nhưng không sử dụng logLik
hàm) dựa trên các tham số ước tính thu được từ gnls
đó để khớp với đầu ra từ đó logLik(fit)
. LƯU Ý: Tôi không cố gắng ước tính các tham số; Tôi chỉ muốn tính toán khả năng đăng nhập của các tham số được ước tính bởi gnls
hàm (mặc dù nếu ai đó có một ví dụ có thể lặp lại về cách ước tính các tham số mà không có gnls
, tôi sẽ rất thích nhìn thấy nó!).
Tôi không thực sự chắc chắn về cách thực hiện điều này trong R. Ký hiệu đại số tuyến tính được mô tả trong Mô hình hiệu ứng hỗn hợp trong S và S-Plus (Pinheiro và Bates) rất nhiều trong đầu tôi và không có nỗ lực nào của tôi phù hợp logLik(fit)
. Dưới đây là các chi tiết được mô tả bởi Pinheiro và Bates:
Khả năng đăng nhập của mô hình bình phương nhỏ nhất phi tuyến tổng quát trong đó được tính như sau:φ i = A i β
Trong đó là số lượng quan sát và .f ∗ i ( β ) = f ∗ i ( ϕ i , v i )
y ∗ i = Λ - T / 2 i y i f ∗ i ( ϕ i , v i ) = Λ - T / 2 i f i là xác định dương, và
Đối với cố định và , công cụ ước tính ML của làσ 2
và khả năng đăng nhập được định hình là
được sử dụng với thuật toán Gauss-Seidel để tìm các ước tính ML của và . Ước tính ít sai lệch của được sử dụng:bước sóng σ 2
Trong đó đại diện cho độ dài của .
Tôi đã soạn một danh sách các câu hỏi cụ thể mà tôi đang phải đối mặt:
- Là gì ? Đó có phải là ma trận khoảng cách tạo ra bởi trong , hoặc dùng nó cần phải được bằng cách nào đó chuyển hoặc tham số của , hoặc một cái gì đó khác hoàn toàn?
big_lambda <- vcv.phylo(tree)
ape
- Would be , hoặc các phương trình cho các ước tính ít thiên vị (phương trình cuối cùng trong bài này)?
fit$sigma^2
- Có cần thiết phải sử dụng để tính toán khả năng đăng nhập hay đó chỉ là một bước trung gian để ước tính tham số? Ngoài ra, được sử dụng như thế nào? Đây có phải là một giá trị đơn lẻ hay một vectơ và được nhân với tất cả hoặc chỉ các phần tử nằm ngoài đường chéo, v.v.?
- Là gì? Điều đó sẽ được trong gói ? Nếu vậy, tôi bối rối về cách tính tổng , vì trả về một giá trị duy nhất, không phải là một vectơ.
norm(y-f(fit$coefficients,x),"F")
Matrix
norm()
- Làm thế nào để một người tính toán? Có nơi là , hoặc là nó từ gói ? Nếu có , làm thế nào để lấy tổng của một ma trận (hoặc nó ngụ ý rằng nó chỉ là các phần tử đường chéo)?
log(diag(abs(big_lambda)))
big_lambda
logm(abs(big_lambda))
expm
logm()
- Chỉ cần xác nhận, tính như thế này : ?
t(solve(sqrtm(big_lambda)))
- Làm thế nào là và tính? Đây có phải là một trong những điều sau đây:
y_star <- t(solve(sqrtm(big_lambda))) %*% y
và
f_star <- t(solve(sqrtm(big_lambda))) %*% f(fit$coefficients,x)
hoặc nó sẽ là
y_star <- t(solve(sqrtm(big_lambda))) * y
và
f_star <- t(solve(sqrtm(big_lambda))) * f(fit$coefficients,x)
?
Nếu tất cả các câu hỏi này được trả lời, theo lý thuyết, tôi nghĩ khả năng đăng nhập nên có thể tính toán được để phù hợp với đầu ra từ đó logLik(fit)
. Bất kỳ trợ giúp về bất kỳ câu hỏi này sẽ được đánh giá rất cao. Nếu bất cứ điều gì cần làm rõ, xin vui lòng cho tôi biết. Cảm ơn!
CẬP NHẬT : Tôi đã thử nghiệm nhiều khả năng khác nhau để tính toán khả năng đăng nhập, và đây là điều tốt nhất tôi nghĩ ra cho đến nay. logLik_calc
luôn luôn giảm khoảng 1 đến 3 so với giá trị được trả về logLik(fit)
. Hoặc tôi gần với giải pháp thực tế, hoặc điều này hoàn toàn là do sự trùng hợp. Có suy nghĩ gì không?
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