2014-05-25 70 views
2

我使用R中平滑樣條函數,但我得到一個警告消息說:在R中的平滑樣條中,'具有非唯一'x'值的交叉驗證意味着什麼似乎令人懷疑'?

> boneMaleSmooth = smooth.spline(bone[males,"age"], bone[males,"spnbmd"], cv=TRUE) 
    Warning message: 
    In smooth.spline(bone[males, "age"], bone[males, "spnbmd"], cv = TRUE) : 
    cross-validation with non-unique 'x' values seems doubtful 

    > boneFemaleSmooth = smooth.spline(bone[females,"age"], bone[females,"spnbmd"], cv=TRUE) 
    Warning message: 
    In smooth.spline(bone[females, "age"], bone[females, "spnbmd"], : 
    cross-validation with non-unique 'x' values seems doubtful 

我讀它的地方,說這沒有多大意義。但我不確定是什麼造成的。希望可以有人幫幫我。

回答

3

這意味着您有一些共享x值的數據點。在大多數情況下,你不應該對實際結果產生太大的影響。但是,使用cv=F是處理這些數據的更好方法。

背後的原因是在smooth.spline代碼,它的作品了x值的總數:

n <- length(x) 

然後它開始處理您的數據(我已經包含註釋):

xx <- round((x - mean(x))/tol) #normalise the data 
nd <- !duplicated(xx) #get rid of duplicated x values! THIS IS PART OF THE WARNING 
ux <- sort(x[nd]) #Sort the data 
nx <- length(ux) $Get the length of processed data to work with 

然後,後來,警告被拋出,如果NX < N:

if (CV && nx < n) #CV is based on the input parameter `cv` 
     warning("cross-validation with non-unique 'x' values seems doubtful") 
1

bone[males,"age"]載體是否包含重複值?如果是這樣,我認爲這是警告的來源。 smooth.spline試圖通過留下一個交叉驗證來確定最佳平滑平滑參數。當你離開的東西有重複時,留下一個cv是一件奇怪的事情,所以它會發出警告。詳細請參照http://stat.ethz.ch/R-manual/R-patched/library/stats/html/smooth.spline.html

一種避免這種情況的方法是在smooth.spline的調用中指定您自己的值spar,並對其進行調整,直到獲得對您有意義的內容爲止。在大多數情況下,交叉驗證可能不會導致問題。另一種方法,也許是爲了避免這個警告,就是稍微抖動你的x值。

更新: 根據@MrFlick的回答,使用廣義交叉驗證(cv = FALSE)似乎建議在幫助文件中。該聲明有點不透明:

'廣義'交叉驗證方法將正確工作,當 有x重複的點。但是,含有重複點的離開一次交叉驗證意味着什麼,而內部代碼使用的近似包括忽略重複點的組 是不明確的。在這種情況下最好避免cv = TRUE。

3

如您所做的那樣設置'cv = TRUE'時使用了「普通」交叉驗證,該驗證使用了一次性類型策略進行驗證。當您重複使用x值時,此策略不太有用。

當你複製x值,建議使用cv=FALSE觸發「廣義的」交叉驗證。請參閱?smooth.spline的討論