Error Ill-typed arguments supplied to assignment operator <-: lhs has type int and rhs has type real

Hello,

In my function, below I want to store a value from an array. However, it seems my variable declarations are not correct. How can i assign a value from an array to a real number?.

functions{

  real tenismodel_lpdf(matrix dat, vector[] theta, vector[] alpha){

  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 <- dat[i, 3];
    re <- dat[i, 4];
    
    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;

 }
}

I am getting an error “Ill-typed arguments supplied to assignment operator <-: lhs has type int and rhs has type real”

I can understand this is because, my s and re variables are integers (they should be integers because I am using again to extract values from an array) but dat[i, 3] and dat[i, 4] are real. How I can overcome this problem?.

Thanks for the help in advance.

I was working with this and I changed the functions by adding new arguments to my tenismodel_lpdf function. These two arguments are integer arrays, so that I can assign them to indexing. However, now my question is how I assign these two arguments in my model block?.

// Create user define function

functions{

  real tenismodel_lpdf(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, 4] dat; // touches, indicator
  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 priors

  
  theta_1 ~ dirichlet(beta1);

  theta_2 ~ dirichlet(beta2);

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

}

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

Are you using RStan? The reason I ask is because you’re using pretty old Stan syntax (some of it is deprecated) and RStan is still a few versions behind the rest of the Stan interfaces. If you’re using RStan I would suggest switching to CmdStanR:

# install cmdstanr R package
remotes::install_github("stan-dev/cmdstanr")

# install CmdStan (cmdstanr runs the command line interface CmdStan for you) 
cmdstanr::install_cmdstan()

Then you can use this more modern version of your Stan code (using the newer array syntax as well as = instead of <-):

functions{

  real tenismodel_lpdf(matrix dat, array[] vector theta, array[] vector alpha, array[] int ServerID, array[] 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, 4] dat; // touches, indicator
  array[N] int ServerID;
  array[N] int ReceiverID;
  int<lower = 2> m; 
  row_vector[3] beta1;
  row_vector[3] beta2;

}

parameters {
  array[M] simplex[m] theta_1;
  array[M] simplex[m] theta_2;
}

// The model to be estimated.
model {
  // Define priors

  
  theta_1 ~ dirichlet(beta1);

  theta_2 ~ dirichlet(beta2);

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

}

I haven’t examined the model too closely (just trying to debug the error), but when I try compiling this with cmdstanr I actually don’t get any errors (I haven’t tried running it since I don’t have the data, so there could be other issues at that point). Check out this vignette for how to compile models with cmdstanr: Getting started with CmdStanR • cmdstanr

1 Like

Thank you jonah.