廣義線性混合模型(GLMM)

知識背景

廣義線性混合模型可以看做是廣義線性模型(GLM)以及線性混合模型(LMM)的擴展琴庵,為了更好地理解GLMM迷殿,肯定要對普通線性模型、廣義線性模型以及線性混合模型有個理解蚊夫。

  • 普通線性模型長大概這個樣子(以只有一個因變量舉例):
    y = \beta_0 +\beta_1 * x + ε
    Y=\mathbf X\beta + ε
    也就是固定效應+隨機誤差知纷,且因變量必須要滿足正態(tài)性导披、獨立性以及方差齊性撩匕。

  • 廣義線性模型(GLM)可以長這個樣子:
    log(\frac{P(y=1)}{1-P(y=1)})=\beta_0 + \beta_1 * x_1+ ε
    也可以長這個樣子:log(y) = \beta_0 + \beta_1 * x_1+ ε...
    也就是對因變量y進行了變換,使得變換后的值適用普通線性回歸模蜡。而GLM之所以稱為“廣義”忍疾,關鍵就在于這種變換——連接函數(shù)(就是上邊兩個等式左邊那一堆)谨朝,使得模型的應用范圍變得更寬,只要因變量服從指數(shù)分布就行则披;

  • 而線性混合模型(LMM)則形如(以矩陣形式表示):
    Y = \mathbf X\beta + \mathbf Z \gamma + ε

相較普通線性模型士复,LMM其實就是多了隨機效應\mathbf Z \gamma而已。

如何劃分固定效應和隨機效應便贵?
(1)固定效應的因子水平明確承璃,在抽樣數(shù)據(jù)集中包含其所有類別俏竞,通常是在實驗中加以控制的因素魂毁,例如組別。
(2)隨機效應的因子水平不清晰咬崔,在抽樣數(shù)據(jù)集中并不包含該自變量的所有情況烦秩,通常是實驗中無法控制的因素只祠,例如個體。

換句話說熊杨,以固定方式對因變量產(chǎn)生影響的因素為固定效應盗舰,相反钻趋,則為隨機效應。

  • 廣義線性混合模型

至此较沪,GLMM應該就好理解了尸曼,其實就是在等式左側(cè)對因變量進行變換,在等式右側(cè)將固定效應與隨機效應進行結合。但公式寫起來蠻復雜解幽,我就不列出來了烘苹。

示例

光說不練假把式镣衡,下面我們以縱向研究的宏基因組數(shù)據(jù)(分實驗組和對照組,且每一個個體在3個時間點采樣)為例來說明GLMM的具體應用:

假設你已經(jīng)獲得了物種豐度結果taxa.raw望浩,形如:

WX20201110-151431.png

以及樣本的各種信息sample.info磨德,形如:

WX20201110-151645.png
  • 步驟1:多濾掉低豐度數(shù)據(jù)
#過濾掉物種豐度為0的樣本數(shù)過多的行
> filter.index <- apply(taxa.raw, 1, function(X){sum(X>0)>0.1*length(X)})
> taxa.filter <- taxa.raw[filter.index, ]
#確保樣本豐度和相加為100
> taxa.filter <- 100*sweep(taxa.filter, 2, colSums(taxa.filter), FUN="/")
> taxa.data <- as.data.frame(t(taxa.filter))
  • 步驟2:創(chuàng)建協(xié)變量矩陣

我們可以用如下代碼為group典挑、time以及grouptime的交互項創(chuàng)建協(xié)變量矩陣:

> reg.cov <- tibble::rownames_to_column(sample.info, var = 'Sample') %>% 
           dplyr::select(Sample, group, indID, time) %>% 
           dplyr::mutate(time = ifelse(time == 'w0', 0, ifelse(time == 'w2', 1, ifelse(time == 'w4', 2,NA)))) %>%  #創(chuàng)建時間變量代碼:w0是0您觉,w2是1琳水,w4是2褒墨;
           dplyr::mutate(group = ifelse(group == 'ck', 0, 1)) %>%  #創(chuàng)建分組變量代碼:ck組為0郁妈,A組為1
           dplyr::mutate(timeXgroup = time*group) %>%   #創(chuàng)建時間與分組交互代碼
           dplyr::mutate(indID = as.character(indID)) %>% 
           as.data.frame
#過濾掉采樣不全的個體數(shù)據(jù)
> ind.count <- table(reg.cov$indID)
> reg.cov <- subset(reg.cov, indID %in% names(ind.count)[ind.count == 3])

> head(reg.cov)
  Sample group indID time timeXgroup
1   FN3T     1  A2-1    1          1
2   FN40     0  D2-4    0          0
3   FN42     1  A1-4    1          1
4   FN44     1  A1-5    0          0
5   FN45     1  A2-3    1          1
7   FN49     0  D2-2    1          0

  • 步驟3:擬合模型

先將w0和w1+w2的數(shù)據(jù)分別取出備用:

> reg.cov.w0 <- subset(reg.cov, time == 0)
> rownames(reg.cov.w0) <- reg.cov.w0$indID
> head(reg.cov.w0)
     Sample group indID time timeXgroup
D2-4   FN40     0  D2-4    0          0
A1-5   FN44     1  A1-5    0          0
D2-5   FN4D     0  D2-5    0          0
D1-2   FN54     0  D1-2    0          0
A1-4   FN5J     1  A1-4    0          0
A2-4   FN60     1  A2-4    0          0

