Как прогнозировать значения, используя оценки из rjags/JAGS

После настройки модели и обучения ее с помощью Gibbs Sampling я получил результат всего предсказания скрытых значений с помощью:

jags <- jags.model('example.bug',
               data = data,
               n.chains = 4,
               n.adapt = 100)

update(jags, 1000)

samples <- jags.samples(jags,
         c('r','alpha','alpha_i','alpha_u','u','i'),
         1000)

Где r — это список рейтингов, и некоторые из них не учитываются для прогноза с помощью модели. И предположим, что я могу получить их с помощью r[test], где test — это список целых чисел, указывающих индекс удерживаемого рейтинга. Но когда я попытался заставить их использовать этот способ:

summary(samples$r, mean)[test]

Я только что получил это:

$drop.dims
iteration     chain 
 1000         4 

Не могли бы вы рассказать мне, как получить ожидаемое значение? Заранее спасибо!


person Community    schedule 17.03.2016    source источник
comment
Почему не mean(r[test])?   -  person effel    schedule 17.03.2016
comment
@effel Нет, r должен быть списком оценок, а некоторые из них - NA. Он используется в модели. В этом случае прогнозируемые значения, сгенерированные JAGS, должны быть samples.   -  person    schedule 17.03.2016
comment
Вы можете найти ответ здесь полезным: регрессия и прогнозирование ненаблюдаемых значений"> stackoverflow.com/questions/33662987/   -  person Jacob Socolar    schedule 21.03.2016


Ответы (1)


рисовать samples

При отсутствии ваших данных или модели я продемонстрирую на простом примере здесь, измененный таким образом, чтобы jags отслеживал прогнозируемые результаты.

library(rjags)

# simulate some data    
N <- 1000
x <- 1:N
epsilon <- rnorm(N, 0, 1)
y <- x + epsilon

# define a jags model
writeLines("
  model {
    for (i in 1:N){
      y[i] ~ dnorm(y.hat[i], tau)
      y.hat[i] <- a + b * x[i]
    }
    a ~ dnorm(0, .0001)
    b ~ dnorm(0, .0001)
    tau <- pow(sigma, -2)
    sigma ~ dunif(0, 100)
  }
", con = "example2_mod.jags")

# create a jags model object
jags <- jags.model("example2_mod.jags",
                   data = list('x' = x,
                               'y' = y,
                               'N' = N),
                   n.chains = 4,
                   n.adapt = 100)

# burn-in
update(jags, 1000)

# drawing samples gives mcarrays
samples <- jags.samples(jags, c('a', 'b'), 1000)
str(samples)
# List of 2
#  $ a: mcarray [1, 1:1000, 1:4] -0.0616 -0.0927 -0.0528 -0.0844 -0.06 ...
#   ..- attr(*, "varname")= chr "a"
#  $ b: mcarray [1, 1:1000, 1:4] 1 1 1 1 1 ...
#   ..- attr(*, "varname")= chr "b"
# NULL

извлекать предсказания

Наш результат, samples, представляет собой список из mcarray объектов с размерами 1 x итерации x цепочки. Вы действительно хотели бы запустить диагностику на этом этапе, но мы перейдем к обобщению выборок из апостериорной для ваших прогнозов. Один из подходов — получение среднего значения по цепочкам и итерациям.

# extract posterior means from the mcarray object by marginalizing over 
# chains and iterations (alternative: posterior modes)
posterior_means <- apply(samples$y.hat, 1, mean)
head(posterior_means)
# [1] 0.9201342 1.9202996 2.9204649 3.9206302 4.9207956 5.9209609

# reasonable?
head(predict(lm(y ~ x)))
#         1         2         3         4         5         6 
# 0.9242663 1.9244255 2.9245847 3.9247439 4.9249031 5.9250622 

прогнозы вне выборки

В качестве альтернативы, вот как вы можете делать прогнозы вне выборки. Я просто повторно использую наш существующий вектор признаков x, но вместо этого это могут быть тестовые данные.

# extract posterior means from the mcarray object by marginalizing over chains and iterations (alternative: posterior modes)
posterior_means <- lapply(samples, apply, 1, "mean")
str(posterior_means)
# List of 3
#  $ a    : num -0.08
#  $ b    : num 1
#  $ y.hat: num [1:1000] 0.92 1.92 2.92 3.92 4.92 ...
# NULL


# create a model matrix from x
X <- cbind(1, x)
head(X)
#        x
# [1,] 1 1
# [2,] 1 2
# [3,] 1 3
# [4,] 1 4
# [5,] 1 5
# [6,] 1 6

# take our posterior means 
B <- as.matrix(unlist(posterior_means[c("a", "b")]))
#          [,1]
# a -0.07530888
# b  1.00015874

Учитывая модель, прогнозируемый результат равен a + b * x[i], как мы написали в зазубринах.

# predicted outcomes are the product of our model matrix and estimates
y_hat <- X %*% B
head(y_hat)
#           [,1]
# [1,] 0.9248499
# [2,] 1.9250086
# [3,] 2.9251673
# [4,] 3.9253261
# [5,] 4.9254848
# [6,] 5.9256436
person effel    schedule 17.03.2016
comment
Спасибо за Ваш ответ? Но как extract e.g. posterior means from from your mcarrayobject и что означает X'B? - person ; 17.03.2016
comment
Можете ли вы предоставить data? - person effel; 17.03.2016
comment
Обновлено для демонстрации. - person effel; 17.03.2016