艱難掙扎三個月,終於把論文修改完了。應審稿人要求畫了各種各樣的圖,,現總結一下新用到的幾個根據線性混合效應模型結果作圖的代碼(參考Fleur et al., 2021文章中提供的代碼),包括一些細節的設置字體,設置置信區間等等,以備日後不時之需。
假設數據是從一個腦電實驗中採集到的,抽取6個被試的數據,因變量為ERP,自變量為兩個分類變量context type和consistency。
第一步:建模
首先構建線性混合效應模型,因為自變量均為分類變量,為方便模型回歸係數的解讀,在建模之前對自變量編碼(sum coding):
contrasts(demo$consistency) <- c(-0.5,0.5)
contrasts(demo$type) <- c(-0.5,0.5)
此處省略模型比較過程,假設最終模型為:
lm_demo <- lmer(ERP~type*consistency+(1|Filename)+(1|item),data = demo,REML = FALSE)
summary(lm_demo)
**summary結果可以看出主交互效應均不顯著,因此交互效應此時不應該分解,但為了畫圖就先強行分解了
第二步:分解交互作用
emm1 <- emmeans(lm_demo, "consistency" , by= c("type"),lmer.df = "satterthwaite", adjust = "none")
marg1 <- as.data.frame(emmeans(lm_demo, "consistency" , by= c("type")))
這裡生成的marg1其實是交互作用分解後的簡單效應:
其中lower.CL和upper.CL就是95%置信區間,可以看出四個置信區間都由負到正包括0,再次證明都不顯著。
Anyway,
繼續做比較:
cont1 <- as.data.frame(contrast(emm1, "tukey"))
這裡就是比較「正常」的交互分解後的結果了,體現為在不同語境類型下,一致條件和不一致條件的差別。
第三步:開始作圖
我們想畫一個不同語境下的一致性效應圖(即不同語境下,不一致和一致條件的差別),需要用到cont1數據表。
p1 <- ggplot(cont1, aes(type, estimate)) + #縱坐標為不一致減一致的參數值beta
geom_point(size = 3)+ # 圖表類型為點圖
#下面開始加置信區間
geom_hline(yintercept=0, linetype="dashed", color = "grey") + #置信區間類型為豎線
geom_errorbar(aes(ymin=estimate-1.96*SE, ymax=estimate+1.96*SE), width=.1)
# 使用置信區間計算公式
p1
No offense,但在其他參數默認情況下這個圖太醜了.
來美化一下~
1. 坐標軸
首先這個x軸y軸都應該改個名字,並且加粗(如果想給自變量兩個水平改名字也是可行的);
其次,由於置信區間過大,導致整條線上頂天下頂地的,可以把Y軸坐標範圍擴大一些。
p2 <- p1+
scale_x_discrete(name="type", labels=c("causal"="Causal", "indicative"="Indicative")) +
scale_y_reverse(name=expression(paste("Voltage (",mu,"V)")), limits = c(5, -5))
+ #y_reverse是將正負顛倒(符合ERP數據匯報的習慣),limites設置刻度範圍
theme(axis.text.x = element_text(face = "bold"),
axis.text.y = element_text(face = "bold")) # 字體加粗
稍微好一些,但是坐標軸字體太小了,而且習慣上一般將英文使用字體設置為Times New Roman
2.字體字號
可以先查看一下系統默認字體都有哪些
輸入 windowsFonts()
第一個就是Times New Roman,但注意代碼裡不能直接寫Times New Roman,應該寫上面的代號serif(花了好幾天才發現.)
p3 <- p2+
theme(text=element_text(family="serif", size=22))
p3
R語言ggplot默認做出來的圖是有灰色背景的,這個也可以去掉,還可以加上框線
3.背景
把背景顏色取消和加框線很簡單,但是注意運行theme_bw()可能會使對字體字號的設置恢復默認,需要重新運行一下上面的代碼,或者直接將這一行加到上面的代碼中去:
p4 <- p3+theme_bw()+
theme(panel.border=element_rect(fill=NA,color="black", size=1.2, linetype="solid")) #theme()這裡是設置框線的顏色,類型,粗細
這樣這個圖就比較美觀啦~
參考文獻:
Fleur, D. S., Flecken, M., Rommers, J., & Nieuwland, M. S. (2020). Definitely saw it coming? The dual nature of the pre-nominal prediction effect. Cognition, 204, 104335.