您可以使用smooth.spline
和lines
来绘制样条曲线:
plot.spline = function(x, y, ...) {
s = smooth.spline(x, y, cv=TRUE)
lines(predict(s), ...)
}
因此,根据书中的说明,为了执行引导程序,您需要从数据中随机重复抽样行,并在重新采样的数据上调用plot.spline
:
bootstrap.curves = function(dat, nboot, ...) {
for (i in 1:nboot) {
subdata = dat[sample(NROW(dat), replace=TRUE), ]
plot.spline(subdata$age, subdata$spnbmd, ...)
}
}
bootstrap.curves(dat2[dat2$gender == "female", ], 10, col="red")
bootstrap.curves(dat2[dat2$gender == "male", ], 10, col="blue")
最终结果:
注意:这段代码会产生一些警告(不是错误),看起来像:
1: In smooth.spline(x, y, cv = TRUE) :
crossvalidation with non-unique 'x' values seems doubtful
smooth.spline
使用交叉验证来决定给予样条的自由度数,但它不喜欢使用重复的x
值(在引导重采样中,这几乎总是会出现)。您可以通过选择自己的自由度数来解决此问题,但对于此目的而言,这可能是可以接受的。smooth.spline
调用中设置cv=NA
可以消除警告,似乎不会影响平滑操作。在阅读了帮助文档后,我对使用这种方法可能引入的任何潜在问题有点困惑。你有什么想法吗? - thelatemailcv=NA
运行它时,所有曲线都被直线替换了-你没有遇到这种情况吗?同样,设置cv=FALSE
会导致自由度过多,曲线过于锯齿状。 - David Robinson