STAN работает лучше с единичным масштабом, некоррелированными параметрами. Из руководства STAN §28.4 Моделирование и кривизна модели:
В идеале все параметры должны быть запрограммированы так, чтобы они имели единицу измерения.
масштаб и так, что задняя корреляция уменьшается; вместе эти
свойства означают, что для вращения не требуется вращение или масштабирование
оптимальная производительность алгоритмов Стэна. Для гамильтониана Монте-Карло
это подразумевает матрицу единичной массы, которая не требует адаптации, поскольку она
где алгоритм инициализируется. Риманов гамильтониан монте карло
выполняет эти условия на лету на каждом шагу, но такие
кондиционирование очень дорого в вычислительном отношении.
В вашем случае beta1
привязан к foreigner_n
, который не имеет единичного масштаба и поэтому не сбалансирован по сравнению с beta0
. Кроме того, поскольку foreigner_n
не центрируется, обе бета-версии меняют местоположение p
во время выборки, отсюда и последующая корреляция.
Стандартизация дает более гибкую модель. Преобразование foreigner_n
для центрирования и масштабирования в единицах позволяет модели быстро сходиться и дает эффективные размеры выборки. Я также утверждаю, что бета-версии в этой форме более понятны, поскольку beta0
фокусируется только на местоположении p
, а beta1
касается только того, как изменение в foreigner_n
объясняет изменение в afd_votes/total_votes
.
library(readr)
library(rethinking)
d <- read_csv("https://gist.githubusercontent.com/sebastiansauer/a2519de39da49d70c4a9e7a10191cb97/raw/election.csv")
d <- as.data.frame(d)
d$foreigner_z <- scale(d$foreigner_n)
m1 <- alist(
afd_votes ~ dbinom(votes_total, p),
logit(p) <- beta0 + beta1*foreigner_z,
c(beta0, beta1) ~ dnorm(0, 1)
)
m1_stan <- map2stan(m1, data = d, WAIC = FALSE,
iter = 10000, chains = 4, cores = 4)
Изучив выборку, мы имеем
> summary(m1_stan)
Inference for Stan model: afd_votes ~ dbinom(votes_total, p).
4 chains, each with iter=10000; warmup=5000; thin=1;
post-warmup draws per chain=5000, total post-warmup draws=20000.
mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
beta0 -1.95 0.00 0.00 -1.95 -1.95 -1.95 -1.95 -1.95 16352 1
beta1 -0.24 0.00 0.00 -0.24 -0.24 -0.24 -0.24 -0.24 13456 1
dev 861952.93 0.02 1.97 861950.98 861951.50 861952.32 861953.73 861958.26 9348 1
lp__ -17523871.11 0.01 0.99 -17523873.77 -17523871.51 -17523870.80 -17523870.39 -17523870.13 9348 1
Samples were drawn using NUTS(diag_e) at Sat Sep 1 11:48:55 2018.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at
convergence, Rhat=1).
И, глядя на график пар, мы видим, что корреляция между бета-версиями уменьшена до 0,15:
Дополнительный анализ
Изначально я интуитивно понимал, что основной проблемой является нецентрированный foreigner_n
. В то же время, я был немного смущен, потому что STAN использует HMC / NUTS, что, как мне показалось, должно быть достаточно устойчивым к коррелированным скрытым переменным. Тем не менее, я заметил комментарии в руководстве STAN о практических проблемах с масштабной инвариантностью из-за числовой нестабильности, которые также прокомментировал Майкл Бетанкур в ответе CrossValidated (хотя это довольно старый пост). Итак, я хотел проверить, были ли центрирование или масштабирование наиболее эффективными для улучшения выборки.
Центрирование в одиночку
Центрирование по-прежнему приводит к довольно низкой производительности. Обратите внимание, что эффективный размер выборки составляет буквально одну эффективную выборку на цепь.
library(readr)
library(rethinking)
d <- read_csv("https://gist.githubusercontent.com/sebastiansauer/a2519de39da49d70c4a9e7a10191cb97/raw/election.csv")
d <- as.data.frame(d)
d$foreigner_c <- d$foreigner_n - mean(d$foreigner_n)
m2 <- alist(
afd_votes ~ dbinom(votes_total, p),
logit(p) <- beta0 + beta1*foreigner_c,
c(beta0, beta1) ~ dnorm(0, 1)
)
m2_stan <- map2stan(m2, data = d, WAIC = FALSE,
iter = 10000, chains = 4, cores = 4)
что дает
Inference for Stan model: afd_votes ~ dbinom(votes_total, p).
4 chains, each with iter=10000; warmup=5000; thin=1;
post-warmup draws per chain=5000, total post-warmup draws=20000.
mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
beta0 -0.64 0.4 0.75 -1.95 -1.29 -0.54 0.2 0.42 4 2.34
beta1 0.00 0.0 0.00 0.00 0.00 0.00 0.0 0.00 4 2.35
dev 18311608.99 8859262.1 17270228.21 861951.86 3379501.84 14661443.24 37563992.4 46468786.08 4 1.75
lp__ -26248697.70 4429630.9 8635113.76 -40327285.85 -35874888.93 -24423614.49 -18782644.5 -17523870.54 4 1.75
Samples were drawn using NUTS(diag_e) at Sun Sep 2 18:59:52 2018.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at
convergence, Rhat=1).
И, похоже, все еще есть проблемный сюжет пар:
Масштабирование в одиночку
Масштабирование значительно улучшает выборку! Даже несмотря на то, что полученные постеры имеют довольно высокую корреляцию, эффективные размеры выборки находятся в приемлемых пределах, хотя и значительно ниже, чем при полной стандартизации.
library(readr)
library(rethinking)
d <- read_csv("https://gist.githubusercontent.com/sebastiansauer/a2519de39da49d70c4a9e7a10191cb97/raw/election.csv")
d <- as.data.frame(d)
d$foreigner_s <- d$foreigner_n / sd(d$foreigner_n)
m3 <- alist(
afd_votes ~ dbinom(votes_total, p),
logit(p) <- beta0 + beta1*foreigner_s,
c(beta0, beta1) ~ dnorm(0, 1)
)
m3_stan <- map2stan(m2, data = d, WAIC = FALSE,
iter = 10000, chains = 4, cores = 4)
* * Тысяча шестьдесят-два получая
Inference for Stan model: afd_votes ~ dbinom(votes_total, p).
4 chains, each with iter=10000; warmup=5000; thin=1;
post-warmup draws per chain=5000, total post-warmup draws=20000.
mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
beta0 -1.58 0.00 0.00 -1.58 -1.58 -1.58 -1.58 -1.57 5147 1
beta1 -0.24 0.00 0.00 -0.24 -0.24 -0.24 -0.24 -0.24 5615 1
dev 861952.93 0.03 2.01 861950.98 861951.50 861952.31 861953.69 861958.31 5593 1
lp__ -17523870.45 0.01 1.00 -17523873.15 -17523870.83 -17523870.14 -17523869.74 -17523869.48 5591 1
Samples were drawn using NUTS(diag_e) at Sun Sep 2 19:02:00 2018.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at
convergence, Rhat=1).
График пар показывает, что все еще существует значительная корреляция:
Следовательно, хотя декоррелирующие переменные действительно улучшают выборку, устранение дисбаланса шкалы является наиболее важным в этой модели.