Try   HackMD

線性迴歸的統計性質與假設檢定

tags: Stats

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

回想到古典統計假設二:對於

i=1,2,3,,n
yi=β0+β1xi1+β2xi2++βKxiK+εi

其中
{xi1,xi2,,xiK}
是非隨機的,
E(εi)=0
var(εi)=σ2
,且
cov(εi,εj)=0
。而根據統計古典假設一:

E(β^)=β,cov(β^)=σ2(XX)1
E(s2)=σ2
,其中
s2=1nK1i=1nεi^2=1nK1ε^ε^

而分母為

nK1 的統計意涵解釋為:「有
n
個變數,其中
K
為解釋變數個數,作為懲罰項;
1
則為截距項個數」。不過,我們關心的是
β^
的分配是什麼?我們可以做一個最基本的假設,就是令其服從常態分配,即
εii.i.d.N(0,σ2).

也就是說,
yN(Xβ,σ2I)


β^=(XX)1XyN(β,σ2(XX)1)

簡單線性迴歸的假設檢定

對於經濟學家來說,當我們想要了解一些經濟現象時,便會建構一些模型,試圖去驗證、解釋它。假設一個 Cobb-Douglas 函數

Q=AKαLβ
對其取對數並加上誤差項,便可以得到實證模型:
qt=μ+αkt+βt+ϵt,t=1,2,,T

其中
qt=lnQt
kt=lnKt
,且
t=lnLt
。我們可以檢測其是否為固定規模報酬(constant return to scale, CRTS),即檢定:

H0:α+β=1H1:α+β<1
另一個有趣經濟學(或財務金融上)實證問題:效率市場假說
rt=μ+lt1γ+ϵt

其中
rt
代表在
t1
t
期間資產所得之報酬,而
lt1
則是在時點
t1
時的公開資訊。如果我們要驗證它,就必須檢測
γ
是否為
0

Pizza 的例子

options(width = 70)
Pizza <- read.csv("pizza_delivery.csv")
head(Pizza)
##  day date time operator branch driver temperature
##  1 Thursday 01-May-14 35.12837 Laura East Bruno 68.28772
##  2 Thursday 01-May-14 25.20307 Melissa East Salvatore 70.99779
##  3 Thursday 01-May-14 45.64340 Melissa West Salvatore 53.39415
##  4 Thursday 01-May-14 29.37430 Melissa East Salvatore 70.30660
##  5 Thursday 01-May-14 29.99461 Melissa West Salvatore 71.50169
##  6 Thursday 01-May-14 40.25432 Melissa Centre Bruno 60.75950
##    bill   pizzas free_wine got_wine discount_customer
##  1 58.4        4         0        0                 1
##  2 26.4        2         0        0                 0
##  3 58.1        3         1        0                 0
##  4 35.2        3         0        0                 0
##  5 38.4        2         0        0                 0
##  6 61.8        4         1        1                 0

經理關心的事情是:外送員是否會「準時」的送達客戶家中,且沒有送出免費的酒。我們可以做一個時間(

time)與外送員(
operator
)

lm(time~operator, data = Pizza)
##
## Call:
## lm(formula = time ~ operator, data = Pizza)
##
## Coefficients:
## (Intercept) operatorMelissa
##     34.1030          0.2551

我們可以令一個二元變數(dummy variable)

0 代表外送員 Laura,
1
代表 Melissa。那為什麼我們不單純就建立兩個分別給這兩位外送員的解釋變數呢?當然,很明顯這會造成線性重合的問題,[1] 所以我們要盡可能避免它。回到上面的例子,
operatorMelissa
係數檢定出來的結果是
0.2551

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

箱型圖可以告訴我們一件事: Melissa可能只是運氣不好!多花了大約15秒。

Laura: "I am a better operator than Melissa, since the time is shorter when the order is operated by me."

Melissa: "The time difference is only 0.2551 minutes (15.31 seconds)! I don’t think 0.2551 is very different from zero

""

那我們要怎麼用假設檢定去驗證 Laura 與 Melissa 他們各自的論述呢?沒錯!我們可以進行假設檢定!令

βom 代表 Melissa,且

H0:βom=0H1:βom>0
我們已經知道
β^
矩陣服從常態分配:
β^N(β,σ2(XX)1)

