Estoy implementando M-spline en R como se define aquí : http://www.fon.hum.uva.nl/praat/manual/spline.html y originalmente en Ramsay (1988).
En resumen, definimos una lista de nudos t tal que :
0=t1=...=tk<tk+1<...<tk+m<tk+m+1=...=tk+m+k=1
Así que el k los primeros nudos son 0 y los k los últimos nudos son 1 con m nudos interiores.
El spline Mi de orden k con nudos t se define recursivamente como sigue :
M_i(x|1,t) = 1 / (t_{i+1} – t_i), t_i x < t_{i+1}, 0 en caso contrario
M_i(x|k,t) = k [(x–t_i)M_i(x|k–1,t) + (t_{i+k}–x)M_{i+1}(x|k–1,t)] / ((k–1)(t_{i+k}–t_i))
El problema es que si quiero las M-splines de orden 3 (k=3), el M_1 spline y el M_{k+m} spline no existen porque cuando se calcula M_i(x|k–1,t) se divide por (t_{i+k}–t_i) pero desde ahora k=3-1=2 y i=1 (o m+k ), (t_{i+k}–t_i) es (t_{1+2}–t_1)=0 ya que los tres primeros nudos son 0 (lo mismo para el último).
Así que la definición parece tener un problema. Aquí está mi implementación en R con un ejemplo del problema. Aquí k=3 y m=3.
ts = c(0,0,0,0.3,0.5,0.6,1,1,1)
Mk = function(i,k,x,ts){
if(k==1){
if(ts[i]<=x && x<ts[i+1]){1/(ts[i+1]-ts[i])}
else{0}
}
else{
#print(paste(i,k))
#print((ts[i+k]-ts[i]))
k*((x-ts[i])*Mk(i,k-1,x,ts)+(ts[i+k]-x)*Mk(i+1,k-1,x,ts))/((k-1)*(ts[i+k]-ts[i]))
}
}
Mk(1,3,.4,ts)
Tenga en cuenta que mi código y la definición parecen funcionar para todas las splines "internas".
Gracias.