Estoy tratando de obtener la matriz más suave de mi smooth.spline
encajan. Utilizo los datos de densidad mineral ósea de http://statweb.stanford.edu/~tibs/ElemStatLearn/ .
bone <-read.table("bone.data", header=TRUE)
bmd_age <- smooth.spline(bone$age, bone$spnbmd, all.knots=TRUE, cv=TRUE)
bmd_fit <- predict(bmd_age, sort(bone$age))
df <- bmd_age$df
Para obtener una columna de la matriz de suavizado, puedo sustituir el vector de respuesta (bone$spnbmd) por un vector con un solo 1 y el resto lleno de 0's. Es lo que me recomendó el profesor y lo que encontré en internet https://stat.ethz.ch/pipermail/r-help/2006-June/108471.html .
Así que uso
smooth.matrix = function(x){
n = length(x);
sm = matrix(0, n, n);
for(i in 1:n){
y = rep(0, n); y[i]=1;
sm_i = predict(smooth.spline(x, y, df=df),x)$y;
sm[,i]= sm_i;
}
return(sm)
}
sm <- smooth.matrix(bone$age)
Si la matriz de suavizado es correcta, las dos cantidades siguientes deberían ser iguales (ambos valores ajustados del modelo de spline de suavizado).
fromsm <- sm%*%(bone$spnbmd[order(bone$age)])
fromfit <- bmd_fit$y
Sin embargo, no lo son. Creo que el problema está en la definición de smooth.matrix
donde
sm_i = predict(smooth.spline(x, y, df=df),x)$y;
no utiliza el mismo ajuste de suavizado que en bmd_age. He intentado arreglar el grado de libertad, spar, lambda, cv=FALSE, etc. pero no he tenido suerte hasta ahora. ¿Cómo se puede arreglar?