對於OLS迴歸,經過使的預測偏差(殘差)平方和最小和對響應變量的解釋度(R平方)最大,得到模型因爲等式只是最優化已給出的數據,因此在新數據集上表現並不必定好html
所謂交叉驗證,即將必定比例的數據挑選出來做爲訓練樣本,另外的樣本做爲保留樣本,如今訓練樣本上獲取迴歸方程,而後在保留樣本上作預測。因爲保留樣本不涉及模型參數的選擇,該樣本可得到比新數據更爲精確的估計ios
在k重交叉驗證,樣本被分爲 k 子樣本,輪流將 k-1 個子樣本組合做爲訓練集,另外1一個子樣本做爲保留集。這樣會獲得k個預測方程,記錄 k 個保留樣本的預測表現結果,而後求其平均值。(當 n 是觀測總數目,且 k 爲n時,該方法又稱做刀切法,jackknifing)bootstrap
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優化