Categories: R

R 迴歸分析使用教學與範例,建立模型、分析、預測、繪圖

介紹如何在 R 中使用線性迴歸的工具,建立迴歸模型、分析與預測資料,並畫出相關的圖形。

迴歸分析(regression analysis)在統計學上是一個非常基本的數據分析方法,可以用於分析兩個或多個變數間是否相關,以及相關性的方向與強度等,在建立模型之後還可以用來預測未知的資料。

R 是一個免費且功能強大的統計分析工具,以下我們以實際的範例來示範如何使用 R 進行迴歸分析,建立迴歸模型、預測資料。

讀取資料

大部分的情況下我們通常都會使用 Excel 來儲存自己的數據,如果想要將 Excel 的資料讀進 R 中,最常見的方式就是先將 Excel 表格轉存為 CSV 檔案,然後在 R 中使用 read.csv 函數將資料讀進來。

這裡我們以 iris.csv 這個 CSV 檔案作為範例:

# 讀取 iris.csv
my.iris.df <- read.csv("iris.csv")

read.csv 的參數就是 CSV 檔案的路徑,如果只有寫檔名的話,就會從目前的工作目錄(預設是自己的「文件」資料夾)中尋找該檔案。

如果自己的 CSV 檔案放在別的地方,也可以使用完整的絕對路徑來指定:

# 使用絕對路徑
my.iris.df <- read.csv("D:iris.csv")

由於反斜線在 R 的字串中屬於特殊的跳脫字元,所以在撰寫絕對路徑的時候,凡是要輸入反斜線的地方,都要改成兩個反斜線()。

將資料讀取進來之後,可以用 head 將資料的前幾行輸出來檢查看看:

# 查看 my.iris.df 的資料
head(my.iris.df)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
將 CSV 的表格讀進 R 之後,各欄位的名稱中若有空白等特殊字元的話,會被自動替換成句點(.),它不會影響到資料,只是在變數的指定時要使用新的名稱而已。

資料預處理

將資料成功讀取進 R 中之後,接著檢查一下 my.iris.df 的內部結構:

# 查看 my.iris.df 內部結構
str(my.iris.df)
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

str 的輸出中,每一行代表一個變數欄位,標示了變數名稱與類型,後面接著幾筆實際的資料,以這個例子來說,前四個變數欄位的類型是數值(num),而最後一個 Species 的類型則是類別型的因子(Factor)。

若資料型態沒有問題,再檢查所有的資料是否都完整,也就是說要看看有沒有資料含有缺失值(NA):

# 檢查是否有 NA 的資料
my.iris.df[!complete.cases(my.iris.df),]

正常來說若資料都完整的話,就會輸出空的 data frame 表格:

[1] Sepal.Length Sepal.Width  Petal.Length Petal.Width  Species
<0 rows> (or 0-length row.names)

確認資料與類型都沒問題之後,就可以開始進行資料的分析工作了。

如果在這些檢查中,發現資料的類型不對,或是含有缺失值(NA)等問題,請參考 R 資料修正的方法來處理。

查看資料與繪圖

通常在開始分析資料之前,會先用 summary 看一下各個變數的基本統計量:

# 查看基本統計量
summary(my.iris.df)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500

光看數字可能不是很好理解資料的分佈狀況,把資料畫出來看一下會更清楚。繪圖的方式有好多種,這裡我們示範使用 ggplot2GGally 套件來畫圖的方法,首先安裝一下這兩個套件:

# 安裝 ggplot2 與 GGally 套件
install.packages(c("ggplot2", "GGally"))

載入這兩個套件:

# 載入 ggplot2 與 GGally 套件
library(ggplot2)
library(GGally)

使用 ggpairs 可畫出很漂亮的資料分佈矩陣圖:

# 繪製資料分佈矩陣圖
ggpairs(my.iris.df)
資料分佈矩陣圖

如果只想畫出簡單的 XY 散佈圖,可以這樣畫:

# 畫出 XY 散佈圖
require(ggplot2)
qplot(x = Petal.Length,
      y = Petal.Width,
      data = my.iris.df)

如果想要比較不同的 Species 類別的 XY 散佈圖,可以這樣畫:

# 畫出 XY 散佈圖,依據 Species 上色
require(ggplot2)
qplot(x = Petal.Length,
      y = Petal.Width,
      data = my.iris.df,
      color = Species)
XY 散佈圖

這個例子是以 Petal.LengthPetal.Width 當作 X 與 Y 的座標,若要使用別的變數欄位,就直接把變數名稱替換掉即可。

建立迴歸模型

建立迴歸模型可以使用 lm 這個函數(lm 代表 linear models),假設我們想要拿 Sepal.Length 作為反應變數(也就是 Y),而 Sepal.WidthPetal.LengthPetal.Width 作為解釋變數(也就是 X),則可以執行:

