1 異常觀測值
states<-as.data.frame(state.x77[,c("Murder",
"Population","Illiteracy","Income","Frost")])
fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states) #回歸分析
summary(fit)
1.1 離群值 (看y,模型做出來之后,預測的特別不准的值)
library(car)
outlierTest(fit)
1.2 高杠桿值(只看x,x值比較突出)
hat.plot<-function(fit){
p<-length(coefficients(fit))#返回各相關系數的長度
n<-length(fitted(fit)) #fitted是一個通用函數,用於從建模函數返回的對象中提取擬合值
plot(hatvalues(fit),main="Index Plot of Hat Values")
abline(h=c(2,3)*p/n,col="red",lty=3) #畫參考線,紅色的
identify(1:n,hatvalues(fit),names(hatvalues(fit))) #標出幾個高杠桿點的名字
}
hat.plot(fit)
結果分析:看到圖的左上角有這句話
,依次點擊高杠桿點(第一條紅線上方的點),然后按鍵盤Esc,就會出現上圖所示的5個點的名字,
1.3 強影響點(如果把強影響點去掉,回歸模型會發生巨大的變化,對參數估計產生強影響)
cutoff<-4/(nrow(states)-length(fit$coefficients)-2)
plot(fit,which=4,cook,levels=cutoff)
abline(h=cutoff,lty=3,col="red")
1.4 綜合給出離群值,高杠桿值、強影響點
library(car)
influencePlot(fit,id=list(method="identity")) #為什么我的不是互動圖
結果分析:在縱軸(y軸)上超過虛線2的就認為是離群點,在橫軸(x軸)認為超過第二根虛線的就是高杠桿點,氣泡很大的點認為是強影響點
2 改進措施
states<-as.data.frame(state.x77[,c("Murder",
"Population","Illiteracy","Income","Frost")])
fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states) #回歸分析
2.1 刪除觀測點
states2<-subset(states,row.names(states)!="Nevada") #刪除Nevada州這個記錄
2.2 變量變換
方式一:y變換
library(car)
summary(powerTransform((states$Murder)))
結果分析:Est Power這個表明了是y的期待值,下方的 0.6055是y的 0.6055次方;lambda = (0)這個0代表logy,做了假設檢驗,這里 pval=0.017297即P值小於0.05,即不合理;lambda = (1)這里的1代表y的一次方,(如果括號里面是-1,則代表y的-1次方),此時統計檢驗的結果 pval=0.14512即P值大於0.05,這個時候不能拒絕,我們會繼續用y=kx做回歸,這個時候就不會考慮上方的期待值Est Power
方式二:對x變換
boxTidwell(Murder~Population+Illiteracy,data=states)
結果分析:這里給出了Murder= Population的 0.86939 次方 + Illiteracy的1.35812次方,並且Pr(>|z|) 都大於0.05,不能拒絕,所以我們會保留y = k0 + k1x + k2x 這種形式
2.3 增加或刪除變量
states2<-subset(states,row.names(states)!="Nevada",select=c(-Income,-Frost))
解釋:這里刪除了州Nevada所在行的記錄,並且刪除了兩列Income和Frost
3 選擇最佳的回歸模型
states<-as.data.frame(state.x77[,c("Murder",
"Population","Illiteracy","Income","Frost")])
fit1<-lm(Murder~Population+Illiteracy+Income+Frost,data=states) #回歸分析
fit2<-lm(Murder~Population+Illiteracy,data=states) #回歸分析
3.1 模型比較
(1)anova(fit1,fit2)
結果分析:Pr(>F)=0.9939大於0.05,所以不能拒絕原假設,即我們的兩個模型fit1和fit2沒什么差別
(2)AIC(fit1,fit2)
結果分析:AIC是對模型精度和簡潔的權衡,越小越好,所以我們更傾向於選擇fit2(即兩變量Population和Illiteracy 模型)
3.2 變量選擇
library(MASS)
stepAIC(fit1,direction="backward")
結果分析:首先給出AIC的值,即AIC=97.75,之后通過一個個刪除變量,每次計算AIC的值,若刪除某變量能使AIC的值變小,就給刪除,因此最后得出了最佳的模型,即lm(formula = Murder ~ Population + Illiteracy, data = states),並且給出了各變量的系數
3.3 全子集回歸
上節中的輪流刪除會存在爭議,沒有排列組合,所以用此來做排列組合確定精度更佳
library(leaps)
leaps<-regsubsets(Murder~Population+Illiteracy+Income+Frost,data=states,nbest = 4)
plot(leaps,scale="adjr2")
結果分析:縱軸是我們需要看的,最上面的是最優擬合的
4 深層次分析
states<-as.data.frame(state.x77[,c("Murder",
"Population","Illiteracy","Income","Frost")])
fit1<-lm(Murder~Population+Illiteracy+Income+Frost,data=states) #回歸分析
fit2<-lm(Murder~Population+Illiteracy,data=states) #回歸分析
4.1 交叉驗證
install.packages("bootstrap") #下載包
shrinkage<-function(fit,k=10){ #自定義函數,定義形參
require(bootstrap) #類似與library(),加載包的功能
theta.fit<-function(x,y){lsfit(x,y)} #lsfit是最小二乘法擬合,theta.fit是線性模型
theta.predict<-function(fit,x){cbind(1,x)%%fit$coef}
#cbind(1,x)給x多增加一列,這一列全部是1,fit$coef是回歸系數, theta.predict是線性模型的預測
x<-fit$model[,2:ncol(fit$model)] #x是所有行,並且是第2列到最后一列
y<-fit$model[,1] #y是fit1表的第一列中的內容
resules<-crossval(x,y,theta.fit,theta.predict,ngroup=k) #傳遞參數,做k重交叉驗證
r2<-cor(y,fit$fitted.values)^2 #求原始的R平方
r2cv<-cor(y,resules$cv.fit)^2 #求交叉驗證之后的R平方
cat("Original R-square=",r2,"\n") #cat()函數是把字符串連接起來的功能,把結果輸出到屏幕上
cat(k,"Fold Cross-Validated R-square=",r2cv,"\n")
cat("Chage=",r2-r2cv,"\n")
}
結果分析:經過10重驗證之后,即設置k=10,R-square改變了很多,其中改變值 Chage= 0.5635281 ,改變值比較大,說明模型不穩定
結果分析:經過10重驗證之后,即設置k=10,R-square改變很小,其中改變值 Chage= 0.1983639 ,改變值很小,說明模型穩定
4.2 相對重要性
states<-as.data.frame(state.x77[,c("Murder",
"Population","Illiteracy","Income","Frost")])
fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)
zstates<-as.data.frame(scale(states)) #對每列數據標准化
zfit<-lm(Murder~Population+Illiteracy+Income+Frost,data=zstates) #做回歸分析
coef(zfit) #求回歸系數
結果分析:文盲率Illiteracy每增加1個點,謀殺率Murder會增加6.8個