# Strange behaviour of QR re-parameterized splines

As I understand, the QR re-parameterization is useful in cases with correlated predictors, of which I believe splines would be a good example, so I coded up a spline fitting model with QR re-parameterization of the splines. It seems to get higher ESS/time as compared to the non-qr version, but when I plot the posterior samples of the function being fit, there’s some strange jagged portions at the left-hand side that don’t manifest when I do the non-qr version: Below is the Stan code; any ideas what’s going awry?

``````data {
// n_y: number of observations in y
int n_y ;
// y: vector of observations for y
vector[n_y] y ;
// x: unique values of x
vector[n_y] x ;
//num_splines: number of splines
int num_splines ;
//splines: matrix of splines
matrix[n_y,num_splines] splines ;
}
transformed data{
matrix[num_splines,n_y] Q_ast;
Q_ast = transpose( qr_Q(splines) [, 1:num_splines] * sqrt(n_y - 1.0) ) ;
}
parameters {
// noise: measurement noise
real<lower=0> noise ;
// volatility: wiggliness of the functions
real<lower=0> volatility ;
//intercept: intercept of the function
real intercept ;
//slope: slope of the function
real slope ;
// splines_helper: helper variable for splines
row_vector[num_splines] splines_helper ;
}
transformed parameters{
// f: latent functions
vector[n_y] f ;
f = intercept + slope*x + //linear part
to_vector((volatility*cumulative_sum(splines_helper))*Q_ast) ; //wiggly part
}
model {
intercept ~ normal(0, 1) ;
slope ~ normal(0, 1) ;
volatility ~ normal(0, 1) ;
noise ~ normal(0, 1) ;
splines_helper ~ normal(0,1);
y ~ normal(f,noise);
}``````

My guess is you are giving the splines too much flexibility, which when combined with the QR reparameterization means that it can actually get into and out of the region of the parameter space where it overfits.

1 Like