交叉驗證

  • 背景

對於OLS迴歸,經過使的預測偏差(殘差)平方和最小和對響應變量的解釋度(R平方)最大,得到模型因爲等式只是最優化已給出的數據,因此在新數據集上表現並不必定好html

  • 交叉驗證

所謂交叉驗證,即將必定比例的數據挑選出來做爲訓練樣本,另外的樣本做爲保留樣本,如今訓練樣本上獲取迴歸方程,而後在保留樣本上作預測。因爲保留樣本不涉及模型參數的選擇,該樣本可得到比新數據更爲精確的估計ios

  • k重交叉驗證

在k重交叉驗證,樣本被分爲 k 子樣本,輪流將 k-1 個子樣本組合做爲訓練集,另外1一個子樣本做爲保留集。這樣會獲得k個預測方程,記錄 k 個保留樣本的預測表現結果,而後求其平均值。(當 n 是觀測總數目,且 k 爲n時,該方法又稱做刀切法,jackknifing)bootstrap

  • crossval()

bootstrap包中的crossval()函數能夠實現 k 重交叉驗證。下面定義shrinkage()函數對模型的R平方統計量作k重交叉驗證函數

#先定義方法
> shrinkage <- function(fit,k=10){  #定義shrinkage函數
+   require(bootstrap)  #導入包或者加載清單
+   
+   # define functions 
+   theta.fit <- function(x,y){lsfit(x,y)} #lifit()求最小二乘擬合,就是求模型的係數
+   theta.predict <- function(fit,x){cbind(1,x)%*%fit$coef}   # 操做符%*%是矩陣乘法的意思 
+                                                             #將橫向合併的數據按照矩陣乘法的乘以係數
+   
+   # matrix of predictors
+   x <- fit$model[,2:ncol(fit$model)]
+   # vector of predicted values
+   y <- fit$model[,1]
+   
+   results <- crossval(x,y,theta.fit,theta.predict,ngroup=k)#作k重交叉驗證
+   r2 <- cor(y, fit$fitted.values)**2 # raw R2 
+   r2cv <- cor(y,results$cv.fit)**2 # cross-validated R2
+   cat("Original R-square =", r2, "\n")    #cat()表示鏈接並且打印
+   cat(k, "Fold Cross-Validated R-square =", r2cv, "\n")
+   cat("Change =", r2-r2cv, "\n")
+ }
#而後再用shrinkage()函數作10重交叉驗證
> states <- as.data.frame(state.x77[,c("Murder", "Population",
+                                      "Illiteracy", "Income", "Frost")])
> fit <- lm(Murder ~ Population + Income + Illiteracy + Frost, data=states)
> shrinkage(fit)
Loading required package: bootstrap
Original R-square = 0.5669502 
10 Fold Cross-Validated R-square = 0.4816513 
Change = 0.08529897 
> fit2 <- lm(Murder~Population+Illiteracy,data=states)
> shrinkage(fit2)
Original R-square = 0.5668327 
10 Fold Cross-Validated R-square = 0.5301931 
Change = 0.03663961

暫時不是很瞭解《R語言實戰》P195優化

R語言 iterativeBMAsurv包 crossVal()函數中文幫助文檔(中英文對照) - R語言Bioconductor Software庫 - 生物統計家園 - Powered by Discuz! ui

相關文章
相關標籤/搜索