Pizza <- read.csv("pizza_delivery.csv")
pizza.lm <- lm(time~operator,data=Pizza,x=TRUE)
sum(pizza.lm$residualsˆ2)/pizza.lm$df.residual
## [1] 41.76744

接著我們可以利用 solve() 這個指令解線性關係。[2]

solve(t(pizza.lm$x) %*% pizza.lm$x)
##                  (Intercept)   operatorMelissa
## (Intercept)      0.001567398      -0.001567398
## operatorMelissa -0.001567398       0.003159755

在統計古典假設二之下,

β^omN(β,σ2×0.003159755)
而根據我們上面設定的虛無假設:
H0:βom=0

β^omN(0,σ2×0.003159755)

事實是,我們不知道

σ2,但我們可以知道其不偏估計式
s2

s2=41.76744

41.76744×0.003159755=0.1319749,這就代表我們可以說
βomN(0,0.1319749)
了嗎?考慮一個簡單線性迴歸的虛無假設:
H0=cβ=γ
,而因為

β^N(β,σ2(XX)1)

所以我們得到

cβ^N(cβ,σ2c(XX)1c)

舉例來說,如果我們令

c=[10,,0],以及
γ=0
,那麼虛無假設則為
H0:β0=0
。而在虛無假設下

cβ^N(γ,σ2c(XX)1c)

Z 值等於

Z=cβ^γσc(XX)1cN(0,1)

但實際情況

σ2 通常是未知的,因此我們必須透過樣本變異數
s2
進行估計。故得到
T
值為

T=cβ^γsc(XX)1ct(nK1)

單個樣本的
T
檢定

我們可以用 Monte Carlo 模擬實際的情況。假設一個簡單迴歸式為

y=Xβ+ε,其中
X=[111213],β=[21], 且 εN(0,0.25×I)

# Generate 5000 zeros
Z = T = numeric(5000)

# Create a matrix of X
X <- cbind(rep(1,3), (1:3))

# Solve (XᵀX)⁻¹
Xinv <- solve(t(X) %*% X)

# Create a matrix of Y
for (r in 1:5000) {
    Y <- X %*% c(2, 1) + 0.5 * rnorm(3)
    beta.h <- Xinv %*% t(X) %*% Y
    s <- sqrt(sum((Y - X %*% beta.h)^2))
    Z[r] <- (beta.h[2] - 1) / (0.5 * sqrt(Xinv[2,2]))
    T[r] <- (beta.h[2] - 1) / (s * sqrt(Xinv[2,2]))
}


# Print out the results
c(mean(Z<qnorm(0.025)),mean(Z<qnorm(0.05)),mean(Z<qnorm(0.1)))
## [1]  0.0268 0.0532 0.1018

c(mean(T<qnorm(0.025)),mean(T<qnorm(0.05)),mean(T<qnorm(0.1)))
## [1]  0.1478 0.1746 0.2124

c(mean(T<qt(0.025,1)),mean(T<qt(0.05,1)),mean(T<qt(0.1,1)))
## [1]  0.0254 0.0498 0.1000

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

summary(lm(time~operator,data=Pizza))
##
## Call:
## lm(formula = time ~ operator, data = Pizza)
##
## Residuals:
##      Min      1Q Median     3Q     Max
## -22.0921 -4.1931 0.2245 4.2840 18.9933
##
## Coefficients:
##                 Estimate  Std. Error  t value  Pr(>|t|)
## (Intercept)      34.1030      0.2559  133.286   <2e-16 ***
## operatorMelissa  0.2551       0.3633    0.702    0.483
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
##
## Residual standard error: 6.463 on 1264 degrees of freedom
## Multiple R-squared: 0.00039, Adjusted R-squared: -0.0004009
## F-statistic: 0.4931 on 1 and 1264 DF, p-value: 0.4827

我們算出跟上面一樣的結果:

opeartorMelissa 的係數為
0.2551
,標準差為
0.3663
T
值為
0.702
,而在給定顯著水準為
α=0.05
之下,
0.702<1.64606
,代表我們沒有足夠證據拒絕虛無假設。那麼
p
值呢?
p
值代表
P(T>t)

1 - pt(0.702, 1264)

## [1] 0.2414042

因為

0.2414042>0.05,也告訴我們沒有足夠證據拒絕虛無假設。對於對立假設,我們可以計算其拒絕域

c(qt(0.025, 1264), qt(0.975, 1264))

## [1] -1.961843 1.961843

因為

