Làm thế nào để dinterval () cho dữ liệu bị kiểm duyệt giữa chừng hoạt động trong JAGS?


8

Tôi đang cố gắng hiểu cách dinterval () hoạt động trong JAGS cho dữ liệu bị kiểm duyệt. Tôi đang mô hình hóa dữ liệu thô trong đó tôi chỉ có giới hạn trên và dưới cho mỗi điểm dữ liệu (không phải giá trị thực). Đây là một ví dụ đơn giản về cách tôi nghĩ nó nên hoạt động:

Một số giới hạn trên và dưới cho mỗi điểm:

> head(lim)
        L        U
[1,] 14.98266 15.68029
[2,] 21.21827 21.91590
[3,] 18.34953 19.04716
[4,] 19.00186 19.69949
[5,] 15.39891 16.09654
[6,] 17.81705 18.51468

Một hàm để viết mô hình (giả sử dữ liệu đến từ bình thường với trung bình và phương sai chung):

playmodel <- function(){
           for (i in 1:50){
                is.censored[i] ~ dinterval(t[i], lim[i,])
                t[i] ~ dnorm(mu,tau)
               }
           mu ~ dnorm(0,.001)
           tau ~ dgamma(.01,.01)
          } 
          filename <- "toymod.bug"
          write.model(toymod,filename)

Một số chức năng và bài tập cho cuộc gọi jags:

data <- list("lim"=lim)
inits <- list(mu=rnorm(1),tau=rgamma(1,.01,.01),t=as.vector(apply(lim,1,mean)))
#last part is to ensure the starting value is between the upper and lower limit
#each chain will start at the same place for t but this is just for this case
params <- c("mu","tau")

Và chạy mô hình:

playmodel.jags <- jags(data,inits, params, model.file="toymod.bug", n.chains=3,
                  n.iter=50000,n.burnin=30000, n.thin=1, DIC=TRUE, 
                  working.directory=NULL,refresh = 50000/50, progress.bar = "text")

Điều gì xảy ra khi tôi chạy này?

1) ước tính của tôi về mu dao động ngay khoảng 0 khi nó phải là 15

2) nó sẽ không chạy nếu DIC = TRUE:

lỗi: "Lỗi trong jags.samples (model, biến.names, n.iter, thin, type =" dấu vết ",: Không thể đặt màn hình theo dõi cho độ lệch nút

Lưu ý: Tôi có thể nhận được một mô hình tương tự đang chạy trong OpenBUGS bằng cách bỏ qua dòng dinterval () và nối thêm I (Lower, Upper) vào dnorm.

Câu trả lời:


6

Đây là câu trả lời từ Martyn Plummer:

Như đã viết, mô hình của bạn không có bất kỳ kết quả quan sát được. Bạn có thể nhận thấy rằng nó chạy rất nhanh. Điều này là do nó được lấy mẫu từ phía trước. Đó là lý do tại sao giá trị trung bình của mu của bạn giống với giá trị trung bình trước của 0. Tên biến "is.censored" phù hợp với dữ liệu bị kiểm duyệt trái hoặc phải, như được tìm thấy trong phân tích sinh tồn, nhưng không phải là vấn đề của bạn. Vì vậy, tôi sẽ đổi tên nó thành "y". Nếu bạn có

y[j] ~ dinterval(t[j], lim[j,]) 

và lim [j] có hai cột, sau đó y [j] có thể nhận ba giá trị có thể

y[j] = 0 if t[j] <= lim[j,1] 
y[j] = 1 if lim[j,1] < t[j] <= lim[j,2] 
y[j] = 2 if lim[j,2] < t[j] 

Để mô hình dữ liệu bị kiểm duyệt giữa các khoảng thời gian, bạn cần cung cấp y [j] làm dữ liệu trong mô hình của mình. Trong trường hợp của bạn, bạn biết rằng t [j] luôn nằm giữa lim [j, 1] và lim [j, 2] vì vậy dữ liệu của bạn phải như vậy.

data <- list("lim"=lim, "y"=rep(1,nrow(lim))) 

Vấn đề với DIC khá sâu sắc. Bởi vì mô hình của bạn không có bất kỳ dữ liệu kết quả nào, độ lệch không được xác định. Tuy nhiên, ngay cả khi bạn cung cấp dữ liệu kết quả, bạn vẫn sẽ không nhận được số liệu thống kê sai lệch mà bạn muốn (bao gồm pD). Độ lệch sẽ bằng 0 và hàm "jags" sẽ quay trở lại với heuristic Gelman cho pD (Tôi không viết điều này vì vậy đừng yêu cầu tôi giải thích về nó), cũng sẽ là số không. Khả năng bạn thực sự muốn là

 p(lim[j,1] < t[j] <= lim[j,2] | mu, tau) 

Nhưng JAGS đang cho bạn

p(y[j] | t[j]) 

luôn luôn là 1. "trọng tâm" của DIC là sai. Tôi không biết WinBUGS làm gì trong những trường hợp này. Có lẽ nó có các quy tắc đặc biệt cho các biến bị kiểm duyệt.

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.