I have tried this function in many ways. The first problem I got is that in stan we can not use real values as indexing. So I tried to fix that using integer arrays. But now I can not run the model because I do not know how to call these additional arguments in the model block. The following is my function.

// Create user define function

functions{

real tenismodel(matrix dat, vector theta, vector alpha, int ServerID, int ReceiverID){

vector[rows(dat)] prob;

real t;

real x;

int s;

int re;

real out;

real a;

real f;

real ws;

real rs;

real ms;

real wr;

real rr;

real mr;for (i in 1:rows(dat)){

`t <- dat[i, 1]; x <- dat[i, 2]; s <- ServerID[i]; re <- ReceiverID[i]; a <- theta[s, 1]; f <- theta[s, 2]; ws <- alpha[s, 1]; rs <- alpha[s, 2]; ms <- alpha[s, 3]; wr <- alpha[re, 1]; rr <- alpha[re, 2]; mr <- alpha[re, 3]; if(x == -1){ prob[i] <- f; }else if(t == 1){ prob[i] <- a^x * f^(1 - x); }else if(fmod(t, 2) == 0){ prob[i] <- ((1- a - f) * (rr)^(t/2.0 - 1.0) * (rs)^(t/2.0 - 1.0) * (mr)^x * (wr)^(1-x)); }else { prob[i] <- ((1- a - f) * (rr)^(t/2.0 - 0.5) * (rs)^(t/2.0 - 1.5) * (ms)^(1 - x) * (ws)^x); }`

}

out ← sum(log(prob));

return out;}

}// The input data is a vector ‘y’ of length ‘N’.

data {

int N; // number of observations (rally lengths)

int M; // number of players

matrix [N, 2] dat; // touches, indicator, servereID and receiverID

int ServerID [N];

int ReceiverID [N];

int <lower = 2> m;

row_vector [3] beta1;

row_vector [3] beta2;}

parameters {

`simplex [m] theta_1 [M]; simplex [m] theta_2 [M];`

}

// The model to be estimated.

model {

// Define priorstheta_1 ~ dirichlet(beta1);

theta_2 ~ dirichlet(beta2);

dat ~ tenismodel(theta_1, theta_2, ServerID, ReceiverID);

}

I am getting an error that **“Ill-typed arguments to ‘~’ statement. No distribution ‘tenismodel’ was found with the correct signature.”**

How we can give additional arguments in a user defined function to get the posterior?.