2013-07-23 4 views
3

Пакет R2WinBUGS имеет функцию, называемую write.model(). В R-пакетах rjags нет такой функции, о которой я знаю. write.model создает временный текстовый файл, который можно прочитать в виде модели с помощью WinBUGS.rJAGS версия write.model()?

Я знаю, что я могу войти write.model в консоль, чтобы увидеть функцию, но эта функция, кажется, делает вызов функции, которые я никогда раньше не видел, и не искать в help() (например, replaceScientificNotationR-видимому, является функция).

Я видел This Post, который описывает некоторые методы для этого, но если это возможно, я бы предпочел не использовать кавычки (просто для подсветки подсветки синтаксиса), а в комментарии было указано, что «копирование write.model функция "должна быть выполнимой.

Кто-нибудь это сделал?

+0

Там также 'R2jags' пакет, который позволяет передавать модели как функции (например, @ KevinWright в' jfun6'). – jbaums

ответ

2

Предположительно, вы можете просто загрузить R2WinBUGS, чтобы получить доступ к функции.

Однако, в общем, там, где есть функция, для которой вы не видите код, попробуйте getAnywhere.

Е.Г., getAnywhere(replaceScientificNotationR) производит:

A single object matching ‘replaceScientificNotationR’ was found 
It was found in the following places 
    namespace:R2WinBUGS 
with value 

function (bmodel, digits = 5) 
{ 
    env <- new.env() 
    assign("rSNRidCounter", 0, envir = env) 
    replaceID <- function(bmodel, env, digits = 5) { 
     for (i in seq_along(bmodel)) { 
      if (length(bmodel[[i]]) == 1) { 
       if (as.character(bmodel[[i]]) %in% c(":", "[", 
        "[[")) 
        return(bmodel) 
       if ((typeof(bmodel[[i]]) %in% c("double", "integer")) && 
        ((abs(bmodel[[i]]) < 0.001) || (abs(bmodel[[i]]) > 
        10000))) { 
        counter <- get("rSNRidCounter", envir = env) + 
        1 
        assign("rSNRidCounter", counter, envir = env) 
        id <- paste("rSNRid", counter, sep = "") 
        assign(id, formatC(bmodel[[i]], digits = digits, 
        format = "E"), envir = env) 
        bmodel[[i]] <- id 
       } 
      } 
      else { 
       bmodel[[i]] <- replaceID(bmodel[[i]], env, digits = digits) 
      } 
     } 
     bmodel 
    } 
    bmodel <- deparse(replaceID(bmodel, env, digits = digits), 
     control = NULL) 
    for (i in ls(env)) { 
     bmodel <- gsub(paste("\"", i, "\"", sep = ""), get(i, 
      envir = env), bmodel, fixed = TRUE) 
    } 
    bmodel 
} 
<environment: namespace:R2WinBUGS> 

Таким образом, внутренняя функция в пакете R2WinBUGS. Кроме того, вы можете скачать package source from CRAN и изучить.

2

Вам не нужно копировать функцию write.model, если вы этого не хотите. Хитрость заключается в использовании write.model с textConnection. Например:

require(nlme) 
require(rjags) 
require(R2WinBUGS) 

jdat <- list(nobs=nrow(Rail), travel=Rail$travel, Rail=Rail$Rail) 
jinit <- list(mu=50, tau=1, tau.theta=1) 

jfun6 <- function() { 
    for(i in 1:nobs){ 
    travel[i] ~ dnorm(mu + theta[Rail[i]], tau) 
    } 
    for(j in 1:6) { 
    theta[j] ~ dnorm(0, tau.theta) 
    } 
    # mu ~ dnorm() works fine since the mean is far from 0 
    # mu ~ dgamma(1, 0.0001) could be used to ensure positive numbers. 
    # mu ~ dnorm(50, 0.0001) I(0,) also ensures positive numbers. 
    # We use truncation to show a difference between rjags and R2WinBUGS. 
    # R2WinBUGS needs a dummy operator %_% that will be removed. 
    mu ~ dnorm(50, 0.0001) %_% I(0,) 
    tau ~ dgamma(1, .001) 
    tau.theta ~ dgamma(1, .001) 
    sigma <- 1/sqrt(tau) 
    sigma.theta <- 1/sqrt(tau.theta) 
} 

# Save the jfun6 function into a text object called jmod6 
tc1 <- textConnection("jmod6", "w") 
write.model(jfun6, tc1) 
close(tc1) 

# Read the text object 
tc2 <- textConnection(jmod6) 
j6 <- jags.model(tc2, data=jdat, inits=jinit) 
close(tc2) 
c6 <- coda.samples(j6, c("mu","theta", "sigma", "sigma.theta"), n.iter=100000, thin=5) 
summary(c6) 
Смежные вопросы