我正在尝试获得不smooth.spline
适合我的更平滑的矩阵。我使用来自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
为了获得更平滑矩阵的列,我可以将响应向量 (bone$spnbmd) 替换为具有单个 1 的向量,其余的填充为 0。这既是教授推荐的,也是我在网上找到的https://stat.ethz.ch/pipermail/r-help/2006-June/108471.html。
所以我用
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)
如果更平滑的矩阵是正确的,则以下两个量应该相同(均来自平滑样条模型的拟合值)。
fromsm <- sm%*%(bone$spnbmd[order(bone$age)])
fromfit <- bmd_fit$y
但是,它们不是。我认为问题在于smooth.matrix
函数的定义,其中
sm_i = predict(smooth.spline(x, y, df=df),x)$y;
没有使用与 bmd_age 中相同的平滑拟合。我尝试过修复自由度、晶石、lambda、cv=FALSE 等,但到目前为止还没有运气。如何解决?