Hi, I am trying to use the strategy outlined here [R] Use pcls in "mgcv" package to achieve constrained cubic spline to fit a gam constrained to pass through a fixed value. I can get this to work using mgcv, but am unable to get this to work using brms because the paraPen argument has not been implemented in brms. Does anyone know a way around this, if there is a different strategy that can be used to achieve the same thing or could this be added to brms?
Example constraining spline to pass through a particular point (0,.6)…
Fake some data…
library(mgcv)
library(brms)
set.seed(0)
n ← 100
x ← runif(n)4-1;x ← sort(x);
f ← exp(4x)/(1+exp(4*x));y ← f+rnorm(100)*0.1;plot(x,y)
dat ← data.frame(x=x,y=y)
Create a spline basis and penalty, making sure there is a knot at the constraint point, (0 here, but could be anywhere)
knots ← data.frame(x=seq(-1,3,length=9)) ## create knots
set up smoother…
sm ← smoothCon(s(x, k=9, bs=“cr”), dat, knots=knots)[[1]]
3rd parameter is value of spline at knot location 0,
set it to 0 by dropping…
X ← sm$X[,-3] ## spline basis
S ← sm$S[[1]][-3,-3] ## spline penalty
off ← y*0 + .6 ## offset term to force curve through (0, .6)
fit spline constrained through (0, .6)
b ← gam(y ~ X - 1 + offset(off), paraPen=list(X=list(S)))
lines(x,predict(b))
dat$X ← sm$X[,-3]
dat$off ← off
b2 ← brm(y ~ X - 1 + offset(off), paraPen=list(X=list(S)), data = dat)