在R中绘制多个Bootstrap曲线

6
我想知道如何在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

可以从该网站获取名为骨密度的数据: data

文件的直接链接在这里:here


4
多重自助曲线是什么?请提供一个可复现的例子,并清楚表达你的问题。 - mnel
书中或书网站上没有代码。你熟悉package:boot吗? - IRTFM
1个回答

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

最终结果:

在此输入图片描述

注意:这段代码会产生一些警告(不是错误),看起来像:

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

这是由于引导重采样的原因。 smooth.spline 使用交叉验证来决定给予样条的自由度数,但它不喜欢使用重复的x值(在引导重采样中,这几乎总是会出现)。您可以通过选择自己的自由度数来解决此问题,但对于此目的而言,这可能是可以接受的。

从测试中我发现,在smooth.spline调用中设置cv=NA可以消除警告,似乎不会影响平滑操作。在阅读了帮助文档后,我对使用这种方法可能引入的任何潜在问题有点困惑。你有什么想法吗? - thelatemail
@thelatemail:当我使用cv=NA运行它时,所有曲线都被直线替换了-你没有遇到这种情况吗?同样,设置cv=FALSE会导致自由度过多,曲线过于锯齿状。 - David Robinson
我不知道我做了什么,但是我在某个地方混淆了函数。现在我得到的结果和你一样。把它归咎于漫长的几周吧。 - thelatemail
经常发生。我猜这就是ELS的做法,所以我认为这是正确的选择。 - David Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接