主成分回歸(principal components regression, PCR)
#使用 p1s 庫中的 pcr ()渴數實現主成分回歸 (PCR)
#install.packages("pls") library(pls) set.seed(2) pcr.fit=pcr(Salary~., data=Hitters,scale=TRUE,validation="CV") #設最 validation = "CV" 可以使得pcr ()函數使用十折的交叉驗證計算每個可能的主成分個數M所對應的交叉驗證誤差。 summary(pcr.fit)
validationplot(pcr.fit,val.type="MSEP") #使用 validatìonplot ()函數作出交叉驗證得分的圖像,MSE是均方誤差
結果分析:從程序結果可以看到,當使用 M=16 個成分時,交叉驗證誤差最小。這個取值稍小於M=19 , M=19時 PCR 模型相當於簡單最小二乘估計,因為此時在 PC模型使用了所有的成分,並沒有降低數據的維度。 且是,從圖像可以看到當模型中只納入一個成分時,交叉驗證誤基本相同。這表明使用僅納入少量成分的模型就足夠了。
set.seed(1) pcr.fit=pcr(Salary~., data=Hitters,subset=train,scale=TRUE, validation="CV") #在訓練集上使用 PCR,並評價該方法在測試集上的使用情況。 validationplot(pcr.fit,val.type="MSEP")
結果分析:當使用M=7個成分時,交叉驗證誤差最小。
pcr.pred=predict(pcr.fit,x[test,],ncomp=7) mean((pcr.pred-y.test)^2) #計算測試集MSE
pcr.fit=pcr(y~x,scale=TRUE,ncomp=7) #在整個數據集上使用交叉驗證選擇出的成分個數M=7擬合PCR 模型。 summary(pcr.fit)
偏最小二乘回歸(partial least squares,PLS)
#使用 plsr ()函數可以擬合偏最小二乘回歸模型,該函數也在pls庫中,其句法與pcr () 函數的句法相似。
set.seed(1) pls.fit=plsr(Salary~., data=Hitters,subset=train,scale=TRUE, validation="CV") summary(pls.fit)
validationplot(pls.fit,val.type="MSEP")
結果分析:當使用M=2個成分時,交叉驗證誤差最小。
pls.pred=predict(pls.fit,x[test,],ncomp=2) mean((pls.pred-y.test)^2)
pls.fit=plsr(Salary~., data=Hitters,scale=TRUE,ncomp=2) #使用了交叉驗證選取的 M=2 個成分在整個數據集上建立 PLS 模型。 summary(pls.fit)