> reg.cov.w12 <- subset(reg.cov, time != 0)
> reg.cov.w12 <- na.omit(data.frame(baseline.sample = reg.cov.w0[reg.cov.w12$indID, 'Sample'],
                 baseline.subject = reg.cov.w0[reg.cov.w12$indID, 'indID'],
                 reg.cov.w12,
                 stringsAsFactors = F))
> head(reg.cov.w12)
  baseline.sample baseline.subject Sample group indID time timeXgroup
1            FN70             A2-1   FN3T     1  A2-1    1          1
3            FN5J             A1-4   FN42     1  A1-4    1          1
5            FN68             A2-3   FN45     1  A2-3    1          1
7            FN71             D2-2   FN49     0  D2-2    1          0
8            FN54             D1-2   FN4A     0  D1-2    2          0
9            FN6T             D1-5   FN4B     0  D1-5    1          0

然后單獨為每一個物種進行擬合(為了便于說明顾彰,此處我們僅以其中一個物種豐度舉例:

library(dplyr)
library(nlme)

> taxa.all <- colnames(taxa.data)
> p.taxa.list.lme <- list()
> spe <- taxa.all[9]
> spe
[1] "s__Bacteroides_vulgatus"

> X <- data.frame(Baseline = taxa.data[reg.cov.w12$baseline.sample, spe]/100,
                  reg.cov.w12[, c('time', 'group')])
> rownames(X) <- reg.cov.w12$Sample
> head(X)
         Baseline time group
FN3T 0.0004122127    1     1
FN42 0.0001939168    1     1
FN45 0.0026208886    1     1
FN49 0.0003091166    1     0
FN4A 0.0007188949    2     0
FN4B 0.0005986076    1     0

> Z <- X
> subject.ind <- reg.cov.w12$indID
> time.ind <- reg.cov.w12$time
> Y <- taxa.data[reg.cov.w12$Sample, spe]/100
> cat('Zeros/All',sum(Y==0),'/',length(Y),'\n')
Zeros/All 0 / 30 

#對Y進行變換(先開方在反正弦涨享?)
> tdata <- data.frame(Y.tran = asin(sqrt(Y)), X, SID = subject.ind)
> head(tdata)
         Y.tran     Baseline time group  SID
FN3T 0.04531814 0.0004122127    1     1 A2-1
FN42 0.05269246 0.0001939168    1     1 A1-4
FN45 0.01527299 0.0026208886    1     1 A2-3
FN49 0.02599619 0.0003091166    1     0 D2-2
FN4A 0.01817293 0.0007188949    2     0 D1-2
FN4B 0.03147346 0.0005986076    1     0 D1-5
#進行擬合(以Baseline厕隧、time以及group為固定效應,以SID為隨機效應)
> lme.fit <- try(lme(Y.tran ~ Baseline + time + group, random = ~1|SID, data = tdata))

隨機效應的表達方式:
(1)1|SIDSID是隨機截距髓迎,Baseline建丧、 time翎朱、group是固定斜率,也就是他們前面的參數(shù)是固定的拴曲;
(2)0 + time|SIDSID是固定截距争舞,time是隨機斜率,Baselinetime是固定斜率;
(3)1 + time|SIDSID是隨機截距疗韵,time是隨機斜率兑障,Baselinetime是固定斜率;

> summary(lme.fit)
...
Random effects:
 Formula: ~1 | SID
        (Intercept)    Residual
StdDev: 0.007468231 0.009009141

Fixed effects: Y.tran ~ Baseline + time + group 
                 Value Std.Error DF   t-value p-value
(Intercept)  0.0236327 0.0060813 14  3.886108  0.0016
Baseline    -1.2738533 1.3537572 12 -0.940976  0.3653
time         0.0023881 0.0032897 14  0.725932  0.4798
group        0.0016992 0.0053765 12  0.316037  0.7574
...

這樣我們就得到了每個自變量的參數(shù),以及P值蕉汪,后續(xù)我們再使用多重檢驗矯正就可以得到矯正后的P值了流译。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末者疤,一起剝皮案震驚了整個濱河市福澡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驹马,老刑警劉巖革砸,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異糯累,居然都是意外死亡算利,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門泳姐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來效拭,“玉大人,你說我怎么就攤上這事《谢迹” “怎么了慕的?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挤渔。 經(jīng)常有香客問我肮街,道長,這世上最難降的妖魔是什么判导? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任嫉父,我火速辦了婚禮,結果婚禮上眼刃,老公的妹妹穿的比我還像新娘熔号。我一直安慰自己,他們只是感情好鸟整,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著朦蕴,像睡著了一般篮条。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吩抓,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天涉茧,我揣著相機與錄音,去河邊找鬼疹娶。 笑死伴栓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的雨饺。 我是一名探鬼主播钳垮,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼额港!你這毒婦竟也來了饺窿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤移斩,失蹤者是張志新(化名)和其女友劉穎肚医,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體向瓷,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡肠套,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猖任。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片你稚。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出入宦,到底是詐尸還是另有隱情哺徊,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布乾闰,位于F島的核電站落追,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涯肩。R本人自食惡果不足惜轿钠,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望病苗。 院中可真熱鬧疗垛,春花似錦、人聲如沸硫朦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咬展。三九已至泽裳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間破婆,已是汗流浹背涮总。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祷舀,地道東北人瀑梗。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像裳扯,于是被迫代替她去往敵國和親抛丽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容