Hello Guys,
I am a very newer here, I have trie to build my own variational inference algorithm in pure R without any package help, however my parameters were very strange at the end of iterations and I had to change.
I am now trying to use the package rstan to help me with that, however when I try to fit the model, some errors occurs and I really need to understand where the problem is.
I will share with you guys, my entire data, stan file and the model I am working.
data {
int<lower=0> N; // Number of observations
int<lower=0> P; // AR model order
int<lower=0> n_u; // Number of lost samples
}
transformed data {
real<lower=0> beta = 0.001; //global beta
real<lower=0> alpha = 0.001; //global alpha
}
parameters {
vector[n_u] x_u; // lost samples vector
real<lower=0> sigma_e; #innovation error
vector[P] a; //coefficients vector
}
model {
vector[N] x; // vector with all samples
matrix[N-P, P] matriz_X; //Matrix X
vector[N-P] x_1; //Vector x1
real p; // related with likelihood
for (n in 1:10)
x[400 + n] = x_u[n]; // Replace the lost samples sampled on position from 401 to 410 on vector x.
for (k in 1:P-1)
matriz_X[, P-k] = x[(k+1):(N-P+k)]; // Building matrix X
for (j in P+1:N) //Building the vector x1 with vector x samples from P+1 to N
for (m in 1:N-P)
x_1[m] = x[j];
//no need to de declared improper priors (x_u and a proportional 1)
sigma_e ~ inv_gamma(alpha, beta); // innovation error prior
// likelihood
p = exp((-(x_1-matriz_X*a)'*(x_1-matriz_X*a))/2*sigma_e)/(2*pi()*sigma_e)^((N-P)/2.0);
}
Here is my R enviroment:
set.seed(1)
# y auxiliar to simulate data
y <- runif(1000, -1, 1)
#known samples + lost samples
c <- matrix(y, ncol =1)
#Fit AR(40) model
ar_model <- ar(c, FALSE, 40)
#Fix coefficients of AR(40) model
list1 <- ar_model$ar
#Simulate 1000 (N = 1000) samples from AR(40) model with fixed coefficients
x <- arima.sim(model = list(ar = list1), n = 1000)
#Collect 10 samples (size = 10) from x as we know the position of lost samples
list2 <- x[c(401:410)]
N <- length(x) #Number of observations
P <- length(list1) #AR model order
n_u = length(list2) # Number of lost samples
list3 = 1 # sigma_e = 1 (innovation error)
# save the above model to a file and compile it
model <- stan_model(file = 'first.stan')
# data list
stan_dat <- list(N=N, P=P, n_u=n_u, x=x)
#Fit using variational bayes
fit <- vb(model, data = stan_dat, init = c(x_u = list1, a = list2, sigma_e = list3), algorithm = "meanfield", check_data = TRUE, output_samples = 100, adapt_iter = 50, refresh = FALSE, seed = 1)
This is the error
Error in sampler$call_sampler(c(args, dotlist)) :
Expecting a single string value: [type=character; extent=51].
Here you can see my model, its structure is very close to Normal, however there is a bad dependence between vector a and matrix X
p_E(\textbf{x},\textbf{a},\sigma^2) =
\frac{1}{{(2 \pi\sigma^2_e)^{\frac{N-P}{2} + \alpha + 1}}}
\exp\{-\frac{1}{2{\sigma^2}_e}((x_1 - Xa )^T(x_1 - Xa )+ \beta)\}
\mathbf{X}=\left[\begin{array}{ccccccc} x_P & x_{P-1} & \cdots & \cdots & x_2 & x_1 \\ x_{P+1} & x_P & \cdots & \cdots & x_3 & x_2 \\ \vdots & \ddots & \ddots & \ddots & \ddots & \vdots \\ x_{N-2} & x_{N-3} & \cdots & \cdots & x_{N-P} & x_{N-P-1} \\ x_{N-1} & x_{N-2} & \cdots & \cdots & x_{N-P+1} & x_{N-P} \end{array}\right]