6

Rでこれらの複数のブートストラップ曲線を描く方法を考えています。私のコードは次のようになります

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 Curve は、この本の図 8.2 左下のようなものです。 ESL

ここに画像の説明を入力

また、Bone Mineral Density という名前のデータは、この Web サイトから取得できます。

ファイルへの直接リンクは次のとおりです。

4

1 に答える 1

6

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ます (事実上、ブートストラップのリサンプリングでは常に存在するため)。独自の自由度を選択することでこれを回避できますが、これはおそらくこの目的には問題ありません。

于 2012-11-06T16:12:51.250 に答える