Tính toán khả năng đăng nhập bằng tay bằng cách sử dụng hồi quy tổng quát bình phương nhỏ nhất phi tuyến tính (nlme)


12

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

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 logLikhà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 gnlshà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 βyi=fi(ϕi,vi)+ϵiϕi=Aiβ

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

Trong đó là số lượng quan sát và .f i ( β ) = f i ( ϕ i , v i )NfTôi*(β)= =fTôi*(φTôi,vTôi)

y i = Λ - T / 2 i y i f i ( ϕ i , v i ) = Λ - T / 2 i f iΛTôi là xác định dương, vàyTôi*= =ΛTôi-T/2yTôifi(ϕi,vi)=ΛiT/2fi(ϕi,vi)

Đối với cố định và , công cụ ước tính ML của làβσ 2λσ2

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

và khả năng đăng nhập được định hình là

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

đượ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βλσ2

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

Trong đó đại diện cho độ dài của .pβ

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:

  1. 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?Λibig_lambda <- vcv.phylo(tree)apeλ
  2. 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)?σ2fit$sigma^2
  3. 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.?λλΛi
  4. 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ơ.||yf(β)||norm(y-f(fit$coefficients,x),"F")Matrixi=1M||yifi(β)||2norm()
  5. 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|Λi|log(diag(abs(big_lambda)))big_lambdaΛilogm(abs(big_lambda))expmlogm()
  6. Chỉ cần xác nhận, tính như thế này : ?ΛiT/2t(solve(sqrtm(big_lambda)))
  7. Làm thế nào là và tính? Đây có phải là một trong những điều sau đây:yifi(β)

y_star <- t(solve(sqrtm(big_lambda))) %*% y

f_star <- t(solve(sqrtm(big_lambda))) %*% f(fit$coefficients,x)

hoặc nó sẽ là

y_star <- t(solve(sqrtm(big_lambda))) * y

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_calcluô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

định nghĩa của bạn về hàm thiếu một ở phía bên tay phải. f(x)x
Glen_b -Reinstate Monica

Câu trả lời:


10

Hãy bắt đầu với trường hợp đơn giản hơn khi không có cấu trúc tương quan cho phần dư:

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

Khả năng đăng nhập có thể dễ dàng được tính toán bằng tay với:

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

Vì phần dư là độc lập, chúng tôi chỉ có thể sử dụng dnorm(..., log=TRUE)để có được các điều khoản khả năng đăng nhập riêng lẻ (và sau đó tổng hợp chúng). Ngoài ra, chúng tôi có thể sử dụng:

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

Lưu ý rằng đó fit$sigmakhông phải là "ước tính ít sai lệch của " - vì vậy trước tiên chúng ta cần thực hiện chỉnh sửa.σ2

Bây giờ đối với trường hợp phức tạp hơn, phần dư có tương quan:

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

Ở đây, chúng ta cần sử dụng phân phối chuẩn nhiều biến. Tôi chắc chắn có một chức năng cho việc này ở đâu đó, nhưng chúng ta hãy làm điều này bằng tay:

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)

Khả năng đăng nhập cho phần dư không tương thích hoạt động hoàn hảo, tuy nhiên tôi không thể tìm ra phân phối bình thường đa biến. Trong trường hợp này, S là gì? Tôi đã thử S <- vcv.phylo (cây) và nhận được khoảng -700 cho khả năng đăng nhập, trong khi logLik (phù hợp) là khoảng -33.
Eric

Xin lỗi - Tôi đã nhắn tin khi tôi sao chép mã. Bây giờ nó đã hoàn thành. S là ma trận phương sai hiệp phương sai của phần dư. Bạn đã đi đúng hướng (có vcvchức năng) - nhưng bạn cần lấy ma trận tương quan và sau đó sử dụng để biến điều này thành ma trận var-cov. σ^2
Wolfgang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.