在R中绘制多个Bootstrap曲线

时间:2012-11-06 04:42:56

标签: r

我想知道如何在R中绘制这些多个bootstrap曲线。 我的代码就像

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"))

多个Bootstrap曲线如本书左下角的图8.2所示。 ESL

enter image description here

可以从这个网站获得名为Bone Mineral Density的数据: data

指向文件的直接链接:here

1 个答案:

答案 0 :(得分:6)

您可以使用smooth.splinelines绘制样条曲线:

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")

最终结果:

enter image description here

注意:此代码会产生许多警告(而非错误),如下所示:

1: In smooth.spline(x, y, cv = TRUE) :
  crossvalidation with non-unique 'x' values seems doubtful

这是因为引导程序重新取样。 smooth.spline使用交叉验证来确定给出样条曲线的自由度数,但是它不希望使用重复的x值(因为实际上总是会有自举重新采样)。你可以通过选择你自己的自由度来解决这个问题,但这可能就是为了这个目的。