Dear Stan Users,
I am new in stan and I would like to fit a multinomial model with a restriction on the probabilities. I believe it is different from a softmax model, but I am not really sure about it.
Below, you can see my stan model and R code. However, when compiling in R a got some error messages. I looked for help on internet, but no success so far. Please, let me know if some of you already work with a similar model and how to code it in stan.
Thanks.
data {
int K;
int N;
int D;
int y[N, K];
matrix[N, D] X;
}
parameters {
real beta1[3];
real beta2[3];
}
transformed parameters {
real linpred1[N];
real linpred2[N];
matrix[N, D] prob;
for(i in 1:N) {
linpred1[i] = exp(X[i,1]*beta1[1] + X[i,2]*beta1[2] + X[i,3]*beta1[3]);
linpred2[i] = exp(X[i,1]*beta2[1] + X[i,2]*beta2[2] + X[i,3]*beta2[3]);
prob[i,2] = linpred1[i]/(1+linpred1[i] + linpred2[i]);
prob[i,3] = linpred2[i]/(1+linpred1[i] + linpred2[i]);
prob[i,1] = 1 - prob[i,2] - prob[i,3];
}
}
model {
for (i in 1:N) {
y[i,] ~ multinomial(to_row_vector(prob[i,]) );
}
}
set.seed(123)
# Generating the probabilities ---------------------------------------
x1 <- seq(-1, 1, l = 100)
x2 <- rbinom(100, prob = 0.5, size = 1)
X <- model.matrix(~ x1 + x2)
beta1 <- c(0, 0.8, -1)
beta2 <- c(0.5, -0.8, -1)
eta1 <- X%*%beta1
eta2 <- X%*%beta2
pi1 <- exp(eta1)/(1+ exp(eta1) + exp(eta2))
pi2 <- exp(eta2)/(1+ exp(eta1) + exp(eta2))
pi0 <- 1 - pi1 - pi2
# Simulating data set ------------------------------------------------
Y <- matrix(NA, ncol = 3, nrow = 100)
for(i in 1:100) {
Y[i,] <- rmultinom(1, size = 1, prob = cbind(pi0, pi1, pi2)[i,])
}
library(rstan)
data <- list("y" = Y, "K" = 3, "D" = 3, "N" = 100, "X" = X,
beta1 = c(0.1, 0.6, 0), beta2 = c(0.1, 0.8, 0))
fit1 <- stan(
file = "mult1.stan", # Stan program
data = data, # named list of data
chains = 4, # number of Markov chains
warmup = 1000, # number of warmup iterations per chain
iter = 2000, # total number of iterations per chain
cores = 2, # number of cores (could use one per chain)
refresh = 0 # no progress shown
)