# 建立迴歸模型
iris.lm <- lm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width,
              data = my.iris.df)

其中第一個參數放的就是所謂的公式(formula),它用來表示迴歸模型的一種表示法,中間的 ~ 相當於迴歸公式的等號,左邊的 Sepal.Length 就是 Y,而右邊放的三個變數則是 X。第二個參數 data 則是用來指定資料來源的 data frame。

建立好迴歸模型之後,可以使用 summary 查看模型配適的結果:

# 查看模型配適結果
summary(iris.lm)
Call:
lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width,
    data = my.iris.df)

Residuals:
     Min       1Q   Median       3Q      Max
-0.82816 -0.21989  0.01875  0.19709  0.84570

Coefficients:
             Estimate Std. Error t value Pr(>|t|)
(Intercept)   1.85600    0.25078   7.401 9.85e-12 ***
Sepal.Width   0.65084    0.06665   9.765  < 2e-16 ***
Petal.Length  0.70913    0.05672  12.502  < 2e-16 ***
Petal.Width  -0.55648    0.12755  -4.363 2.41e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3145 on 146 degrees of freedom
Multiple R-squared:  0.8586,    Adjusted R-squared:  0.8557
F-statistic: 295.5 on 3 and 146 DF,  p-value: < 2.2e-16

從這份輸出的結果中,我們可以看出各個解釋變數的係數,若將整個模型寫出來就會像這樣:

Sepal.Length = 0.65084 * Sepal.Width
             + 0.70913 * Petal.Length
             - 0.55648 * Petal.Width
             + 1.856

報表中的 Pr(>|t|) 就是統計上的 p-value,以這裡的值來說,每一個係數都非常顯著。

R-squared 的值為 0.8586,Adjusted R-squared 的值為 0.8557,表示模型的配適情況不錯。

模型診斷

在配適完迴歸模型之後,接著要進行模型診斷,通常會先畫出幾張常用來診斷模型的圖,這裡我們用 ggfortify 這個套件來畫圖,它畫出來的圖會比較漂亮。

# 安裝並載入 ggfortify 套件
install.packages("ggfortify")
library(ggfortify)

接著畫出模型診斷用的圖:

# 畫出模型診斷用的圖
autoplot(iris.lm)
模型診斷用的圖

以這幾張圖來說都算滿標準的,沒有特殊的趨勢或是奇怪的地方,看起來都正常。

在理論上迴歸模型配適完成後,其殘差值(residual)必須符合常態性(normality)、獨立性(independence)以及變異數同質性(homogeneity of variance)三種假設,所以接下來要用三種檢定檢查這三個條件是否符合。

殘差常態性檢定

shapiro.test 函數可以用來檢定殘差值是否符合常態分佈:

# 常態性檢定
shapiro.test(iris.lm$residual)
        Shapiro-Wilk normality test

data:  iris.lm$residual
W = 0.99559, p-value = 0.9349

常態性檢定的 p-value 非常高,所以不拒絕虛無假設,也就是說殘差值的常態分配假設是合理的。

殘差獨立性檢定

獨立性檢定要使用到 car 這個套件,使用前要先安裝它:

# 安裝 car 套件
install.packages("car")

呼叫 durbinWatsonTest 函數進行獨立性檢定:

# 殘差獨立性檢定
require(car)
durbinWatsonTest(iris.lm)
 lag Autocorrelation D-W Statistic p-value
   1     -0.03992126      2.060382   0.822
 Alternative hypothesis: rho != 0

殘差獨立性檢定的 p-value 也非常高,所以也不拒絕虛無假設,亦即殘差值的獨立性假設是合理的。

殘差變異數同質性檢定

殘差的變異數同質性檢定可以使用 car 套件所提供的 函數:

# 殘差變異數同質性檢定
require(car)
ncvTest(iris.lm)
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 4.448612    Df = 1     p = 0.03492962

殘差變異數同質性檢定的 p-value 稍微偏小,以一般 95% 的信賴水準來說,是拒絕虛無假設的,也就是說殘差的變異數沒有符合同質性的假設,但是因為這個 p-value 並沒有非常小,所以證據並不是非常明確。

預測

在迴歸模型建立好之後,就可以利用這個模型來預測新的資料,假設我們收到一些新的觀測值(解釋變數 X):

# 新觀測值
new.iris <- data.frame(Sepal.Width=3.1, Petal.Length=1.6, Petal.Width=0.3)
new.iris
  Sepal.Width Petal.Length Petal.Width
1         3.1          1.6         0.3

若要使用迴歸模型預測新的反應變數,可以使用 predict 函數:

# 預測資料
predict(iris.lm, new.iris)
       1 
4.841259

預測出來的 Sepal.Length 值就是 4.841259

參考資料:RPubs

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

10 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

10 個月 ago