Модели пространства состояний с латентными переменными в R - PullRequest
1 голос
/ 30 сентября 2019

Я пытался оценить модели в пространстве состояний со скрытыми переменными в r, но мне это не удалось. Я пытался сделать это в пакете RSTAN. Кто-нибудь знает, как это сделать лучше?

Допустим, у нас есть две наблюдаемые переменные: ВВП и инфляция. Мы также знаем, что есть три ненаблюдаемые переменные: потенциальный рост, потенциальный ВВП, разрыв производства. Мы хотим оценить ненаблюдаемые переменные и два коэффициента (a1 и a2).

Наша модель:

Уравнения состояния:

  • grow [t] = растут [t-1] + e
  • потенциал [t] = потенциал [t-1] + растут [t] + e
  • пробел [t] = a1 * пробел [t-1] + e

Уравнения измерения:

  • ВВП [т] = потенциал [т] + разрыв [т]
  • инфляция [т] = инфляция [t-1] + a2 * разрыв [t] + e

Здесь я сгенерировал данные:

a1 <- 0.7
a2 <- 0.3

grow <- c()
potential <- c()
gap <- c()
gdp <- c()
inflation <- c()

grow[1] <- 2
potential[1] <- 10
gap[1] <- 0
gdp[1] <- potential[1] + gap[1]/100
inflation[1] <- 2

for (i in 2:100) {
  grow[i] <- grow[i-1] + rnorm(1, 0, 0.1)
  potential[i] <- potential[i-1] + grow[i]/100 + rnorm(1, 0, 0.1)
  gap[i] <- a1*gap[i-1] +  rnorm(1,0,0.1)
  gdp[i] <- potential[i] + gap[i]/100
  inflation[i] <- inflation[i-1] + a2*gap[i]   + rnorm(1,0,0.1)
}

Авот мой код rstan:

data {
  int T; // number of obs
  int P; //number of variables
  matrix[T,P] Y; //dataset of generated series
}

parameters {

  #Coefficients
  vector[1] alfa1; //ar gap
  vector[1] alfa2; //phillips curve

  #State Variables (unobserved economic variables)
  vector[T] gap; // output gap
  vector[T] potential; // potential output
  vector[T] grow; // growth of potential output

  #Innovations
  real<lower = 0> sigma_pot; // The scale of innovations to potential output
  real<lower = 0> sigma_grow; // The scale of innovations to growth in potential output
  real<lower = 0> sigma_gap; // The scale of innovations to output gap
  real<lower = 0> sigma_inf; // The scale of innovations to phillips curve
}


model {
  // priors

  //Innovations
  sigma_pot ~ cauchy(0.2,3);
  sigma_grow  ~ cauchy(0.3,3); 
  sigma_gap ~ cauchy(0.9,5); 
  sigma_inf ~ cauchy(2,5);

  //coefficients
  alfa1 ~ normal(0,1); 
  alfa2 ~ normal(0,1); 


  //Initialize State Equations
  potential[1] ~ normal(0,1);
  grow[1] ~ normal(0,1);
  gap[1] ~ normal(0,1);

  // State Equations
  for(t in 2:T) {
    grow[t] ~ normal(grow[t-1], sigma_grow);
    potential[t] ~ normal(potential[t-1] + grow[t], sigma_pot);
      gap[t] ~ normal( alfa1*gap[t-1], sigma_gap);
  }

  // Measurement Equations
  for(t in 1:T) {
   Y[t,1] = potential[t] + gap[t];
     Y[t,2] ~ normal(Y[t-1,2] + alfa1*gap[t],sigma_inf);
  }
}

Здесь я попробовал модель

mvf_model <- stan(file = "newstan.stan" , 
                  data = list(T = nrow(data),
                              P = ncol(data),
                              Y = data),
                  chains = 4)

И вот ошибка, которую я получил

Cannot assign to variable outside of declaration block; left-hand-side variable origin=data
Illegal statement beginning with non-void expression parsed as
  Y[[t, 1]]
Not a legal assignment, sampling, or function statement.  Note that
  * Assignment statements only allow variables (with optional indexes) on the left;
  * Sampling statements allow arbitrary value-denoting expressions on the left.
  * Functions used as statements must be declared to have void returns

 error in 'model16a4a72378d_newstan' at line 27, column 3
  -------------------------------------------------
    25: transformed parameters {
    26:  for(t in 1:T) {
    27:    Y[t,1] = potential[t] + gap[t];
          ^
    28:   }
  -------------------------------------------------

PARSER EXPECTED: "}"
Error in stanc(file = file, model_code = model_code, model_name = model_name,  : 
  failed to parse Stan model 'newstan' due to the above error.
...