простой Gamma GLM в STAN

Пробую простой Gamma GLM в STAN и R, но он сразу вылетает

генерировать данные:

set.seed(1)
library(rstan)
N<-500 #sample size
dat<-data.frame(x1=runif(N,-1,1),x2=runif(N,-1,1))
#the model
X<-model.matrix(~.,dat)
K<-dim(X)[2] #number of regression params
#the regression slopes
betas<-runif(K,-1,1)
shape <- 10
#simulate gamma data
mus<-exp(X%*%betas)
y<-rgamma(500,shape=shape,rate=shape/mus)

это моя модель STAN:

model_string <- "
data {
  int<lower=0> N; //the number of observations
  int<lower=0> K; //the number of columns in the model matrix
  matrix[N,K] X; //the model matrix
  vector[N] y; //the response
}
parameters {
  vector[K] betas; //the regression parameters
  real<lower=0, upper=1000> shape; //the shape parameter
}
model {  
  y ~ gamma(shape, (shape/exp(X * betas)));
}"

когда я запускаю эту модель, R сразу же падает:

m <- stan(model_code = model_string, data = list(X=X, K=3, N=500, y=y), chains = 1, cores=1)

обновление: я думаю, что проблема где-то в векторизации, так как я могу получить работающую модель, в которой я передаю каждый столбец X как вектор.

update2: это тоже работает

  for(i in 1:N)
    y[i] ~ gamma(shape, (shape / exp(X[i,] * betas)));

person spore234    schedule 08.02.2016    source источник


Ответы (1)


Проблема с исходным кодом заключается в том, что в настоящее время в Стэне не определен оператор для скаляра, деленного на вектор. В этом случае shape / exp(X * betas) вы можете сделать shape[1:N] ./ exp(X * betas) или, если это не удастся, (shape * ones_vector) ./ exp(X * betas)

person Ben Goodrich    schedule 08.02.2016
comment
спасибо, я не подумал об этом. Надеюсь, это когда-нибудь будет реализовано, так как большинство языков, использующих векторизацию, используют его таким образом. - person spore234; 10.02.2016