王 曉 剛
(揚(yáng)州職業(yè)大學(xué), 江蘇 揚(yáng)州 225009)
R語言是一種廣泛用于統(tǒng)計分析與數(shù)據(jù)挖掘的、開源而且完全免費(fèi)的語言,用戶可以通過R的網(wǎng)站得到最新版本的R和來自全世界愛好者貢獻(xiàn)的近萬個用于不同計算的R包及相關(guān)使用說明。R操作界面是字符界面,啟動后出現(xiàn)R的命令提示符是“>”,用戶可以在這里與R交互對話,也可事先建立程序的腳本文件,事后通過菜單“文件運(yùn)行腳本文件…”運(yùn)行。雖然在R社區(qū)中可以查找到R的幾乎所有操作指南,但是信息分散且不成體系。因此,文章針對線性回歸分析符合基本假設(shè)的情況,借助具體例題,總結(jié)在R環(huán)境下的回歸分析過程。
有兩項操作首先值得一提:一是在菜單“文件改變工作目錄…”下改變R的工作目錄,這樣對工作目錄文件之下的文件進(jìn)行操作時可以不需要指定文件路徑;二是可以在菜單“程序包安裝程序包…”下安裝必要的程序包[1]。
在回歸分析中,簡單的四則運(yùn)算及開方、指數(shù)及對數(shù)等運(yùn)算是必須的,下面列舉部分操作示例。
>2+3
#求2與3的和;
>2^10
#求2的10次方;
>sqrt(1024)
#求1024的算術(shù)平方根;
>exp(2)
#求冪e2;
>log(10)
#求ln10。
其中“>”是命令提示符號,“#”是左側(cè)命令的操作或功能說明。
向量是R中樣本數(shù)據(jù)較為常見的組織方式,生成向量的命令函數(shù)是c(),“<-”表示賦值,也可用等號“=”表示賦值。以下給出的是向量的生成、向量的常見運(yùn)算及基本統(tǒng)計指標(biāo)的計算示例如下:
>x<-c(2.3, 3,5, 7.0, 12, 21.7, 32)
#通過函數(shù)c()建立向量并賦值給變量x;
>z=x+y
#向量x與y對應(yīng)元素相加賦給變量z;
> x*y
#向量x與y元素對應(yīng)相乘;
>2*x
#向量x每一元素與2相乘;
>x^2
#向量x每一元素平方;
>min(x)
#求x的最小值;
>mean(x)
#求x的算術(shù)均值;
>sd(x)
#求x的標(biāo)準(zhǔn)差;
>a=rbind(x,y)
#以x,y元素為行組成矩陣并賦給a。
產(chǎn)生有規(guī)律的序列也是回歸分析過程的常見操作,以下是一些有代表性的示例。
>x=1:15
#產(chǎn)生1到15等差數(shù)列,公差為1;
>x=seq(2,15,by=2)
#產(chǎn)生2到15等差數(shù)列,公差為2;
>x=seq(from=2,length=8,by=3.2)
#產(chǎn)生首項為2,公差為3.2,項數(shù)為8的等差數(shù)列;
>x=1:7;logic=x>3
#判別向量x的元素是否大于3,將判別結(jié)果賦給邏輯logic。
數(shù)據(jù)框是R語言的一種數(shù)據(jù)結(jié)構(gòu),以矩陣的形式保存數(shù)據(jù),但不同的列可以是不同的數(shù)據(jù)類型。一個數(shù)據(jù)框相當(dāng)于關(guān)系型數(shù)據(jù)庫中的一張二維表。數(shù)據(jù)框的建立有兩種方法,第一種方法是在命令行上通過函數(shù)data.frame()直接生成。由于回歸分析的數(shù)據(jù)量比較大,變量也比較多,一般不用此法。第二種方法是在其它軟件中輸入數(shù)據(jù),或者數(shù)據(jù)來源本身就是其它軟件的輸出結(jié)果,再讀取到R環(huán)境中處理。R有多種讀取數(shù)據(jù)文件的方法,其中較為簡單而實用的一種為:在較為普及的電子表格軟件Excel中輸入數(shù)據(jù),一個變量占一列,一條記錄占一行,將電子表格另存為“.csv(逗號分隔)”文件,如“file.csv”,存儲位置選擇當(dāng)前工作目錄。下列命令則可以將“file.csv”讀取到R中并以數(shù)據(jù)框的形式賦給數(shù)據(jù)框變量df。
>df=read.csv(“file.csv”)
需要指出的是,電子表格軟件Excel最大行數(shù)與最大列數(shù)是有限制的。最新Excel 2010版本所允許的最大行號是1048576,最大列號是16384,這樣的容量雖然能夠滿足大部分的應(yīng)用需求,但也偶有例外,此時可以在“記事本”中將數(shù)據(jù)文件合并后再在R中讀入。
生成數(shù)據(jù)框后,既可以對某一行整行或某一列整列引用,也可對數(shù)據(jù)框某一行和某一列交叉點(diǎn)的元素引用。如:
>record2=df[2,] #將數(shù)據(jù)框df第2條記錄賦給變量record2,record2是一個向量;
>variable4=df[,4] #將數(shù)據(jù)框df中第4個變量的所有值賦給變量variable4,variable4是一個向量。
>height=df[2, 4] #將數(shù)據(jù)框df第2條記錄第4個變量的值賦值給變量height。
一元經(jīng)性回歸分析包括回歸系數(shù)估計、假設(shè)檢驗、回歸診斷與應(yīng)用三個部分,現(xiàn)舉例說明如下。
例1 表1列出了15起火災(zāi)事故的損失及火災(zāi)發(fā)生地與最近的消防站的距離。
表1 火災(zāi)損失表
試求直線回歸方程并作假設(shè)檢驗。[2]17
將表1在Excel中轉(zhuǎn)置存放,以文件名“file1.CSV”另存為工作目錄中。執(zhí)行下列命令:
>df=read.csv(“file1.csv”)
#讀入數(shù)據(jù)文件,生成數(shù)據(jù)框df
>x=df[,2]; y=df[,3]
#提取df的兩列數(shù)據(jù)分別賦值給兩個向量
>lm.sol=lm(y~1+x)
#執(zhí)行回歸分析命令,分析報告賦給lm.sol
>summary(lm.sol)
#在終端顯示lm.sol
>plot(x,y);abline(lm.sol)
#作散點(diǎn)圖并作擬合的回歸直線見圖1
系統(tǒng)輸出如下:
Call:
lm(formula=y~1+x)
#模型形式
Residuals:
#殘差的五數(shù)總括
Coefficients:
#回歸系數(shù)的估計與顯著性概率
Estimate Std.Error tvalue Pr(>|t|)
(Intercept) 10.2779 1.4203 7.237 6.59e-06***
#回歸常數(shù)的估計與顯著性概率
x km 4.9193 0.3927 12.525 1.25e-08***
#回歸系數(shù)的估計與顯著性概率
Residual standard error: 2.316 on 13 degrees of freedom
#殘差標(biāo)準(zhǔn)差及其自由度
Multiple R-squared: 0.9235, Adjusted R-squared: 0.9176
#決定系數(shù)及修正決定系數(shù)
F-statistic: 156.9 on 1 and 13 DF, p-value: 1.248e-08
#回歸方程方差分析的F值及顯著性概率
結(jié)果表明,回歸方程是
回歸系數(shù)假設(shè)檢驗顯著性概率與回歸方程方差分析的顯著性概率均為1.248×10-8,方程具有統(tǒng)計意義。
對直線回歸方程的回歸診斷一般包括異常點(diǎn)檢測、異方差檢驗及自相關(guān)分析。
2.2.1 異常點(diǎn)檢測
例1的異常點(diǎn)檢測具體操作如下:
>sre=rstandard(lm.sol)
#提取學(xué)生氏殘差并賦值給向量sre
>srelogic=abs(sre)>qt(0.975, length(x)-2);srelogic
#根據(jù)t分布規(guī)律判別異常點(diǎn),輸出TRUE則為異常點(diǎn)
所有點(diǎn)的輸出均為FALSE,表明例1樣本的15個樣本點(diǎn)中,沒有異常點(diǎn)。
2.2.2 異方差檢驗
例1的異方差檢驗具體操作如下:
>e=residuals(lm.sol)
#提取殘差賦值給向量e
>cor.test(x, abs(e),method=“spearman”)
#對自變量x與殘差e的絕對值作等級相關(guān)分析
結(jié)果顯示,自變量x與殘差e的絕對值之間的等級相關(guān)系數(shù)僅為0.114,顯著性概率為0.686>0.05,說明不存在異方差現(xiàn)象。
2.2.3 自相關(guān)分析
在檢驗直線回歸模型是否存在自相關(guān)現(xiàn)象,需要在回歸分析前對存儲數(shù)據(jù)的數(shù)據(jù)框的行記錄按自變量進(jìn)行升序排序。例1的自相關(guān)檢驗具體操作如下:
>df=read.csv(“file1.csv”)
>dfo<-order(df [, “距消防站距離x.km.”])
#計算df按x的行記錄升序索引號并賦值給向量dfo
>df1=df [dfo,]
#按升序索引排序后的記錄賦值給新數(shù)據(jù)框df1
(1)自相關(guān)系數(shù)法
>x=df1 [, 2]; y=df1 [, 3]; lm.sol=lm(y~1+x); e=residuals (lm.sol)
>e1=e [1:14]; e2=e [2: 15]
#e1與e2同位號的元素恰是殘差向量e前后相鄰的兩個元素
>cor.test(e1,e2)
#對相鄰兩點(diǎn)的殘差e1與e2作相關(guān)性檢驗
結(jié)果顯示,相鄰兩點(diǎn)的殘差的相關(guān)系數(shù)僅為-0.186,顯著性概率為0.523> 0.05,說明模型不存在自相關(guān)現(xiàn)象。
(2)DW檢驗
Durbin-Watson檢驗簡稱為DW檢驗,是關(guān)于小樣本的一種檢驗方法[3]。對于大樣本量,該算法可能無法計算p值。在這種情況下,將打印警告并給出近似p值,該p值是使用具有檢驗統(tǒng)計量的均值和方差的正態(tài)近似計算的。
DW檢驗的函數(shù)是dwtest(),該函數(shù)包括在第三方庫lmtest中,而且加載該模塊時需先首先加載R的時間序列基礎(chǔ)庫zoo。DW檢驗法也需要事先對存儲數(shù)據(jù)的數(shù)據(jù)框的行記錄按自變量排序。
>library(zoo);library(lmtest) #加載第三方庫zoo與lmtest
>df=read.csv(“file1.csv”);dfo<-order(df [, “距消防站距離x.km.”]); df1=df [dfo,]
>x=df1 [, 2]; y=df1 [, 3]; lm.sol=lm(y~1+x)
>dwtest(lm.sol)
#對回歸分析報告lm.sol中的回歸模型作DW檢驗
結(jié)果顯示,統(tǒng)計量DW值等于2.221,顯著性概率為0.555,與自相關(guān)系數(shù)的顯著性概率0.523相當(dāng),同樣表明模型不存在自相關(guān)現(xiàn)象。
對于例1的模型,如果已知火災(zāi)地點(diǎn)與消防站的距離x0=7km,那么相應(yīng)的火災(zāi)損失y0可以用R來預(yù)測。
>df=read.csv(“file1.csv”); x=df [, 2]; y=df [, 3]; lm.sol=lm(y~1+x)
>x0=data.frame(x=7)
#新自變量的值應(yīng)以1行1列的數(shù)據(jù)框形式輸入
>y0=predict (lm.sol, x0, interval=“prediction”, leval=0.95); y0 #輸出為點(diǎn)估計值與置信區(qū)間,參數(shù)interval缺
省,則不顯示置信區(qū)間,leval用來指定置信度
結(jié)果顯示,火災(zāi)損失的點(diǎn)估計值是44.713千元,95%的置信區(qū)間是(38.657,50.769)(千元)。
下面舉例介紹多元線性回歸的R方法。
例2 影響一個地區(qū)居民消費(fèi)的因素有很多,本例選取某地區(qū)食品花費(fèi)x1、服裝花費(fèi)x2、職工平均工資x3、人均GDPx4、消費(fèi)價格指數(shù)x5、失業(yè)率x6等9個解釋變量,研究城鎮(zhèn)居民家庭平均每人全年的消費(fèi)性支出y。數(shù)據(jù)來源于2013年《中國統(tǒng)計年鑒》[2]65。數(shù)據(jù)文件為存儲于工作目錄的“file2.csv”。
>df=read.csv (“file2.csv”); x1=df[, 2]; x2=df [, 3]; x3=df [, 4]; x4=df [, 5]; x5=df [, 6]; x6=df [, 7]
>x7=df [, 8]; x8=df [, 9]; x9=df [, 10]; y=df [, 11]
>lm.sol=lm (y ~ 1+x1+x2+x3+x4+x5+x6+x7+x8+x9); summary (lm.sol)
系統(tǒng)輸出與一元線性回歸的輸出基本類似。輸出結(jié)果顯示,變量x1,x2,x3,x5對y的影響具有顯著性意義,而x4,x6,x7,x8,x9對y的影響不具有顯著性?;貧w方程方差分析的顯著性概率小于2.2×10-16,回歸方程是:
具有統(tǒng)計意義,決定系數(shù)0.9923,修正的決定系數(shù)0.9889??偟膩碚f這一模型并不理想,可能與自變量太多或自變量之間存在顯著的相關(guān)性有關(guān)。下面采取逐步回歸的方法改進(jìn)模型。
>lm.step=step (lm.sol, direction=“both”);summary (lm.step)
#系統(tǒng)將輸出逐步回歸的中間步驟,下面只給出最終結(jié)果
Call:
lm(formula=y ~ x1+x2+x3+x5)
Residuals:
Residual standard error: 364 on 26 degrees of freedom
Multiple R-squared: 0.9916, Adjusted R-squared: 0.9903
F-statistic: 769.2 on 4 and 26 DF, p-value: <2.2e-16
3.3.1 異常點(diǎn)檢測
>sre=rstandard (lm.step)
>srelogic=abs (sre)>qt (0.975, length (y)-4-1); srelogic
#按0.05雙側(cè)t界值判斷,第17個樣本點(diǎn)是異常點(diǎn)
>srelogic=abs (sre)>qt (0.995, length (y)-4-1); srelogic
#按0.01雙側(cè)t界值判斷,沒有異常點(diǎn)
3.3.2 異方差檢驗
>e=residuals (lm.step)
>y.fit=predict(lm.step)
#計算每一個樣本點(diǎn)的因變量的估計值存儲于向量y.fit
>cor.test (y.fit,abs (e), method=“spearman”)
#對因變量的估計值與殘差e的絕對值作等級相關(guān)分析
多元線回歸模型的異方差檢驗是通過檢驗因變量的擬合值y.fit與殘差的絕對值abs(e)的等級相關(guān)性進(jìn)行分析。結(jié)果顯示,等級相關(guān)系數(shù)是0.25,顯著性概率是0.174>0.05,所以該模型沒有異方差現(xiàn)象。
3.3.3 自相關(guān)檢驗
檢驗多元回歸模型是否存在自相關(guān)現(xiàn)象,同樣需要在回歸分析前對存儲數(shù)據(jù)的數(shù)據(jù)框的行記錄進(jìn)行排序,一般按因變量升序排序。
>df=read.csv(“file2.csv”);dfo<-order(df[,“y”]);df1=df[dfo,]
>x1=df1[,2];x2=df1[,3];x3=df1[,4];x4=df1[,5];x5=df1[,6];x6=df1[,7];x7=df1[,8]
>x8=df1[,9];x9=df1[,10];y=df1[,11]
>lm.sol=lm(y~1+x1+x2+x3+x4+x5+x6+x7+x8+x9);lm.step=step(lm.sol,direction=“both”)
>e=residuals(lm.step);e1=e[1:30];e2=e[2:31]
>cor.test(e1, e2)
結(jié)果顯示,相鄰兩點(diǎn)的殘差的相關(guān)系數(shù)僅為0.169,顯著性概率為0.371>0.05,說明該模型不存在自相關(guān)現(xiàn)象。
另一方面
>library (zoo); library (lmtest); dwtest (lm.step)
結(jié)果顯示,統(tǒng)計量DW值等于1.611,顯著性概率為0.106,同樣表明模型不存在自相關(guān)現(xiàn)象。
如果某地區(qū)居民的食品花費(fèi)x1=5000元、衣著花費(fèi)x2=1500元、居住花費(fèi)x3=1000元、文教娛樂花費(fèi)x5=1400元,那么可以預(yù)測該地區(qū)居民消費(fèi)支出。
>x0=data.frame(x1=5000,x2=1500,x3=1000,x5=1400)
>y0=predict(lm.step,x0,interval=“prediction”,leval=0.95);y0
#輸出為點(diǎn)估計值與置信區(qū)間,參數(shù)interval缺省
結(jié)果顯示,該地區(qū)居民消費(fèi)支出點(diǎn)估計值為12507.17元,95%的置信區(qū)間為(11709.78,13304.56)(元)。
文章僅僅討論符合基本假設(shè)情形下的回歸分析過程。當(dāng)違背基本假設(shè)時,諸如出現(xiàn)異常點(diǎn)、存在異方差現(xiàn)象或存在自相關(guān)現(xiàn)象時應(yīng)該如何處理,以及回歸分析的其它內(nèi)容,因為篇幅關(guān)系,筆者將另文撰述。