0.7021.961843
0.7021.961843
:不拒絕虛無假設;最後
p
值則是
P(T>|t|)

pt(-0.702, 1264) + (1 - pt(0.702, 1264))

## [1] 0.4828084

因為

0.4828084>0.05,我們不拒絕虛無假設。

兩個樣本的
T
檢定

給定

{Xi}i=1nXi.i.dN(μX,σ2) 以及
{Yi}i=1nYi.i.dN(μY,σ2)
。我們設定虛無假設為:
H0:μXμY=0
,母體變異數可被
s2
估計為
s2=(nX1)sX2+(nY1)sY2nX+nY2=i=1nX(XiX¯)2+i=1nY(YiY¯)2nX+nY2

因此在虛無假設下:
T=X¯Y¯s2nX+s2nYt(nX+nY2)

Pizza <- read.csv("pizza_delivery.csv")
summary(lm(time~branch+bill+operator,data=Pizza))
##
## Call:
## lm(formula = time ~ branch + bill + operator, data = Pizza)
##
## Residuals:
##      Min      1Q  Median     3Q     Max
## -18.8794 -3.9774 -0.3761 3.7712 17.6560
##
## Coefficients:
##                 Estimate  Std. Error t value Pr(>|t|)
## (Intercept)     26.19138     0.78752  33.258  < 2e-16 ***
## branchEast      -3.03606     0.42330  -7.172 1.25e-12 ***
## branchWest      -0.50339     0.38907  -1.294    0.196
## bill             0.21319     0.01535  13.885  < 2e-16 ***
## operatorMelissa  0.15973     0.31784   0.503    0.615
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
##
## Residual standard error: 5.653 on 1261 degrees of freedom
## Multiple R-squared: 0.2369, Adjusted R-squared: 0.2345
## F-statistic: 97.87 on 4 and 1261 DF, p-value: < 2.2e-16

βbill 代表帳單的係數,我們欲檢測虛無假設
H0:βbill=0
是否成立。根據上面的結果,在顯著水準
α=0.05
下,我們可以拒絕虛無假設。注意到
\verb|R|
在進行迴歸分析的假設檢定時,會透過星號(asterisk)告訴我們顯著水準:

  • .:代表顯著水準為
    0.1
  • *:代表顯著水準為
    0.05
  • **:代表顯著水準為
    0.01
  • ***:代表顯著水準為
    0.001

多元線性迴歸的假設檢定

有時候我們想要同時檢定多個係數。令

βbe 為東區分店的係數,
βbw
為西區分店的係數,我們想要檢定這兩個係數是否為
0
,即
H0:βbe=βbw=0
,也就是檢定由哪家分店處理訂單,與披薩從接線員到送達客戶手中那一刻前所花的時間,是否存在一定的關係。最簡單的想法是:對於這兩個係數,我們個別寫下其
t
值,然後按次序地(sequentially)進行
T
檢定。也就是:
H0,1:βbe=0H0,2:βbw=0

而當我們拒絕其中一個虛無假設

H0,1
H0,2
後,就說我們可以拒絕
H0
。但這個想法跟作法其實不太好,因為這牽涉到假設檢定的基本邏輯。

假設檢定的本質:避免扭曲 size (Size Distortion)

我們是先選定一個夠小的機率,當然目前都是承襲 Ronald Fisher 於 100年前的

α 值,即
0.05
。在虛無假設是正確的前提下,我們寫下一個拒絕域,如果虛無假設是正確的,我們有
0.05
的機率拒絕虛無假設,也就是犯下所謂的型一錯誤(Type I error)。但如果我們將虛無假設拆分成兩個(也就是上面的想法)並依序檢定,檢定第一個虛無假設而犯下型一錯誤的機率為
0.05
;檢定第二個虛無假設而犯下型一錯誤的機率亦為
0.05
。但是!連續兩次不犯下型一錯誤的機率絕對不會是
0.05
,也就是

P(H0,1 is rejected)+P(H0,2 is rejectedH0,1 is not rejected)>0.05.

除非

P(H0,2 is rejectedH0,1 is not rejected)=0。一切的麻煩都源自於我們寫下了兩個統計量

F
檢定

我們可以把虛無假設寫成

H0:Rβ=r,其中
R
代表一個
q×(K+1)
的矩陣,
K+1
表示我們有幾個解釋變數(包含截距項),
q
則是有幾個虛無假設要檢定;而
r
則是一個
q×1
的向量。回到上面的例子,令

