拟合贝叶斯线性回归并预测不可观察的值

时间:2015-11-12 01:31:53

标签: bayesian jags r2jags

我想使用Jags plus R来调整具有可观察数量的线性模型,并推断出不可观察的数量。我在互联网上找到了很多关于如何调整模型的例子,但没有说明如何在Jags环境中拟合模型后推断其系数。所以,我会很感激你的帮助。

我的数据如下所示:

ngroups <- 2
group <- 1:ngroups
nobs <- 100
dta <- data.frame(group=rep(group,each=nobs),y=rnorm(nobs*ngroups),x=runif(nobs*ngroups))
head(dta)

1 个答案:

答案 0 :(得分:4)

JAGS有强大的方法来推断缺失的数据,一旦掌握了它,就很容易!我强烈建议您查看MarcKéry的excellent book,它提供了对BUGS语言编程的精彩介绍(JAGS足够接近几乎所有传输的BUGS)。

正如您所说,最简单的方法是调整模型。下面我提供一个完整的工作示例,了解其工作原理。但是你似乎要求一种方法来获得预测间隔而不重新运行模型(你的模型是非常大而且计算成本高吗?)。这也可以做到 如何预测 - 艰难的方式(无需重新运行模型) 对于MCMC的每次迭代,基于该迭代对协变量值的后抽取来模拟所需x值的响应。所以想象你想要预测X = 10的值。然后,如果迭代1(烧伤后)斜率= 2,截距= 1,标准偏差= 0.5,则从

绘制Y值
Y=rnorm(1, 1+2*10, 0.5)  

重复迭代2,3,4,5 ...... 这些将是你在X = 10时的响应后验。 注意:如果你没有监控JAGS模型中的标准偏差,那你就不走运了,需要重新适应模型。

如何预测 - 简单的方法 - 使用实例 基本思想是在(您的数据中)插入要预测其响应的x值,并使用相关的y值NA。例如,如果您想要X = 10的预测间隔,则只需在数据中包含点(10,NA),并为y值设置跟踪监视器。

我使用R的JAGS和rjags包。下面是一个完整的工作示例,首先模拟数据,然后向数据添加一些额外的x值,通过rjags在JAGS中指定和运行线性模型,并总结结果。 Y [101:105]包含来自X [101:105]的后验预测区间的绘制。请注意,Y [1:100]只包含X [1:100]的y值。这些是我们提供给模型的观察数据,它们在模型更新时永远不会改变。

library(rjags)
# Simulate data (100 observations)
my.data <- as.data.frame(matrix(data=NA, nrow=100, ncol=2))
names(my.data) <- c("X", "Y")
# the linear model will predict Y based on the covariate X

my.data$X <- runif(100) # values for the covariate
int <- 2     # specify the true intercept
slope <- 1   # specify the true slope
sigma <- .5   # specify the true residual standard deviation
my.data$Y <- rnorm(100, slope*my.data$X+int, sigma)  # Simulate the data

#### Extra data for prediction of unknown Y-values from known X-values
y.predict <- as.data.frame(matrix(data=NA, nrow=5, ncol=2))
names(y.predict) <- c("X", "Y")
y.predict$X <- c(-1, 0, 1.3, 2, 7)

mydata <- rbind(my.data, y.predict)


set.seed(333)
setwd(INSERT YOUR WORKING DIRECTORY HERE)
sink("mymodel.txt")
cat("model{

    # Priors

    int ~ dnorm(0, .001)
    slope ~ dnorm(0, .001)
    tau <- 1/(sigma * sigma)
    sigma ~ dunif(0,10) 

    # Model structure

    for(i in 1:R){
    Y[i] ~ dnorm(m[i],tau)
    m[i] <- int + slope * X[i]
    }
    }", fill=TRUE)
sink()
jags.data <- list(R=dim(mydata)[1], X=mydata$X, Y=mydata$Y)

inits <- function(){list(int=rnorm(1, 0, 5), slope=rnorm(1,0,5),
                         sigma=runif(1,0,10))}

params <- c("Y", "int", "slope", "sigma")

nc <- 3
n.adapt <-1000
n.burn <- 1000
n.iter <- 10000
thin <- 10
my.model <- jags.model('mymodel.txt', data = jags.data, inits=inits, n.chains=nc, n.adapt=n.adapt)
update(my.model, n.burn)
my.model_samples <- coda.samples(my.model,params,n.iter=n.iter, thin=thin)
summary(my.model_samples)