2012-11-06 47 views
6

我想知道如何在R. 礦井的代碼繪製這些多個引導曲線是像繪製多個引導曲線中的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")) 

的多個引導曲線是類似於圖8.2底部在這本書中左邊的一個。 ESL

enter image description here

而且數據名爲骨密度可能是從該網站獲得: data

直接鏈接到文件之中:here

+4

多個自舉曲線?請讓你的例子[reproducible](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)和你的問題明確。 – mnel

+0

書中或圖書網站上沒有代碼。你是否熟悉軟件包:boot? –

回答

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值(因爲總會有自舉重採樣)。你可以通過選擇自己的自由度來解決這個問題,但這可能是很好的。

+0

我從測試中看到,在'smooth.spline'調用中設置'cv = NA'可以消除警告,並且不會影響平滑操作。在閱讀幫助後,我對使用這種方法引入的任何潛在問題有點無知。有什麼想法嗎? – thelatemail

+0

@thelatemail:當我用'cv = NA'運行它時,所有的曲線都被直線代替 - 這不會發生在你身上?類似地,設置'cv = FALSE'會導致太多的自由度,並且曲線過於鋸齒。 –

+0

我不知道我做了什麼,但在某處我弄糊塗的功能。我現在得到和你一樣的結果。將它粉碎到幾個星期。 – thelatemail