R=[0100000100],β=[β0βbeβbwβbillβom],r=[00]

因此 虛無假設

H0:βbe=βbw=0 就可以寫成
H0:Rβ=r
。在統計古典的假設二之下,

β^=(XX)1XyN(β,σ2(XX)1)

因此

Rβ^rN(Rβr,σ2R(XX)1R)

根據我們的虛無假設,

Rβ^rN(0,σ2R(XX)1R)

那麼

1σ(R(XX)1R)1/2(Rβ^r)N(0,I)

但一樣的問題

σ 仍是未知的,而且這是一個
q×1
的向量,而不是一個統計量。不過有個方法可以解決上述的問題:因為上面的形式有根號,我們何不把它透過平方消除然後相加總呢?這個想法就是我們之前學過
χ2
分配的由來:當
X1,X2,,Xk i.i.d. N(0,1)
,則
Y=X12+X22++Xk2χ2(k)
。令

X2=1σ2(Rβ^r)(R(XX)1R)1(Rβ^r)

則,

X2χ2(q)

到了這一步看起來算是可以了,但

σ2 還是未知的,不過很簡單就可以解決:利用樣本變異數的不偏性取代母體變異數,

F=(Rβ^r)(R(XX)1R)1(Rβ^r)/qε^ε^/(nK1)

其中,

ε^ε^/(nK1) 就是
s2
。則,

FF(q,nK1)

考慮一個 Monte Carlo 模擬實驗。令

y=Xβ+ε,其中

X=[111213],β=[21],εN(0,0.25×I)

# Generate 5000 zeros
C = F = numeric(5000)

# Create a matrix of X
X <- cbind(rep(1,3), (1:3))

# Solve (XᵀX)⁻¹
Xinv <- solve(t(X) %*% X)

# Create a matrix of Y
for (r in 1:5000) {
    Y <- X %*% c(2, 1) + 0.5 * rnorm(3)
    beta.h <- Xinv %*% t(X) %*% Y
    s2 <- sum((Y - X %*% beta.h)ˆ2)
    C[r] <- t(beta.h-c(2,1)) %*% t(X) %*% X %*% (beta.h-c(2,1)) / 0.25
    F[r] <- t(beta.h-c(2,1)) %*% t(X) %*% X %*% (beta.h-c(2,1)) / (2*s2)
}

# Print out the results
c(mean(C<qchisq(0.05,2)),mean(C<qchisq(0.1,2)),mean(C<qchisq(0.5,2)))
## [1] 0.0552 0.1006 0.4976

c(mean(F<qf(0.05,2,1)),mean(F<qf(0.1,2,1)),mean(F<qf(0.5,2,1)))
## [1] 0.0532 0.1022 0.5020

Pizza <- read.csv("pizza_delivery.csv")
summary(lm(time~branch+bill+operator,data=Pizza))
##
## Call:
## lm(formula = time ~ branch + bill + operator, data = Pizza)
##
## Residuals:
##      Min      1Q  Median     3Q     Max
## -18.8794 -3.9774 -0.3761 3.7712 17.6560
##
## Coefficients:
##                Estimate  Std. Error t value Pr(>|t|)
## (Intercept)    26.19138     0.78752  33.258  < 2e-16 ***
## branchEast     -3.03606     0.42330  -7.172 1.25e-12 ***
## branchWest     -0.50339     0.38907  -1.294    0.196
## bill            0.21319     0.01535  13.885  < 2e-16 ***
## operatorMelissa 0.15973     0.31784   0.503    0.615
## ---
## Signif. codes:
## 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
##
## Residual standard error: 5.653 on 1261 degrees of freedom
## Multiple R-squared: 0.2369, Adjusted R-squared: 0.2345
## F-statistic: 97.87 on 4 and 1261 DF, p-value: < 2.2e-16

回到原本的例子,虛無假設為

H0:βbe=βbw=0,也就是
H0:Rβ=r
,則

Pizza <- read.csv("pizza_delivery.csv")
pizza.lm <- lm(time~branch+bill+operator,data=Pizza)
b <- pizza.lm$coefficients
V <- vcov(pizza.lm)
R <- matrix(c(0,0,1,0,0,1,0,0,0,0),nrow=2)
F <- t(R %*% b) %*% solve(R %*% V %*% t(R)) %*% R %*% b / 2

