標題:A Very Basic Tutorial for Performing Linear Mixed Effects Analyses (Tutorial 2)
作者:Winter (加州大學美熹德分校,美國加利福尼亞美熹德)
年份:2013 年
這篇教學文章用簡單易懂的文字告訴我們什麼是線性混和效應模型 (linear mixed-effects model)、其中包含的元素和意義是什麼,以及它的用途,並實際以 R 語言操作,具體呈現教學內容。
※ 可以善用目錄跳到想了解的地方喔。
假設有個實驗是測量「attitude (態度):pol (禮貌) / inf (非正式)」 會不會影響說話的「frequency (音頻)」,線性模型的呈現:
frequency ~ attitude + ε
attitude 是固定因子 (fixed factor)、ε 是隨機因子 (random factor,包含各種除了固定因子外,可能影響音頻結果的因素)。
如果除了之外,還想要多看 gender (性別) 會不會影響 frequency,模型呈現:
frequency ~ attitude + gender + ε
線性回歸概念請參考:線性回歸幼幼班
線性模型包含:
自變數是我們操控的,應變數根據自變數而有不同變化,但隨機因子不受我們控制,我們不喜歡,沒安全感。
所以線性混和效應模型 (linear mixed-effects model) 為此而生,它混合了固定因子 (fixed factor) 和能讓我們指定的隨機因子 (random factor),滿足掌權感。因為混和了固定因子和隨機因子,所以稱為「混和」模型。
先來想一個問題:在看到可愛的狗勾時,多數人會提高說話的音頻,但每個人的音頻都一樣嗎?
Nope.
每個人天生的音頻不同,就算在某些情況下大多數人會提高/降低音頻,但還是存在個體差異 (individual differences)。
套用回來這裡的例子,用不同態度 (attitude) 時,每個人的音頻 (frequency) 可能有大致相同的變化 (變高/變低),但仍存在差異。
圖一中 x 軸呈現的是每一位受試者,F 代表女生 (female),M (male) 代表男生。y 軸呈現每位受試者的平均音頻 (也就是不論是何種態度)。
可以發現女生的平均音頻都比男生高,而在女生和男生各自的類別中,也有音頻較高和較低者。
所以 subject (受試者) 存在著會影響到模型的不可控因素 (個體差異),於是我們把 subject 放入隨機因子,讓電腦知道我們要把這個變數納入考量。
frequency ~ attitude + gender + (1 | subject) + ε
(1 | subject) 的意思是,請電腦預設每位 subject 的起始值不同,有人天生音頻高,有人天生低。這個起始值通常稱為截距 (intercept),在模型中以 1 表示。
截距的較詳細敘述:線性回歸幼幼班
接著,假設實驗人員準備了七種 scenario (情境),例如:
諸如此類。
圖二的 x 軸代表 7 個不同的題目,y 軸代表每個題目的平均音頻,這個平均來自 16 位受試者的答覆。
可以發現每個題目的平均音頻差距不大,但還是有些微差異,所以要做跟前面一樣的事情,在模型上加上「scenario」這個變數,告訴電腦我們也要把這個無法控制的因素納入考量。
frequency ~ attitude + gender + (1 | subject) + (1 | scenario) + ε
介紹完概念,接下來要實作了!
想使用這麼方便簡易的線性混和效應模型 (linear mixed-effects model),首先要安裝並載入它的套件
install.packages(“lme4”)
library(lme4)
為使實作更方便,作者提供了他們的檔案,有兩種下載方式:
politeness = read.csv("http://www.bodowinter.com/tutorial/politeness_data.csv")
然後在 R 輸入
politeness = read.csv(file.choose( ))
這樣就會得到一份叫做 politeness 的資料。
可以檢查一下有沒有丟失的資料
which(is.na(politeness$frequency))
或
which(!complete.cases(politeness))
哈!然後就會發現在第 39 列有丟失的資料,不過在線性混和效應模型中,稍微有一些丟失資料不會產生太大影響。
介紹一下檔案,共有五欄:
可以視覺化這些資料,方便觀察分布情況
boxplot(frequency ~ attitude*gender, col = c("white","lightgray"), politeness)
無論是 pol 還是 inf,女性音頻都比男性高;女性這組中 (左邊兩個盒狀圖),inf 音頻較高,男性這組 (右邊兩個盒狀圖) 也有類似模式,但差距比女性組小。
進入正題啦!
politeness.model <- lmer(frequency ~ attitude, data = politeness)
用 lmer( ) 函數建構模型,frequency 為應變數,attitude 為自變數,並告訴 R 要使用的資料是剛才載入的 politeness。
作者很幽默,他說在執行後會發現錯誤
Error in mkReTrms(findbars(RHSForm(formula)), fr) :No random effects terms specified in formula
要提醒大家,這個模型需要隨機因子!
應該將我們剛才討論到的 subject 跟 item 列入隨機因子,然後用 summary( ) 來看結果 (見圖四)
politeness.model <- lmer(frequency ~ attitude + (1|subject) + (1|scenario), data = politeness)
summary(politeness.model)
先看隨機因子:
這裡可以看到 scenario 跟 subject 的變異程度,後者變異程度比前者大很多,符合圖一跟圖二的討論。
接著發現多出一個奇怪的東西:Residual (殘差)。
可以影響音頻的因素,不可能只有人 (subject) 和情境 (scenario),同意嗎?
所以 residual 才存在,他代表的是除了我們選定的兩個隨機因子外,會影響音頻的其他不知名因素,也就是前面一直看到的 ε。
接著看固定因子:
attitudepol 是 attitude + pol。
你可能會想,那不是應該還要有一個 attitudeinf (attitude + inf) 嗎?其實 attitudepol 的 Estimate (-19.695) 隱藏了一個訊息:從 attitudeinf 到 attitudepol 要減掉 -19.695 Hz。
fixed effects 的結果呈現方式是這樣的,依據 A~Z,看哪一個 level (水準,比如這裡的 pol 跟 inf) 的開頭字母比較前面,就以他為基準,呈現另一個水準與它的差距。
以這裡為例, i 比 p 前面,所以以 inf 為基準,呈現 pol 與 inf 的差距。
那 Intercept 的奇怪數字 202.588 是怎麼來的?
它其實是 attitudeinf 情況下的男女平均。我們沒有告訴模型這裡有兩個性別,所以就被合在一起看了,但這樣其實不太合理。
修改一下模型,把 gender (性別) 也納入自變數 (我們清楚知道它如何影響音頻)
politeness.model <- lmer(frequency ~ attitude + gender + (1|subject) + (1|scenario), data = politeness)
summary(politeness.model)
隨機因子的結果變這樣:
subject 的變異程度變小了!
之前還沒指出 gender 對 frequency 也有影響時,女性跟男性的資料被拉在一起看,所以產生很大的變異程度。
現在把 gender 列入自變數,區分女性和男性 (gender 的兩個水準),gender 就不再是未知的變數,就不會跑到隨機因子的 subject 增加變異程度。
固定因子結果:
現在你應該會了。
genderM 的 Estimate (-108.517) 代表以 genderF 為基準,減掉 108.517 就會是 genderM 的平均。男生音頻較低,沒毛病。
而現在的 Intercept 比起圖六變高了,這是因為現在的 Intercept 是 genderF 在 attitudeinf 情況下的音頻平均。
做統計時常常需要參考的 p 值,用線性混和模型效應來做很直觀也很容易。
這裡用來取得 p 值的方法是 Likelihood ratio test (LRT,似然比檢驗)。
有點抽象吧,作者提供了一個例子:
假設今天要去爬山,你揹了一桶水 (gallon of water,自變數) 跟一個手電筒 (flashlight,自變數),想知道哪個東西會影響你的速度 (hiking speed,應變數)。
你的做法是先把 flashlight 拿掉然後爬一段路,結果發現 hiking speed 沒什麼變化;接著你把 flashlight 撿回來,把 gallon of water 丟掉,發現 hiking speed 明顯被影響了 (這裡先不談變快還是變慢,著重在「有影響」)!
結論:帶著 gallon of water 爬山會影響 hiking speed;帶著 flashlight 則不會。
把這個故事建構成模型,檢驗 gallon of water 會不會影響 hiking speed:
model1 = hiking speed ~ gallon of water + flashlight
model2 = hiking speed ~ flashlight
假設 model1 跟 model2 的比較有顯著效果,代表 gallon of water 對 hiking speed 有影響。
檢驗 flashligh 會不會影響 hiking speed:
model1 = hiking speed ~ gallon of water + flashlight
model3 = hiking speed ~ gallon of water
假設 model1 跟 model3 的比較沒有顯著效果,代表 flashlight 對 hiking speed 沒有影響。
model1 就是完全模型 (full model),包含想看的自變數;model2 和 model3 則是虛無模型 (null model),不包含想看的自變數。可以用式子相減的概念來看模型比較,就會知道現在是要看哪個自變數對應變數的影響。
現在可以回到 frequency 的例子建構模型了!
politeness.model <- lmer(frequency ~ attitude + gender + (1|subject) + (1|scenario), data=politeness, REML=FALSE)
politeness.null <- lmer(frequency ~ gender + (1|subject) + (1|scenario), data=politeness, REML=FALSE)
把兩個模型相減一下,可以知道現在想看的是 attitude 會不會影響 frequency。
另外出現了一個沒看過的東西:REML=FALSE。這裡不多加解釋,只要在做 LRT 時記得放入就可以。
接著,比較兩個模型的方式是用 anova( )
anova(politeness.null,politeness.model)
太棒了,終於得到結果了!
看到 p < .001 (0.0006532),有顯著效果,可以知道 attitude 對 frequency 有影響。
... attitude affected frequency (χ2 (1) = 11.62, p < .001) ...
1 是結果表中的 Df,11.62 是 Chisq。
除了上面提到單一變數的效果,有時也會發生雖然某一自變數影響了應變數,但會根據另一自變數有不同的影響情況。
舉例來說,我們知道 attitude (pol / inf) 會影響 frequecy,但這個影響可能會因為 gender (F / M) 而不同。
比如女性在 pol 跟 inf 情況下的音頻變化與男性相反:
或 attitude 的影響力在男女中不同:
這就是 attitude 跟 gender 有交互作用的情況。
模型中標示交互作用的符號是「*」。
可以比較這兩個模型
politeness.interact <- lmer(frequency ~ attitude*gender + (1|subject) + (1|scenario), data=politeness, REML=FALSE)
politeness.reduced <- lmer(frequency ~ attitude + gender + (1|subject) + (1|scenario), data=politeness, REML=FALSE)
如果結果有顯著效果,則 attitude 跟 gender 有交互作用。
在「隨機因子」段落提到,每位受試者天生的音頻就不同、每個題目蒐集到的音頻基準也不同,所以我們在模型中指定了 subject 跟 item 為隨機因子。
這樣的指定下,模型會針對每位受試者和題目產生不一樣的 intercept (截距),所以是一個隨機截距模型 (random intercept model)。
但是,固定因子 (attitude) 對每位受試者產生的效果可能也不同;同理,對每一題的影響也不見得相同。
我試著用線性回歸畫了一張綜合圖,每個灰色框格是一位受試者的資料,粉色線是 inf 情況、藍色線是 pol 情況。x 軸是 scenario、y 軸是 frequency。
很明顯可以看到每位受試者在相同題目的表現不同,因此線產生不同 slope (斜率)。
將 x 軸換成 subject、y 軸一樣是 frequency。
同樣可以發現每個題目在相同受試者的情況下,也會得到不同音頻 (雖然趨勢看起來很相近,但要注意 y 軸數值的變化),線產生不同 slope。
所以,每位受試者和每個題目不只可以有不同的 intercept,還可以有不同的 slope。每個人或每個題目都有自己專屬的線來代表他的數據。而這樣的差異是經過 attitude (pol / inf) 的測試得到的,所以現在可以修改一下之前的模型
politeness.model = lmer(frequency ~ attitude + gender + (1+attitude|subject) + (1+attitude|scenario), data=politeness,REML=FALSE)
隨機因子中,在 intercept (1) 的後面加上 slope (attitude)。
取 (1+attitude|subject) 來說明,這裡代表我們允許每位受試者有不同的 intercept 和不同的 slope。
以我的話來說,就是每個人都可以有不同的起始值,也可以對相同情境有不同反應。
真正在自己的實驗中就會發現事情沒有這麼美好,想要指定全部的隨機截距跟隨機斜率時,模型常常會收斂失敗。
這裡作者給的建議是:在模型可以建構成功的情況下,盡量保持模型最複雜化。
例如先把想指定的都指定上去,看看會不會成功。如果不行的話,試著先拿掉一個東西,像是一個斜率,然後再嘗試看看,試到成功為止。
Yaaay,終於寫完了。
這篇文章從一月寫到現在,中間因為遇到不懂的概念,所以又跑去學別的東西。寫的過程中一直在釐清之前未曾發現過的問題,還有思考怎麼呈現才會比較簡單易懂。
總之,自己仔仔細細的順過一遍,感覺很好!
如果有哪裡觀念錯了,也歡迎大家告訴我這個統計小白。
最後,開發 R 跟 lme4 package 的人或團隊都很辛苦,所以別忘記,如果在資料分析過程中有使用到這些資源,要提到他們一下喔。
可以用下面的方式找到該引用誰:
R
citation()
我的是這個
R Core Team (2023). _R: A Language and Environment for Statistical Computing_. R
Foundation for Statistical Computing, Vienna, Austria. <https://www.R-project.org/>.
lme4 package
citation("lme4")
我的是這個
Douglas Bates, Martin Maechler, Ben Bolker, Steve Walker (2015). Fitting Linear
Mixed-Effects Models Using lme4. Journal of Statistical Software, 67(1), 1-48.
doi:10.18637/jss.v067.i01.