如何将样条曲线添加到rjags模型

如何将样条曲线添加到rjags模型,r,bayesian,jags,splines,R,Bayesian,Jags,Splines,在使用rjags拟合样条曲线时,我很难找到信息(我的动机是尝试在jags中重新创建glm以插补缺失的依赖值)。无论如何,我能找到关于这个发现的信息很少,只有交叉验证的答案:。但是,我无法理解那里的样条曲线代码(而且我也没有在那里问问题的名声!)。首先,我不明白为什么代码在S&G上循环 因此,我用jags制作了一个玩具线性模型: library(datasets) library(rjags) library(ggplot2) # Specify a JAGS linear model mk

在使用rjags拟合样条曲线时,我很难找到信息(我的动机是尝试在jags中重新创建glm以插补缺失的依赖值)。无论如何,我能找到关于这个发现的信息很少,只有交叉验证的答案:。但是,我无法理解那里的样条曲线代码(而且我也没有在那里问问题的名声!)。首先,我不明白为什么代码在S&G上循环

因此,我用jags制作了一个玩具线性模型:

library(datasets)
library(rjags)
library(ggplot2)


# Specify a JAGS linear model

mk_jags_lin_mod <- function(prior.a, prior.b){
    sink(paste("lin_reg_jags.mod.txt", sep=""))
    cat(paste0("
               model {
               for (i in 1:N){
               y[i] ~ dnorm(y.hat[i], tau)
               y.hat[i] <- a + b * x[i]
               }
               a ~ ",prior.a,
               "\tb ~ ",prior.b,
               "\ttau <- pow(sigma, -2)
               sigma ~ dunif(0, 100)
               }
               "))
    sink()
}

# Define a default vague prior
default <- "dnorm(0, .0001)\n"

mk_jags_lin_mod(default, default)

# Initialise
jags.cars <- jags.model('lin_reg_jags.mod.txt',
                              data = list('x' = mtcars$hp,
                                          'y' = mtcars$mpg,
                                          'N' = nrow(mtcars)),
                              n.chains = 2,
                              n.adapt = 1000)

# Burn-in
update(jags.cars, 5000) 

# Sample
coda.cars <- coda.samples(jags.cars, variable.names = c('a', 'b', 'y.hat','tau'), n.iter = 1000)

# Extract posterior estimates
coda.sum <- summary(coda.cars)
q <- coda.sum$quantiles

mtcars$fit <- q[4:35 , 3]

ggplot(data=mtcars, aes(x=hp, y=mpg)) + geom_point() +
    geom_line(aes(y=fit, col="red"))
库(数据集)
图书馆(rjags)
图书馆(GG2)
#指定JAGS线性模型

mk_jags_lin_mod好吧,我花了一天的时间,但我终于明白了。。。我想。。。。 我对模型进行了如下修改:

 model {
   for (i in 1:N){
     y[i] ~ dnorm(y.hat[i], tau)
     y.hat[i] <- a + beta[1] + beta[2]*x[i] + beta[3]*pow(x[i], 2) + beta[4]*pow(x[i], 3)
   }

   a ~ dnorm(0, .0001)

   # Specify priors for spline terms
   for (k in 1:4) {
     beta.mu[k] ~ dnorm(0, 100)
     beta.tau[k] ~ dgamma(0.01, 10)
     beta[k] ~ dnorm(beta.mu[k], beta.tau[k])
   }
     tau <- pow(sigma, -2)
     sigma ~ dunif(0, 100)
   }
模型{
for(1:N中的i){
y[i]~d诺姆(y.hat[i],头)

y、 hat[i]好吧,我花了一整天的时间,但我终于明白了……我想。。。。 我对模型进行了如下修改:

 model {
   for (i in 1:N){
     y[i] ~ dnorm(y.hat[i], tau)
     y.hat[i] <- a + beta[1] + beta[2]*x[i] + beta[3]*pow(x[i], 2) + beta[4]*pow(x[i], 3)
   }

   a ~ dnorm(0, .0001)

   # Specify priors for spline terms
   for (k in 1:4) {
     beta.mu[k] ~ dnorm(0, 100)
     beta.tau[k] ~ dgamma(0.01, 10)
     beta[k] ~ dnorm(beta.mu[k], beta.tau[k])
   }
     tau <- pow(sigma, -2)
     sigma ~ dunif(0, 100)
   }
模型{
for(1:N中的i){
y[i]~d诺姆(y.hat[i],头)

y、 帽子[我]检查jagam:Hi,谢谢你的提示,但看看该命令中的示例和它生成的jags模型,我仍然不知道如何修改上面的模型代码。我更喜欢自己直接指定模型,因为我想重新创建以前的模型-jagam似乎动态拾取样条线结-这对meCheck jagam不起作用:嗨,thanks获取提示,但查看该命令中的示例以及它生成的jags模型,我仍然不知道如何修改上面的模型代码。我更喜欢自己直接指定模型,因为我想重新创建以前的模型-jagam似乎会动态拾取样条线结-这对于
dnorm
必须指定为精度,所以您可能指的是
beta.mu[k]~dnorm(01100^-2)
。但是您真的需要估计
beta[k]
的超参数吗?我本以为
对于(1:4中的k)beta[k]~dnorm(0,0.0001)
将满足您的需要。当您查看模拟缺失数据时,您是否在监控
y
,或
y.hat
?观察值通常分布在预期值周围(y.hat,sigma^2)。该标准偏差是根据数据估算的。如果缺少数据,将通过首先计算期望值(即
a+beta[1]+beta[2]*x[i]+beta[3]*pow(x[i],2)+beta[4]*pow(x[i],3)
)来模拟这些数据,然后将正态误差与估计的标准偏差相加。这实际上取决于您是否有任何理由认为丢失的数据比观察到的数据更分散。这可能值得一看。也可能有用。当然,如果您只希望随机数据与y一致,可以从单个链中获取单个样本我们的模型。具有非信息先验的参数的贝叶斯最大后验估计相当于频率最大似然估计。(注意,后验平均值并不总是随机变量的最可能值)必须将
dnorm
的比例参数指定为精度,因此您可能指的是
beta.mu[k]~dnorm(0,100^-2)
。但是您真的需要估计
beta[k]
的超参数吗?我本以为
对于(1:4中的k)beta[k]~dnorm(0,0.0001)
将满足您的需要。当您查看模拟缺失数据时,您是否在监控
y
,或
y.hat
?观察值通常分布在预期值周围(y.hat,sigma^2)。该标准偏差是根据数据估算的。如果缺少数据,将通过首先计算期望值(即
a+beta[1]+beta[2]*x[i]+beta[3]*pow(x[i],2)+beta[4]*pow(x[i],3)
)来模拟这些数据,然后将正态误差与估计的标准偏差相加。这实际上取决于您是否有任何理由认为丢失的数据比观察到的数据更分散。这可能值得一看。也可能有用。当然,如果您只希望随机数据与y一致,可以从单个链中获取单个样本我们的模型。具有非信息先验的参数的贝叶斯最大后验估计相当于频率最大似然估计。(注意,后验平均值并不总是随机变量的最可能值)