F
## [1,] 29.32826

1 - pf(F,2,1261)
## [1,] 3.550493e-13

如果說我們令虛無假設為

H0:βbe=βbw=βbill=βom=0

H0:Rβ=r,其中,
R=[01000001000001000001],β=[β0βbeβbwβbillβom],r=[0000]

Pizza <- read.csv("pizza_delivery.csv")
pizza.lm <- lm(time~branch+bill+operator,data=Pizza)
b <- pizza.lm$coefficients
V <- vcov(pizza.lm)
F <- t(b[2:5]) %*% solve(V[2:5,2:5]) %*% b[2:5] / 4

F
## [1,] 97.87125

1 - pf(F,4,1261)
## [1,] 0

代表我們可以拒絕虛無假設,其實際值小於

\verb|R| 的寬容值
2.2×1016
。一個簡單的計算方式是:

F=i=1n(y^iy¯)2/Ki=1n(yiy^i)2/(nK1)=SSESSR/(nK1)

可以看出

F 檢定統計量與
R2
有一定程度的(非線性)關係:
R2
越大,
F
檢定統計量也越大。而我們可以建構一個多元迴歸模型的 ANOVA(變異數分析)表進行計算分類後的資料是否能夠良好的詮釋模型。

Source SS df MS
ϕ
Factor SSR
k
MSR =
SSRk
ϕF=MSRMSE
Error SSE
nk1
MSE =
SSEnk1
Total SST
n1

其中檢定統計量

ϕF=MSRMSEF(1,n2)。而在
\verb|R|
中,我們可以用 anova() 進行變異數分析。

Pizza <- read.csv("pizza_delivery.csv")
anova(lm(time~branch,data=Pizza))

## Analysis of Variance Table
##
## Response: time
##       Df  Sum   Sq Mean Sq F value Pr(>F)
## branch 2 6334 3166.8 86.05 < 2.2e-16 ***
## Residuals 1263 46481 36.8
## ---
## Signif. codes:
## 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1

檢證誤差項服從常態分配的假設

我們前面都假設誤差項服從常態分配:如果不是服從常態分配的話,前面做的任何分析都是徒勞無功。而我們在看不到誤差項的情況之下,又要如何檢測其是否服從常態分配呢?由於我們已經知道

β^
β
的不偏估計式,而只要殘差與誤差項夠接近,就可以印證上述的假設為真。首先我們先將誤差項進行標準化,得到

εii.i.dN(0,σ2)

並由小排到大。如果我們有

n 個服從常態分配的殘差與
n
個經過標準化後服從常態分配的誤差項,分別將其畫在
x
軸與
y
軸,此兩者應該要分布在
45
線上,形成 QQPlot。[3]舉例來說,

X <- runif(1000)
Y <- 1 + X + 0.2 * rnorm(1000)
lm <- lm(Y~X)
plot(pizza.lm, which = 2)

如果誤差項不是服從常態分配,而是服從均勻分配的話,QQPlot 則會長得像下面那樣,並非在

45 線上。

X <- runif(1000)
Y <- 1 + X + 0.2 * runif(1000) - 0.5
lm <- lm(Y~X)
plot(pizza.lm, which = 2)

最後,我們可以畫出 pizza 中誤差項的 QQPlot。

pizza.lm <- lm(time~branch + bill + operator, data = pizza)
plot(pizza.lm, which = 2)

但是,如果誤差項真的不是服從常態分配,我們還能夠繼續進行上述的分析嗎?答案是可以的!事實上,利用漸進理論──只要樣本數夠大,我們還是能夠維持原本的假設。


  1. 當2個(或以上)的自變數互不獨立(即彼此相關),就是具有「線性重合」,將會使迴歸模型中存在著重複的自變數,提高某一自變數的解釋力與預測力,使得理論的建構不正確。 ↩︎

  2. 如果我們要解出

    Ax=b 的話,我們可以輸入 solve(A, b),便會算出
    x=A1b
    ;如果我們僅輸入 solve(A)
    R
    便會自動認定我們要計算
    Ax=I
    ,得到
    x=A1I=A1
    。當然,看到上面的計算過程,對於線性代數理解夠的人就可以知道, solve() 可以拿來取反矩陣(inverse matrix)。 ↩︎

  3. plot() 中的指令 which = 2 代表要畫出 QQPlot。 ↩︎