我正在尝试为多级逻辑回归编写 stan 代码。我尝试的模型是具有两个预测变量的混合截距逻辑模型。第一级是儿童级,第二级是妈妈级。当我尝试将我编写的代码的摘要结果与由 function 生成stan_glmer()
的结果进行匹配时,固定截距的结果不匹配。首先,我使用的数据如下:
library(rstanarm)
library(rstan)
data(guImmun, package = "mlmRev")
summary(guImmun)
require(dplyr)
guImmun <- guImmun %>%
mutate(immun = ifelse(immun == "N",0,1))
其次,stan代码编写如下:
data {
int N; // number of obs
int M; // number of groups
int K; // number of predictors
int y[N]; // outcome
row_vector[K] x[N]; // predictors
int g[N]; // map obs to groups (kids to women)
}
parameters {
real alpha;
real a[M];
vector[K] beta;
real<lower=0,upper=10> sigma;
}
model {
alpha ~ normal(0,1);
a ~ normal(0,sigma);
beta ~ normal(0,1);
for(n in 1:N) {
y[n] ~ bernoulli(inv_logit( alpha + a[g[n]] + x[n]*beta));
}
}
将数据拟合到模型:
guI_data <- list(g=as.integer(guImmun$mom),
y=guImmun$immun,
x=data.frame(guImmun$kid2p, guImmun$mom25p),
N=nrow(guImmun),
K=2,
M=nlevels(guImmun$mom))
ranIntFit <- stan(file = "first_model.stan", data = guI_data,
iter = 500, chains = 1)
summary(ranIntFit, pars = c("alpha", "beta", "a[1]", "a[2]", "a[3]", "sigma"),
probs = c(0.025, 0.975),
digits = 2)
我得到了以下结果:
写模型的结果
但是,如果我使用stan_glmer()
函数,结果将如下所示。
M1_stanglmer <- stan_glmer(immun ~ kid2p + mom25p + (1 | mom),
family = binomial("logit"),
data = guImmun,
iter = 500,
chains = 1,
seed = 349)
print(M1_stanglmer, digits = 2)
但结果不匹配,尤其是固定截距的结果。 stan_glmer() 函数生成的结果
谁能帮我弄清楚我的代码有什么问题?谢谢!