I am wondering how to draw these multiple bootstrap curves in R. The codes of mine is like
dat2 <- read.delim("bone.data", sep ="\t", header= TRUE)
y <- dat2[,4]
x <- dat2[,2]
plot(x,y,xlab="age",ylab="BMD",col=ifelse(dat2[,3]=="female","red","blue"))
The multiple Bootstrap Curves are like Fig 8.2 bottom left one in this book. ESL
And the data named Bone Mineral Density could be get from this website: data
The direct link to the file being: here
You can plot a spline curve using smooth.spline
and lines
:
plot.spline = function(x, y, ...) {
s = smooth.spline(x, y, cv=TRUE)
lines(predict(s), ...)
}
So to perform bootstrapping, as per the instructions in the book, you sample random rows from the data with replacement, and call plot.spline
on the resampled data:
bootstrap.curves = function(dat, nboot, ...) {
for (i in 1:nboot) {
subdata = dat[sample(NROW(dat), replace=TRUE), ]
plot.spline(subdata$age, subdata$spnbmd, ...)
}
}
You can thus use this function to run separate plots for male and female:
bootstrap.curves(dat2[dat2$gender == "female", ], 10, col="red")
bootstrap.curves(dat2[dat2$gender == "male", ], 10, col="blue")
End result:
Note: This code will produce a number of warnings (not errors) that look like:
1: In smooth.spline(x, y, cv = TRUE) :
crossvalidation with non-unique 'x' values seems doubtful
This is because of the bootstrap resampling. smooth.spline
uses cross validation to decide on the number of degrees of freedom to give a spline, but it prefers not to do so with duplicate x
values (as there effectively always will be with bootstrap resampling). You could get around this by choosing your own number of degrees of freedom, but this is probably fine for this purpose.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With