I write a partial sum function for my ordered logistic model. But some errors make me confused. If I use the examples written by others. It still had some mistakes
My partial function like this
real partial_sum(
int[] slice_y,
int start, int end,
matrix x, matrix thresh,
vector beta, int[] g,
real sigma,int K
)
{
real lp = 0;
int N = (end - start + 1);
for(i in 1:N)
lp += ordered_logistic_lpmf(slice_y[i] |x[i]*beta , thresh[g[i]]');
return lp;
}
Error:
Error in stanc(filename, allow_undefined = TRUE) : 0
Semantic error in 'string', line 63, column 12 to column 64:
Ill-typed arguments supplied to function 'reduce_sum'. Expected arguments:
(int[], int, int, matrix, matrix, vector, int[], real, int) => real, int[], int, matrix, matrix, vector, int[], real, int
Instead supplied arguments of incompatible type: (int[], int, int, matrix, matrix, vector, int[], real, int) => real, int[], int, matrix, vector[], vector, int[], int
Full model:
functions {
real partial_sum(
int[] slice_y,
int start, int end,
matrix x, matrix thresh,
vector beta, int[] g,
real sigma,int K
)
{
real lp = 0;
int N = (end - start + 1);
for(i in 1:N)
lp += ordered_logistic_lpmf(slice_y[i] |x[i]*beta , thresh[g[i]]');
return lp;
}
real induced_dirichlet_lpdf(vector c, vector alpha, real phi) {
int K = num_elements(c) + 1;
vector[K - 1] sigma = inv_logit(phi - c);
vector[K] p;
matrix[K, K] J = rep_matrix(0, K, K);
// Induced ordinal probabilities
p[1] = 1 - sigma[1];
for (k in 2:(K - 1))
p[k] = sigma[k - 1] - sigma[k];
p[K] = sigma[K - 1];
// Baseline column of Jacobian
for (k in 1:K) J[k, 1] = 1;
// Diagonal entries of Jacobian
for (k in 2:K) {
real rho = sigma[k - 1] * (1 - sigma[k - 1]);
J[k, k] = - rho;
J[k - 1, k] = rho;
}
return dirichlet_lpdf(p | alpha)
+ log_determinant(J);
}
}
data {
int<lower=1> N; // Number of observations
int<lower=1> K; // Number of ordinal categories
int<lower=1> D;
int<lower=1, upper=K> y[N]; // Observed ordinals
matrix[N,D] x;
int g[N];
int<lower=1> P; //P different threshold
}
parameters {
vector[D] beta;
ordered[K - 1] thresh[P]; // (Internal) cut points
}
model {
for (i in 1:P)
thresh[i] ~ induced_dirichlet(rep_vector(1, K), 0); //P different threshold
target += reduce_sum(partial_sum, y, 1, x, thresh, beta, g, K);
}